51单片机,怎样改以下程序可以实现按一下只输入一个数?请高手赐教。

#include<reg52.h>
#define KEY P2
#define uchar unsigned char
#define uint unsigned int
uchar k;
uchar code led_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar code key_code[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,
0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
uchar dis[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
uchar code act[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{for(j=0;j<121;j++);}
}
uchar keyscan()
{
uchar X,Y,Z,j;
KEY=0xff;
KEY=0x0f;//先对KEY置数,行扫描
if(KEY!=0x0f)//判断是否有键按下
{
delay(10);//延时,软件去抖动(干扰)
if(KEY!=0x0f)//确认按键按下
{
X=KEY;//保存行扫描时有键按下的状态
KEY=0xf0;//列扫描
Y=KEY;//保存列扫描有键按下的状态
Z=X|Y;//取出键值
for(j=0;j<=15;j++)
{
if(Z==key_code[j])//查表得键值
{ k=j;
dis[5]=dis[4];
dis[4]=dis[3];
dis[3]=dis[2];
dis[2]=dis[1];
dis[1]=dis[0];
dis[0]=led_data[k];
if(KEY!=0x0f)
display();
return(k);}
}
}
}
else KEY=0xff;
return(16);
}
display()
{

P0=dis[5];P1=act[5];delay(1);
P0=dis[4];P1=act[4];delay(1);
P0=dis[3];P1=act[3];delay(1);
P0=dis[2];P1=act[2];delay(1);
P0=dis[1];P1=act[1];delay(1);
P0=dis[0];P1=act[0];delay(1);

}
void main()
{
while(1)
{
keyscan();
display();
}
}

你好!我看了你的程序(不过你的程序层次太乱),发现和我以前做的一个课程设计出现一样的问题 问题出在按键去抖动上 我做的是一个出租车里程计费系统 里面有一个挂档的按键 没按一次档位+1 加到4档归1 但是结果按下按键松开之后出来的结果并不是按一下+1 有时+1 有时+2 有时+3 也就是有可能出现累计任何次数
这是因为去抖动问 如果只是利用延时来去抖动 也就是检测经过一段时间后按键是否还是属于按下状态 如果是那么执行你的读取按键值操作然后送显 但是由于你整个程序全部执行完一次 估计总共的时间也就是ms级别 我们按键的速度估计在S级别 也就是你按一下按键到你释放估计程序已经扫描检测按键值送显N遍了 !!! 所以需要对按键去抖动部分进行修改 我是利用一个while(){}循环解决的 只要检测到按键属于按下状态我只是不断的读取按键值 只有当按键释放之后(也就是完成了一次完整的按键操作),然后在进行送显示,结果证明可以解决问题
就算你按下按键维持10秒 也不会出现问题 ,希望对你有所帮助!!
uchar keyscan()
{
uchar X,Y,Z,j;
KEY=0xff;
KEY=0x0f;//先对KEY置数,行扫描
if(KEY!=0x0f)//判断是否有键按下
{
delay(10);//延时,软件去抖动(干扰)
while(KEY!=0x0f)//按键按下一直执行次循环
{
X=KEY;//保存行扫描时有键按下的状态
KEY=0xf0;//列扫描
Y=KEY;//保存列扫描有键按下的状态
Z=X|Y;//取出键值
}
}
for(j=0;j<=15;j++)//按键释放之后开始查值送显
{ if(Z==key_code[j])//查表得键值
{ k=j;
dis[5]=dis[4]; dis[4]=dis[3]; dis[3]=dis[2]; dis[2]=dis[1]; dis[1]=dis[0]; dis[0]=led_data[k];
……………………………………
后面的自己弄!
可能程序具体的不是这样改 但是你按照我说的思路自己修改 应给能解决! 祝你好运!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-14
检测到按键后,在检测松手就可以了本回答被提问者采纳