c51单片机独立按键检测:上下加减左右移动数码管,出现四个按键互相有干扰,偶尔有乱码出现

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
void delay10ms(uint z);
void main()
{
uint k,i;
P0=tab[0];
P2=tab1[0];
while(1)
{
if(key0==0)
{
delay10ms(1);
if(key0==0)
{
if(i==0)
{
i=8;
}
P2=tab1[i];
P0=tab[k];
i--;
while(!key0);
}
}
if(key1==0)
{
delay10ms(1); //消按键抖动
if(key1==0)
{
if(k==0)
{
i=16; //不是15是16,因为从0-f显示数码管f不显示了
}
P2=tab1[i];
P0=tab[k];
k-- ;
while(!key1); //当key1按下时间一直执行这条指令,避免了长时间按下出现错误
}
}
if(key2==0)
{
delay10ms(1); //消按键松开抖动
if(key2==0)
{
if(i==8)
{
i=0;
}
P2=tab1[i];
P0=tab[k];
i++;
while(!key2); //当key2按下时间一直执行这条指令,避免了长时间按下出现错误
}
}
if(key3==0)
{
delay10ms(1); //消按键松开抖动
if(key3==0)
{
if(k==16)
{
k=0;
}
P2=tab1[i];
P0=tab[k];
k++;
while(!key3); //当key3按下时间一直执行这条指令,避免了长时间按下出现错误
}
}
}
}
void delay10ms (uint z)
{
uint j,p;
for(j=0;j<z;j++)
for(p=0;p<1828;p++);
}

k和i没付初值,应该加 k = 0;i = 0;这是个好习惯
if(key0==0)
{
if(i==0)
{
i=8;
}
P2=tab1[i];
P0=tab[k];
i--;
while(!key0);
}
数组会发生越界,所以建议 i--;再 P2 = tab1[i]; 还有其他地方也出现了数组越界的问题,你试着自己找出来,看来兄弟你不止是c51单片机新手,还是c语言新手
温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等
P1是LED.P2是按键sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2; sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;#define uchar unsigned char#define ulint unsigned long#define Frequency 10\/\/定时器中断时间 = f*T#define Time 1\/\/一个周期1ms#define TubeNumber 6\/\/数码管...

请教高手,用51单片机独立按键控制数码管数字加减,为什么在按下独立按...
1、改进按键扫描 2、改进数码管显示 3、用嵌入式系统 以上三选一即可解决

单片机检测和处理按键时怎样不干扰数码管的显示?
程序乱了一点,重新调整一下结构吧,你可以试一下这样:你的4位数码管还是用动态扫描,4个以内的按键也还是用扫描,不过你要把几个按键的扫描时间安排在4个数码管的显示时间内,即是显示第一位数码管后就扫描第一个按键状态,判断按键的不同状态(开或合)给予不同的标志(这个标志用来后面程序统一处...

求一c51单片机原理图,要求具有晶振电路,上电复位、按键复位、2个按键...
这个可以把

C51程序,设计每按一次按键,P1^0口亮,同时数码管显示相应按键值。我的...
首先去看看,管脚输出的电平是否正确,如果正确那灯的应该会亮。。。哦,对了,你这里应该用的是独立按键吧,看看跳帽有没有接对,因为程序没有认真看,假如你能保证你的程序正确就是上面的问题了。因为当初我菜的时候也是这样问问题,没有几个人会理的。。。要学会自己去调试 ...

用c51单片机按下4*4矩阵按键,数码管显示0-F,能正常显示,只是0号和7...
\/ 类型:矩阵键盘。现象:按下键盘后,数码管显示相应的数字0-F 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!\/ include<reg52.h> \/\/52单片机头文件,一般不要改动,里面包含特殊功能寄存器的定义 define uchar unsigned char \/\/将unsigned char定义为uchar,简化输写。提高编程速度 d...

单片机检测和处理按键时怎样不干扰数码管的显示?
if(!KEY_ADD) \/\/再次确认按键是否按下,没有按下则退出 { while(!KEY_ADD);\/\/如果确认按下按键等待按键释放,没有释放则一直等待 { if(num<9) \/\/加操作 num++;} } } if(!KEY_DEC) \/\/如果检测到低电平,说明按键按下 { DelayMs(10); \/\/延时去抖,一般10-20ms if(!KEY_...

51单片机中独立按键控制数码管时当每个键按下去之后松开又恢复原状态...
只要程序和硬件没有问题,那么每一个独立按键按下,都应该显示该独立按键所对应的东东,不应该恢复到之前的显示值。所以出现你所说的状态,一种情况是程序有问题,另一种情况是硬件有问题。具体如何要看你的代码才能确定。

80c51单片机用汇编语言4个独立按键如何分别控制4个数码管从0到9到0...
仿真结果,你要是仿真,就按这个仿真图画,程序就完全适用。如果是实物开发板,就是根据开发板,适当修改程序了。汇编程序如下 S1 BIT P3.4 S2 BIT P3.5 S3 BIT P3.6 S4 BIT P3.7 DISM1 EQU 31H DISM2 EQU 32H DISM3 EQU 33H DISM4 EQU 34H START:MOV R0,#7FH CLEA...

c51单片机怎么用两个按键控制两个数码管的加减,加到99就好,求程序
1、首先先在proteus画出仿真图,方便仿真程序。2、接着来编写程序,先来写入头函数。2、根据自己在proteus画的图,定义一下管脚根据你的原理图进行编写。3、然后写一个延时函数,来调节流水灯的时间间隔延时时间自己定义。4、下图就是主函数,包括流水灯的反复循环和j流水灯的方向。5、检查没有错误,...

相似回答