蓝桥杯国赛——第二站
作者:互联网
探究:
*长短按识别;
*RTC掉电运行;//*似乎没有外部32.768KHz的晶振、纽扣电池使得掉电运行,至于有没有超级电容,就不知道了。
*设置闹钟;
*Tim波形精准测定;
*value-1——value跳变瞬间的变化;
长短按识别:
说明:
1.不能使用delay,这样会占用cpu资源,使得其他外设工作变慢;
2.长短按有以下实现结果,
****一种是按下即显现短按的结果,如果迅速松手,则保持短按不变;
如果持续按下,松手后(或者不用松手)由短按跳转到长按的显示结果;
start->short->select one appropriate phenomenon to replace
****另一种是长短按的显示结果都不即时显现,比如设定长按为持续200ms及以上,那么200ms之后根据感应显示长、短按的结果
start->200ms'delay'->select one appropriate phenomenon to replace
****还有一种是短按即时显示短按的结果,但是长按,不会出现短按的显示结果,直接显示长按的显示(不管长按有没有松手让按键弹开)。但是这样的话,短按肯定是有延时的,也就是按下弹出的动作出现后,才会有短按的显示结果。
本次考虑第三种,也应该是最合乎常理的逻辑。
start->(eject or 200ms"delay")->select one appropriate phenomenon to replace
void Key_Proc(void) { if((uwTick - uwTick_Key)<100) return; uwTick_Key = uwTick; uint8_t Key_Val; uint8_t Key_Down; uint8_t Key_Up; Key_Val = Key_Scan(); Key_Down = Key_Val & (Key_Val ^ Key_Old); Key_Up = ~Key_Val & (Key_Val ^ Key_Old); Key_Times++; if((Key_Val==0)&&(Key_Old==0)) { Key_Times = 0; return; } Key_Old = Key_Val;//*Old是全局变量 //*请明白,Up和Down都只是一个脉冲信号 //*短按 if((Key_Times<=5)&&(Key_Up==1)) ucled = 0x01; if((Key_Times<=5)&&(Key_Up==2)) ucled = 0x04; //*长按,应该是500ms if((Key_Times>5)&&(Key_Old==1)) ucled = 0x02; if((Key_Times>5)&&(Key_Old==2)) ucled = 0x08; //*关灯 if(Key_Down==3) ucled = 0x00; }
效果符合第三种的预期,finished!
RTC中断:
- 闹钟中断:用来产生一个软件可编程的闹钟中断
- 秒中断:用来产生一个可编程的周期性中断信号(最长可达 1 秒)
- 溢出中断:检测内部可编程计数器溢出并回转为 0 的状态
标签:第二站,结果,杯国赛,短按,蓝桥,中断,松手,Key,200ms 来源: https://www.cnblogs.com/dowhatyoulove/p/16339689.html