
RESTART:
JB START,$ ;第一次检测(检测的位置在抖动的过程中)
DELAY(延时程序) 延时消抖
JB START,RESTART再次检测(检测位置在稳定阶段)
……
第一次检测有可能会检测到抖动的波峰“尖点”处,信号为1,此时第一条语句会原地踏步,不往下执行,直到检测到波谷“地点”处,信号为0,才开始执行第二条语句,调用延时子程序,延时子程序会持续一段时间(当然这时间自己定,大概就行),来到第三条语句,再次检测信号(稳定阶段),信号为0(前后检测一致),继续往下执行……如果第二次检测是高电平1,说明(①按键没有被按下,只是信号单纯地抖动而已)或者(②延时太短,第二次检测的位置还在前沿抖动阶段)或者(③延时太长,检测位置在后沿抖动阶段)此时就执行跳转回RESTART,继续重新扫描信号,看按键有没有被按下。
看了n多解释,没有一个是我(新手)觉得通俗易懂的,想了很久才恍然大悟,虽然是18年提出的问题,还是希望能帮助到不理解的同学。不喜勿喷,谢谢!
#include<reg52.h>bit KEYFlag = 1 //指示按键状态,'1'为d起态,'0'按下态
/********************************
按键去抖
*********************************/
void KEYDelay()
{
unsigned char i = 200
while(i--)
}
/********************************
键翻译
*********************************/
unsigned char KEY_Tran(unsigned char Key)
{
switch(Key)
{
case 0xee: return 0break//根据按键编码返回对应的键值
case 0xde: return 1break
case 0xbe: return 2break
case 0x7e: return 3break
case 0xed: return 4break
case 0xdd: return 5break
case 0xbd: return 6break
case 0x7d: return 7break
case 0xeb: return 8break
case 0xdb: return 9break
case 0xbb: return 0x0abreak
case 0x7b: return 0x0bbreak
case 0xe7: return 0x0cbreak
case 0xd7: return 0x0dbreak
case 0xb7: return 0x0ebreak
case 0x77: return 0x0fbreak
default: break
}
}
/********************************
键扫描
*********************************/
unsigned char KEY_Scan()
{
unsigned char KEY_Value
P2 = 0x0f
KEY_Value = P2
P2 = 0xf0
KEY_Value |= P2
return KEY_Value
}
/********************************
查键
*********************************/
void KEY()
{
static bit KEYFlag = 1
static unsigned char KEYCode
if(KEYFlag)
{
if(KEY_Scan()!=0xff)
{
KEYCode = KEY_Scan()
KEYDelay()//有按键按下延时去抖
if(KEYCode==KEY_Scan())
{
//键号 = KEY_Tran(KEYCode)
//此处添加功能模块
KEYFlag = 0
}
}
}
else
{
if(KEY_Scan()==0xff)
{
KEYDelay()//按键d起延时去抖
if(KEY_Scan()==0xff)
KEYFlag = 1
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)