标题:
分享一些单片机按键程序
[打印本页]
作者:
2367643286
时间:
2018-9-16 21:04
标题:
分享一些单片机按键程序
/*==================
按键读键函数
==================*/
void ReadKey(void)
{
uchar ReadData;
ReadData=(((~(P3&0XF0))&0XF0)|(P3&0X0F)); //将前四位取反,即P3.7-P3.4 保留P3.3-P3.0的数据,【目的为将按键位取反,不影响其他位】
Trg = ReadData & (~Cont); // 只要有按键按下,在对应位会有一个脉冲,后四位不确定。如P3.4按下了,会出现一次0X1F;P3.5按下了,会出现一次0X2F;
Cont = ReadData; // 有按键按下,会出现对应编码。
if(Cont&0xf0) // 如果按键不放,不处理
{
KeyCnt++; // 读键次数
KeyEffect=Cont;
if(KeyCnt>=1000)KeyCnt=1000;
return;
}
else // 键值发生改变
{
if((KeyCnt>=10)&&(KeyCnt<=90)) //多次读键消抖
{
KeyCnt=0;
KeyEffect=(KeyEffect&0xf0)+80;
KeyOpt();
send_char_com(KeyEffect);
if(Cont&0x10)
{
BeepCnt=0x10;
Keyflg_S2=1;
}
}
else if(KeyCnt>=150) //长按
{
BeepCnt=0x10;
KeyCnt=0;
}
}
}
/*===============
按键处理子函数
=================*/
void KeyOpt(void)
{
switch(KeyEffect)
{
case 0: // 空键
{
break;
}
case 0xd0: // S4键(P1.3)
{
BeepCnt=0x10;
Keyflg_S5^=1;
LED1^=1;
break;
}
case 0x90: // S5键(P1.4)
{
BeepCnt=0x10;
Keyflg_S4^=1;
LED2^=1;
break;
}
case 0x70: // S6键(P1.5)
{
BeepCnt=0x10;
Keyflg_S3^=1;
LED3^=1;
break;
}
case 0x60: // S6键(P1.5)
{
BeepCnt=0x10;
Keyflg_S2^=1;
LED4^=1;
break;
}
default: break;
}
}
作者:
bhjyqjs
时间:
2018-9-17 15:36
通过三个逻辑变量运算,确定按键的按下、长按、抬起,确实较妙。如果配以状态机,则程序会更简洁。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1