十三集下,完善按键的模块化编程
按键未按下
消抖
单击
单击结束
长按3秒
长按结束
按键松开
几种状态
- #include "key.h"
-
- u16 Count[8] = {0,0,0,0,0,0,0};
- u8 LastState = 0; //8位变量
- void KEY_Deal(void) //检查所有按键的状态,10ms计数一次
- {
- u8 i = 0;
- for(i=0;i<8;i++) //循环8次,i范围0-7.代表按键状态
- {
- if(~KEY&(1<<i)) //如果持续按下,变量+1 & 全1 输出1
- {
- if(Count[i]<60000)
- Count[i] ++; //按键按下,计数+1
- }
- else //按键松开变量清0
- {
- if(Count[i]>0) //如果变量按下过
- {
- LastState |= (1<<i); //这个变量相应的标志位置位
- }
- else
- {
- LastState &= ~(1<<i); //这个变量相应的标志位清0
- }
- Count[i] = 0; ////按键松开,计数变量清0
- }
- }
- }
- u8 KEY_ReadState(u8 keynum)//读取指定按键的状态
- {
- if(Count[keynum]>0) //按键是按下的各种状态返回
- {
- if(Count[keynum]<3) //按下<30ms 返回消抖
- {
- return KEY_FILC;
- }
- else if(Count[keynum]==3) //按下正好30ms 返回单机
- {
- return KEY_PRESS;
- }
- else if(Count[keynum]<300) //按下不到300ms 返回单机结束
- {
- return KEY_PRESSOVER;
- }
- else if(Count[keynum]==300) //按下不到3000ms 返回长安状态
- {
- return KEY_LONGPRESS;
- }
- else //长安结束
- {
- return KEY_LONGOVER;
- }
- }
- else //按键已经松开 各种状态返回
- {
- if(LastState &(1<<keynum)) //按键按下过
- {
- return KEY_RELAX;
- }
- else //按键之前没有按下
- {
- return KEY_NOPRESS;
- }
- }
- }
复制代码
这个是主函数中执行的
主函数中的循环
|