再发键盘程序,希望得到高手评价!
这是一个4*4 键盘程序,已调试通过。它没有完全按照状态机格式写,请各位高手评价一下好与否。
//---KeyBoard.c---//
#include "All.h"
uchar K_No=0xff; //键号
uchar KeyNo=0xff; //输出键号
uchar Temp=0xff;
uchar KeyValue=0xff;
bit Flag_KeyDown=0;
bit Flag_KeyUp=0;
//=========监测按键========//
uchar KeyMonitor()
{
P1=0xf0;
if(P1!=0xf0)
{
LowVoltageDeal();
}
else
{
HighVoltageDeal();
}
KeyNoOutput();
return (KeyNo);
}
//=========低电平状态:确定键号=========//
void LowVoltageDeal()
{
if(Flag_KeyDown==0) //首次检测到有键按下
{
Flag_KeyDown=1; //标志:“按下”
TR0=1; //开中断计时,去抖
TimeCount=0;
Temp=P1&0xf0;
P1=0x0f;
KeyValue=(P1&0x0f)|Temp; //---键值---
switch(KeyValue) //---求键号---
{
case 0xbe:K_No=0x00; break;
case 0x77:K_No=0x01; break;
case 0xb7:K_No=0x02; break;
case 0xd7:K_No=0x03; break;
case 0x7b:K_No=0x04; break;
case 0xbb:K_No=0x05; break;
case 0xdb:K_No=0x06; break;
case 0x7d:K_No=0x07; break;
case 0xbd:K_No=0x08; break;
case 0xdd:K_No=0x09; break;
case 0xe7:K_No=0x0a; break;
case 0xeb:K_No=0x0b; break;
case 0xed:K_No=0x0c; break;
case 0xee:K_No=0x0d; break;
default:K_No=0xff;
}
}
}
//=========高电平状态:去抖==========//
void HighVoltageDeal()
{
if((TimeCount==20)&&(Flag_KeyUp==0))
{
/*按键“按下”状态去抖时间到,进入“抬起”状态监测*/
TR0=1; //重开中断,
TimeCount=0; //重新计时,“抬起”状态去抖
Flag_KeyUp=1; //标志 :“抬起”
}
}
//=========键号输出============//
voidKeyNoOutput()
{
/*按键“抬起”状态去抖时间到,输出“键号”*/
if((TimeCount==20)&&(Flag_KeyUp==1))
{
TimeCount=0;
Flag_KeyDown=0;
Flag_KeyUp=0;
KeyNo=K_No;
}
/*按键非"抬起"状态,输出非键号信息*/
else
{
KeyNo=0xff;
}
} 首先声明,我不是高手,但我想发表一下我的看法:
1. 这种写法的结构不如状态机写法清晰;
2. 将定时器的开启放在按键程序中,该定时器成了按键程序专用资源,在定时器资源不多的情况下这是极大的浪费。定时器适宜多任务共享。 sunliezhi 发表于 2012-7-24 22:08 static/image/common/back.gif
首先声明,我不是高手,但我想发表一下我的看法:
1. 这种写法的结构不如状态机写法清晰;
2. 将定时器的开 ...
您的指点很好, 谢谢!!! 马克一下先 我只能说这样写不好。。很浪费,而且效率不高。。http://blog.sina.com.cn/itangcle看下这个里面有一个键盘扫描的还不错 pubuntu 发表于 2012-7-27 21:30 static/image/common/back.gif
我只能说这样写不好。。很浪费,而且效率不高。。http://blog.sina.com.cn/itangcle看下这个里面有一个键盘 ...
谢谢评价!!!
页:
[1]