本帖最后由 若不俗和inide 于 2016-9-2 20:10 编辑
最近身边的很多同学都在学习原子哥的STM32视频,我发现他们都看不懂原子哥里面按键扫描程序。由于问的人多,所以我也写了个心得,分享一下,老鸟别喷我哈。先贴上代码吧:
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode) //mode:0,不支持连续按; 1,支持连续按;
{
static u8 key_up=1;//按键按松开标志 //flga
if(mode==1) {key_up=1;}
if(key_up==1 &&(KEY0==0||KEY1==0||WK_UP==1)) //如果有一个按键按下
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0) return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}
else if(KEY0==1&&KEY1==1&&WK_UP==0)
{key_up=1;}
return 0;// 无按键按下
}首先必须搞懂static这个关键字,用这个关键字定义的变量,其值会保存,下次再执行这个函数的时候。不会被初始化。也就是说有点类似与全局变量,值是会保存上一次赋值过后的值。
下面我们一句一句来分析代码。
首先我们假设将mode =1,设置成支持连续按下。同时假设KEY0按下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
LZ,支持连续按键的分析不对。
1. static u8 key_up=1;(mode=1,这句不会运行了)
2. if(mode==1) {key_up=1;} 来一个判断语句,如果mode==1 ,那么全程key_up=1。(key_up不会全程等于1)
3.if(key_flag==1 &&(KEY0==0||KEY1==0||WK_UP==1)) ,由于key_up=1,假设按键key0又按下了。所以if语句成立。执行括号里面的内容。并且返回按键按下的值
4. 先消抖, key_up=0; 注意注意 重点来 key_up=0; 由于我们前面有一个判断语句 if(mode==1) {key_up=1;} 所以key_up=0; 之后,瞬间 key_up又等于1了。(这里严重解释错误,应该是:延时消抖后,key_up=0,key_up重新赋值后的确是等于0了,不会发生瞬间 key_up又等于1这样的事情)
5. 假设此时key0按键按着没有松开,所以KEY0==0,由于第4步所说的,key_up=0之后的瞬间 key_up又等于1了。(5.按键按着没有松开,main()程序继续调用KEY_Scan(1)按键扫描程序,由于mode=1,所以if(mode)key_up=1; )
6.所以此时此刻,if(key_up==1 &&(KEY0==0||KEY1==0||WK_UP==1)) 又成立了,又执行括号里面的内容。并且返回按键按下的值。如此循环下去,达到长按效果。
一周热门 更多>