查看: 4316|回复: 11

[教程] 工作过程是什么样子的啊??

[复制链接]
  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-5-8 23:15:54 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 ┗SKY┛ 于 2013-5-8 23:32 编辑
    1. #include "include.h"
    2. unsigned char const MONTH_Table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    3. unsigned char Time[7]={13,2,1,16,13,0,0};

    4. void TA_Init()
    5. {
    6.   BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZ
    7.   TACTL |= TASSEL_0 + MC_1+TACLR;
    8.   CCTL0 = CCIE;                       // CCR0 interrupt enabled
    9.   TACCR0 = 12000;
    10. }
    11.   
    12. void Clock_OnTimer()
    13. {
    14.   unsigned char Days;
    15.   
    16.   DSEC++;
    17.   if(DSEC  >=16)  {SECOND++;DSEC=0;}   //1秒一次
    18.   
    19.   if(SECOND>=60) {MINUTE++;SECOND=0;}  //60秒一次
    20.   if(MINUTE>=60) {HOUR++;MINUTE=0;}    //60分一次
    21.   if(HOUR  >=24) {DATE++;HOUR=0;}      //24小时一次

    22.   
    23.   
    24.   if(MONTH==2)                         //处理润年2月份问题
    25.   {
    26.     if(YEAR%4==0)   Days=29;           //逢4润
    27.     else            Days=28;
    28.     if(YEAR%400==0) Days=28;           //逢400不润
    29.   }   
    30.   else
    31.     Days=MONTH_Table[MONTH-1]; //正常月份,查表得到当月天数

    32.   if(DATE  >Days) {MONTH++;DATE=1;}  //一个月一次
    33.   if(MONTH >12)   {YEAR++;MONTH=1;}  //一年一次
    34.   if(YEAR>=100)    {YEAR=0;}         //100年一次
    35.   
    36.   
    37.   LCD_Disp_BNum(6,1,HOUR/10);
    38.   LCD_Disp_BNum(21,1,HOUR%10);
    39.   LCD_Disp_BNum(48,1,MINUTE/10);
    40.   LCD_Disp_BNum(63,1,MINUTE%10);
    41.   LCD_Disp_Num(72,0,SECOND/10);
    42.   LCD_Disp_Num(78,0,SECOND%10);

    43.   if((DSEC/8)%2==0){LCD_Disp_clkdot();} //0.5秒一次,间隔点闪烁
    44.   else {LCD_Disp_clkdot_blank();}
    45.         
    46.   if(SECOND%10==0)
    47.   {
    48.    
    49.     lcd_write_stringxy(18,5," 20  -  -    ");
    50.     LCD_Disp_Num(36,5,YEAR/10);
    51.     LCD_Disp_Num(42,5,YEAR%10);
    52.     LCD_Disp_Num(54,5,MONTH/10);
    53.     LCD_Disp_Num(60,5,MONTH%10);
    54.     LCD_Disp_Num(72,5,DATE/10);
    55.     LCD_Disp_Num(78,5,DATE%10);
    56.     lcd_write_stringxy(0,0,"      ");}
    57.    
    58.   else if(SECOND%5==0)
    59.     {
    60.       lcd_write_stringxy(18,5,"hello world!");
    61. //      switch weekday
    62.       lcd_write_stringxy(0,0,"Sunday");
    63.     }  
    64.   
    65.   
    66. }
    67.   
    68. // Timer A0 interrupt service routine
    69. #pragma vector=TIMER0_A0_VECTOR//G2452
    70. //#pragma vector=TIMERA0_VECTOR//G2231
    71. __interrupt void Timer_A (void)//1/32秒一次中断(由Timer_A所产生)
    72. {
    73.   __low_power_mode_off_on_exit();    //唤醒CPU

    74.   P1OUT ^= BIT6;
    75. }

    76.   
    77.   
    复制代码
    1. #include "include.h"
    2. void io_initial(void)
    3. {
    4.   P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;
    5.   P2DIR |= BIT0;
    6.   P1OUT &= ~BIT5;
    7. }

    8. void board_initial(void)
    9. {
    10.   io_initial();      
    11.   lcd_init();
    12.   TA_Init();
    13.   _EINT();
    14. }

    15. int main( void )
    16. {
    17.   WDTCTL = WDTPW + WDTHOLD;
    18.   board_initial();
    19.   while(1)
    20.   {
    21. Clock_OnTimer();
    22.   }
    23. }
    复制代码
    在main()中的while(1)中,一直执行的是Clock_OnTimer();但是不明白Clock_OnTimer();是怎么工作的,难道是一直都在执行那个DSEC++;   但是结果是正确的, 已经下载到了板子上了。不知道计时器是怎么工作的,求大神解释
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-7-7 05:53
  • 签到天数: 550 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-5-9 00:51:41 | 显示全部楼层
    DSEC自加后,还要做下面的判断,每16个DESC,SECOND自加,再一步一步往上累加时间。100年一个循环。然后在LCD上显示出来。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-5-9 10:22:59 | 显示全部楼层
    kittka 发表于 2013-5-9 00:51
    DSEC自加后,还要做下面的判断,每16个DESC,SECOND自加,再一步一步往上累加时间。100年一个循环。然后在L ...

    想知道的是DSEC是怎么确定执行并增加的   ,就是上次执行DSEC++;和下次执行之间的时间段不知道是怎么工作的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-5-9 10:26:57 | 显示全部楼层
    tingting 发表于 2013-5-9 09:02
    我呢就路过了

    {:2_25:}
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-5-9 11:13:11 | 显示全部楼层
    kittka 发表于 2013-5-9 00:51
    DSEC自加后,还要做下面的判断,每16个DESC,SECOND自加,再一步一步往上累加时间。100年一个循环。然后在L ...

    问一下,是不是,这个中断执行一次,cpu被唤醒,while(1)就开始执行啊??执行结束接着休眠??

    #pragma vector=TIMER0_A0_VECTOR//G2452
    //#pragma vector=TIMERA0_VECTOR//G2231
    __interrupt void Timer_A (void)//1/32秒一次中断(由Timer_A所产生)
    {
      __low_power_mode_off_on_exit();    //唤醒CPU

      P1OUT ^= BIT6;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-7-7 05:53
  • 签到天数: 550 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-5-9 19:21:48 | 显示全部楼层
    ┗SKY┛ 发表于 2013-5-9 11:13
    问一下,是不是,这个中断执行一次,cpu被唤醒,while(1)就开始执行啊??执行结束接着休眠??

    #prag ...

    我的理解是程序一直在走,CPU被唤醒,只是时钟源不一样。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2016-12-14 10:39
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-5-9 19:32:18 | 显示全部楼层
    自我感觉这个函数应该放在中断里,但中断是1/32s执行一次,差了一半的时间。中断里的p1.6口取反是干什么,控制灯吗,不过根据p1.6口的频率进Clock_OnTimer();刚刚是1秒。while(1)是自己不会进入低功耗的,你要在里面写个进入低功耗的控制语句,确定没少东西吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-5-9 19:58:32 | 显示全部楼层
    清贫篱下 发表于 2013-5-9 19:32
    自我感觉这个函数应该放在中断里,但中断是1/32s执行一次,差了一半的时间。中断里的p1.6口取反是干什么, ...

    TACC0=12000;是我修改的,中断取反是检查中断是不是执行,的确是控制灯的   就是检测作用。while(1)里面有个低功耗LPM3;但是开了低功耗,显示就没了,所以我删了。

    我现在不明白的是  那个一秒钟的定时是怎么实现的???刚有时间弄这个东西,学的不太好。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-5-9 20:00:05 | 显示全部楼层
    清贫篱下 发表于 2013-5-9 19:32
    自我感觉这个函数应该放在中断里,但中断是1/32s执行一次,差了一半的时间。中断里的p1.6口取反是干什么, ...

    就是那个1秒钟是怎么计算的   DSEC*16=1S吗??DSEC又是怎么确定的??
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2016-12-14 10:39
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-5-10 23:20:45 | 显示全部楼层
    ┗SKY┛ 发表于 2013-5-9 20:00
    就是那个1秒钟是怎么计算的   DSEC*16=1S吗??DSEC又是怎么确定的??

    如果这样是正确的话,我真不知道怎么个原理。抱歉了,方便的话,把能正确运行的程序发给我。我是群里的紫靛剑。按你程序上timer_A初始化的注释应该是1秒进一次中断的,灯的闪烁是这样的吗。如果按kittka说的,时钟源不一样的话,那主时钟也太慢了吧。那显示的时间秒走的正确吗。按说进入LPM3应该不影响屏的显示的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-20 16:21 , Processed in 0.194163 second(s), 32 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.