论坛元老
 
- 积分
- 4510
- 金钱
- 4510
- 注册时间
- 2018-5-11
- 在线时间
- 944 小时
|
发表于 2018-6-16 10:34:48
|
显示全部楼层
/*注意设置了两个中断,即溢出中断和捕获中断):
//1、先看捕获中断,Rmtsta刚开始时为0,当发生一次上升沿捕获时(RDATA对应的引脚得到一个高电平),
马上把捕获事件配置为下降沿捕获,然后Rmtsta=0x10,标记了上升沿已经被捕获;
//2、当有下降沿到来时,将CCR1寄存器的值赋给Dval变量,并再将捕获事件配置为上升沿捕获;(先上再下为一对,计算间隔时间)
补充:像这样上升沿捕获和下降沿捕获交替使用,是为了捕获到高电平的持续时间(即保存在Dval的值)。
//3、注意:只有当接收头收到了引导码后,才进行解码。
故先判断Dval的值是不是在4200us~4700us之间,如果是,就将Rmtsta的最高位置1(Rmtsta|=1<<7),标记成功接收到了引导码。
//4、 当Rmtsta的最高位被置为1后,即满足了if(Rmtsta&0x80),就可以判断Dval的值在下面3种范围内了:
300~800(560us)、1400~1800(1680us)、2200~2600(2500us)。
从而得到0或者1或者RmtCnt++。 实现了解码。
//4、以上3条,其中的高电平持续时间都小于10ms,意思就是还没到10ms就产生了捕获中断(上升沿和下降沿),
因为优先级相同的原因,这时是无法产生溢出中断的。
只有当超过10ms了,还没有产生上升沿捕获或下降沿捕获,就会产生溢出中断。
//5、 那什么情况下10ms都没有产生捕获呢,那就是连发码,那个97.94ms的高电平,远大于了10ms,故会产生溢出中断。
在溢出中断里会标记已经完成一次完整的键值信息采集(RmtSta|=1<<6),正点原子在溢出中断中给设的连发码时间为130ms,
超过130ms视为是松开按键了(因为松开按键就不会有脉冲,也是长期高电平持续,看上文)。
//此外,处理红外键盘的程序就很简单了,先判断是不是得到所有一个键的所有信息了(根据上一条,判断if(RmtSta&(1<<6))是否成立),
然后通过移位读取之前在捕获中断中存进去的数据,再进行原码和反码的对比。这里不多说了。。 |
|