高手帮帮忙
8个数码管,8个按键,当按键按下后,第一个数码管显示键值,然后把上一个按键的键值往前推,显示在第二个数码管,以此类推。
程序写完以后,发现每次按下键后,每个灯管都显示为该键值。
推测:机器执行完一次判断是否有按键按下后,即使程序写明把按键值还原。但是,按下按钮按下时所持续的时间够长,足够执行n次按键的判断,所以相当于一瞬间已经按了无数次的按钮。怎么才能解决这个问题啊,延时程序又该在哪里插入。求大神。。。
这是我的代码,欢迎大家喷
#include<reg51.h>
#include<intrins.h> //138译码器控制相关定义
sbit LS138A = P2^2;
sbit LS138B = P2^3;
sbit LS138C = P2^4; //按键的声明
sbit K0 = P3^0; sbit K1 = P3^1;
sbit K2 = P3^2; sbit K3 = P3^3;
sbit K4 = P3^4; sbit K5 = P3^5;
sbit K6 = P3^6; sbit K7 = P3^7;
//共阴极LED字模 0-7
unsigned char code LEDCode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; //按键值的缓存
unsigned char KeyCache[]={0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}; //将按键的值向前递推
void move()
{
KeyCache[7] = KeyCache[6];
KeyCache[6] = KeyCache[5];
KeyCache[5] = KeyCache[4];
KeyCache[4] = KeyCache[3];
KeyCache[3] = KeyCache[2];
KeyCache[2] = KeyCache[1];
KeyCache[1] = KeyCache[0];
} //延时函数
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=189;c>0;c--)
for(b=230;b>0;b--)
for(a=33;a>0;a--);
} //主函数
main()
{
unsigned int LedOut[8];
unsigned int i; while(1)
{ if(P3!=0xff)
{
move();
if(!K0) KeyCache[0]=LEDCode[0];
if(!K1) KeyCache[0]=LEDCode[1];
if(!K2) KeyCache[0]=LEDCode[2];
if(!K3) KeyCache[0]=LEDCode[3];
if(!K4) KeyCache[0]=LEDCode[4];
if(!K5) KeyCache[0]=LEDCode[5];
if(!K6) KeyCache[0]=LEDCode[6];
if(!K7) KeyCache[0]=LEDCode[7];
P3=0xff;
}
LedOut[0]=KeyCache[0];
LedOut[1]=KeyCache[1];
LedOut[2]=KeyCache[2];
LedOut[3]=KeyCache[3];
LedOut[4]=KeyCache[4];
LedOut[5]=KeyCache[5];
LedOut[6]=KeyCache[6];
LedOut[7]=KeyCache[7];
//实现8位动态扫描循环
for(i=0; i<8; i++)
{
P0 = LedOut[i]; //将字模送到P0口显示
switch(i) //使用switch 语句控制位选
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
}
}
}
[解决办法]
这么复杂
[解决办法]
判断按键的上升沿
[解决办法]
unsigned int j;
for(j=0;j<1000;j++)//适当修改j的大小,与delay函数有关,j*delay=while死循环的时间
{
for(i=0; i<8; i++)
{
P0 = 0x00; //关显示
switch(i) //使用switch 语句控制位选
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
P0 = LedOut[i]; //将字模送到P0口显示
delay();延时
delay();delay();
delay();
delay();适当的删减delay函数
}
}
延时多长时间??????
//延时函数
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=189;c>0;c--)
for(b=230;b>0;b--)
for(a=33;a>0;a--);