打印

计时器问题

[复制链接]
985|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dfsa|  楼主 | 2013-2-20 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void SysTick_Handler(void)   /* 定时处理函数 */
{   
if(SysTick_CTRL & 0x10000)       /* 定时时间到  */
  {
if((++sec & 0xf) >= 0xa) sec += 6; /* 2-10进制调整 */

  if(sec >= 0x60) sec = 0;         /* 60s时间到 */
  }  
}
程序里面的0xf与0xa代表的是什么意思?2-10进制调整是如何进行的?

相关帖子

沙发
xsgy123| | 2013-2-20 09:34 | 只看该作者
编写代码时,函数命名最好使用全小写,不要使用这种花哨的匈牙利命名法

使用特权

评论回复
板凳
秋天落叶| | 2013-2-20 09:43 | 只看该作者
if((++sec & 0xf) >= 0xa)
首先sec是8位变量,使用位与操作把高4位消除,只留下低4位,即最大值为15,0x0a是二进制的10,这句代码的意思就是当sec的累加达到10时,自动+6补足进位,所以才有后面的0x60被认为是60秒。
这里面的操作主要是针对16进制和10进制的相互转换

使用特权

评论回复
地板
baidudz| | 2013-2-20 09:54 | 只看该作者
不是要搞复杂,是要做 BCD 码转换。也就是说,如果将一个数的 16 进制字符串输出,就与预期的 10 十进制数据形式相同。BCD 码是“二进制编码的十进制数”的英文缩写。

例如,十进制数 10 在底层存储器中保存为 0x10,也就是 16。余类推。这样做的好处是,输出或显示的字符转换更容易。许多时钟系统都约定,时、分、秒的值采用 BCD 码。

为了实现普通数值向 BCD 码的转换,最简单的办法就是逢 10 加 6(10 进制与 16 进制的进位数值之差)。

很显然,所谓 60 秒也表示为 0x60,即 96。

下面给出新的注释和一点修改:

void SysTick_Handler(void)   /* 定时处理函数 */
{   
   if(SysTick_CTRL & 0x10000)       /* 定时时间到  */
   {
     if((++sec & 0xf) >= 0xa) sec += 6; /* BCD 码转换,如果个位超过 10 则加 6 进位 */

    //if(sec >= 0x60) sec = 0;         /* 60s时间到 */
     if(sec >= 0x60) sec &= 0xf;        /* 这里需要改进 */
   }  
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

2404

帖子

2

粉丝