人为将7号键弄到时断时续的时候,有时数码管会显示一个乱码,再按一下又会正常 ,是按键消抖还不够好吗?或其它问题?如何排除?
#include <reg52.h>
#define uchar unsigned char
uchar key;
uchar code seg7[16]= {0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,
0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};//数码管代码
uchar key_jiang(void);
//--------------------------------------------------
void delay(uchar k)
{
uchar a,b;
for(a=k;a>0;a--)
for(b=120;b>0;b--);
}
//--------------------------------------------------
void key_sm(void)
{
uchar a,b,c;
P1=0XF0;
if(P1!=0XF0)
{
a=P1;
delay(10);
if(P1!=0XF0)
{
b=P1;
delay(5);
if(P1!=0XF0)
{
c=P1;
delay(5);
if((a&b)==c)
{
key_jiang();
key=key_jiang();
P0=seg7[key];
P2=0XFE;
for(;P1!=0XF0;);
delay(5);
for(;P1!=0XF0;);
}
}
}
}
}
//-------------------------------------------------
uchar key_jiang(void)
{
uchar a,b,c;
P1=0x0f; //------------------------低四位置1,高四位置0,
a=P1; //------------------------读P0口,
a=~(a|0xf0); //---P0口数据和高四位1相或,再取反,得按下行为1,
if(a==1) //--------------------如果第一位为1;
b=0;
else if(a==2) //--------------------如果第二位为1;
b=1;
else if(a==4) //--------------------如果第三位为1,
b=2;
else if(a==8) //--------------------如果第四位为1,
b=3;
P1=0XF0;
a=P1;
a=~((a>>4)|0xf0);
if(a==1)
c=b+0;
else if(a==2)
c=b+4;
else if(a==4)
c=b+8;
else if(a==8)
c=b+12;
else c=16;
return (c);
}
//-----------------------------------------------------------
void main (void)
{
while(1)
{
key_sm();
}
}
三楼的朋友 ,按你修过的写进去后,还是会出现同样的情况,而且更频繁,还有就是出现乱码后按任何按键都没有反应,只有复位单片机才能正常再按,能再帮忙分析下可能是什么原因吗?我怀疑是检测完行但还没有检测列的时候刚好松开了按键?
追答上述程序,可以正常、稳定运行,仿真图可见下面。
上述程序,是仿照你的程序修改的,在按键消抖部分,含有硬伤。
你的程序中,是在确认了按键按下后,才去执行读入按键的函数,这样就晚了,出现的抖动,还是不可避免的。
当你用硬件运行时,就会暴露出来问题。
良好的消抖程序,可以参考:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef086222268d4f4eac34de59.html