蓝桥杯国赛——第二站长短按

探究:

*长短按识别;

*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 的状态

 

posted @   charonplus  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示