原文链接
https://www.amobbs.com/thread-4308630-1-1.html
#define Number 20
unsigned char Jitter = Number; //连续检测20次,每次间隔1ms
unsigned int Value; //读取的端口,每次和次数据做或操作,原始值为0
unsigned int SaveData;//保存读取的去抖动后的端口数据
unsigned int Trg;
unsigned int Cont;
void KeyRead(unsigned char Time)
{
if(Time != 0) //不为0时,1ms时间间隔已到
{
if(Jitter == 0)
{
SaveData = Value; //去抖动次数到,保存读取的数据
Value = 0; //和端口做or操作
Jitter =Number;
}
else
{
--Jitter;
Value |= GPIO_ReadInputData(GPIOC);//每次去抖动时都是0为有按下,有一次为1,
//表示已松开,置读取数据以后都为1,到去抖动次数到,再读取是否为0
}
}//以上为添加部分
unsigned int ReadData = SaveData^0xffff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
只耗费一个位变量和一个unsigned char的全局变量,当然也要定时器 每20毫秒产生一个中断
- sbit FlagKeyStatus=0;
- unsigned char CntSingleKey=0;
- void KeyProcess(void) //每20ms执行 一次
- {
- if(FlagKeyStatus==0) // 没有按键按下
- {
- if(!KeyInput) //KeyInput为按键输入的IO口
- {
- CntSingleKey = 1;
- FlagKeyStatus = 1;
- }
- }
- else //有按键按下的处理
- {
- if(!KeyInput) //一直被按着
- {
- if(CntSingleKey < 250) //最长时间:5S
- {
- CntSingleKey++;
- }
- }
- else
- {
- FlagKeyStatus = 0;
- if((CntSingleKey>=2)&&(CntSingleKey<25)) //介于 40ms至 500 之间,就会认为是 单击,可能会有正负20ms的偏差
- {
- FlagSingleKey = 1; //检测到一次合法的按下事件,通过FlagSingledKey返回
- }
- }
- }
- }
复制代码这段代码是运行在那个超小容量的MCU上面,RAM只有64byte,因此对RAM的 使用必是精确的到比特位的程度 ,当然我想如果像是ARM这类的大容量 的MCU,随便写都没问题。
特点:占用RAM比较小,只需要一个位变量和一个unsigned char的 变量。当然如果 MCU不支持 位变量的 ,就要两个unsigned char的变量了
非阻塞的执行过程,支持防抖和按键松手检测。
unsigned int SaveData = 0xffff;//这句初始化一下,不初始化上电相当于按钮已按下
这个一位数据对应一个端口
这句里的Value |= GPIO_ReadInputData(GPIOC);从直接端口读出,GPIO_ReadInputData(GPIOC);换成从你的矩阵读出不就可以了
一周热门 更多>