其他分享
首页 > 其他分享> > 蓝桥杯国赛——第二站

蓝桥杯国赛——第二站

作者:互联网

探究:

*长短按识别;

*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中断:

 

标签:第二站,结果,杯国赛,短按,蓝桥,中断,松手,Key,200ms
来源: https://www.cnblogs.com/dowhatyoulove/p/16339689.html