51单片机大神来看看,程序很不稳定,尤其是6,A,E,喜欢闪,变成一。是共阴数码管,按键P3口

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
void delay(uint a)
{
uint b,c,d;
for(b=0;b<a;b++)
for(c=0;c<3;c++)
for(d=0;d<220;d++);
}
void m(uchar n)
{
uchar code m[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
P0=m[n];
delay(2);
}
uchar key_press()
{
uchar key;
P3=0xf0;
key=P3;
if(key!=0xf0)
{
return 1;
delay(20);
P3=0xf0;
if(key!=0xf0)
return 1;
else
return 0;
}
else
{
return 0;
}
}
uchar key_scan()
{
uchar key_num;
if(key_press())
{
P3=0xfe;
key_num=P3;
switch(key_num)
{
case 0xee:
return 0;
break;
case 0xde:
return 1;
break;
case 0xbe:
return 2;
break;
case 0x7e:
return 3;
break;
}

P3=0xfd;
key_num=P3;
switch(key_num)
{
case 0xed:
return 4;
break;
case 0xdd:
return 5;
break;
case 0xbd:
return 6;
break;
case 0x7d:
return 7;
break;
}
P3=0xfb;
key_num=P3;
switch(key_num)
{
case 0xeb:
return 8;
break;
case 0xdb:
return 9;
break;
case 0xbb:
return 10;
break;
case 0x7b:
return 11;
break;
}
P3=0xf7;
key_num=P3;
switch(key_num)
{
case 0xe7:
return 12;
break;
case 0xd7:
return 13;
break;
case 0xb7:
return 14;
break;
case 0x77:
return 15;
break;
}
}
}
void main()
{
uchar i;
while(1)
{
i=key_press();
if(i==1)
m(key_scan());
}
}

这样写的代码一般都是不稳定的,因为调用函数过多,忙延时太长等。显示不稳是由于显示的时间一直在变动,虽然每一次显示的时间一样,但在一定时间内显示的时间却不定,所以时暗时亮是必然的。从代码看出楼主对C掌握也不好
如: if(key!=0xf0)
{
return 1; //返回后下面的代码不可能被执行
delay(20);
P3=0xf0;
if(key!=0xf0)
return 1;
else
return 0;
}
case 0xee:
return 0;
break;
case 0xde:
return 1;
break;
有return后break是不用的
像这种程序应该把他们分时扫描,确宝不管程序怎么增加代码,显示的时间都不变,这样才会稳定
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-14
LZ在判断按键的地方的程序看不懂啊……为什么先要赋给P3寄存器一个值再让判断的变量(比如key和key_num),这样变量真的能获得P3接口的值么……

51单片机大神来看看,程序很不稳定,尤其是6,A,E,喜欢闪,变成一。是...
这样写的代码一般都是不稳定的,因为调用函数过多,忙延时太长等。显示不稳是由于显示的时间一直在变动,虽然每一次显示的时间一样,但在一定时间内显示的时间却不定,所以时暗时亮是必然的。从代码看出楼主对C掌握也不好 如: if(key!=0xf0){ return 1; //返回后下面的代码不可能被执行 del...

51单片机按键时,数码管会闪烁一下.原因是什么
原因很简单,这是代码和数码管驱动的问题 按键会影响数码管显示,这是单片机直接驱动数码管会出现的问题,而数码管则是工作在动态扫描方式的,若是采用带有锁存器件的数码管驱动,则不会出现此类现象,因为单片机是周期性的扫描工作方式,单片机直接驱动数码管的电路,当单片机扫描到按键的时候,数码管部分...

51单片机共阴数码管利用静态显示,让六个数码管显示1~6,程序怎么写?
首先定义了个数码管位选数组,也就是十六进制代码,这便是后来数码管显示数字的核心,接着,用 sbit 定义了位选和段选端口,分别是 P1.6 和 P1.7 ,定义了一个延时函数,其实这一串代码很有意思,开关开关思想,贯穿始终。 首先把位选打开,送入位选数据后,关闭锁存器,实现锁存,进入循环,随之打开段选锁存器,送入段...

用51单片机C语言编写程序实现6位共阴极数码管循环显示0123456789ABCDEF...
include<reg51.h># define uint unsigned int# define uchar unsigned charcode uchar shu[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, \/* 0 1 2 3 4 56 7*\/0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; \/\/数码管段选 \/* 8 9a b c def*\/...

51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示
1、首先,要把代码写好,点亮数码管。2、代码写完后,要确认原先写好的代码是不是正确的。3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。5、这里改成的是代表数字0的代码,如图所示。6、...

怎么用单片机实现6位led数码管显示?
用仿真实现,采用6位一体的共阴数码管,P0口输出段码,P2口输出位码。仿真图如下:程序如下 include <reg51.h> include <intrins.h> define uint unsigned int define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,\/\/0~9段码 0x77,0x7...

高分:51单片机汇编程序,数码管跳动问题
应该是串口收发导致单片机忙不过来,显示就会闪烁,因为你的延时程序是空操作,也占用CPU,建议你用定时中断做显示程序,中断时间定在5ms就可以了,这个定时器可以通过计数干很多其他事,比如500ms干一次。这样就不用CPU做空操作干等了。给你贴一个我写的显示程序(在定时中断中调用,这个程序显示两组数据...

51单片机控制数码管显示不正常问题,为什么后面4位数码管1234和5678都...
先建立程序的一般结构,然后定义一个code数组,里边存放数码管显示0~9的数据,之后定义一个display显示函数,传递参数但不返回参数,然后将传递的参数(1234或5678)分解成4哥单个数,然后依次选择要显示的数码管和数据,紧接消影和简单暂时,这样一个数码管显示就完成了,之后三个跟这个一样。最后在主函数...

谁能帮我看下这个程序呀,我写的51单片机,用的c语言,结果数码管就显示俩...
1,建议定义一个变量status标记当前调整的是“时”还是“分”还是秒。用一个按键控制这个变量的变化,变量的值由0变到3,再变为0。0的时候不调整,1的时候调整时,2的时候调整分,3的时候调整秒.用KEY1控制,按一下KEY1,变量status由常态0变成1,再按变成2,再按就成3,再按变回0。2,用KEY2做...

单片机数码管总是闪烁,不能全面显示数字 求大神帮忙看下 个位一直在闪...
延时时间太长,这里介绍一下动态扫描的基本常识,动态扫描是以人眼“视觉暂留”的时间为基准的,所以这个时间一般而言小于40毫秒,因此数码管要想让看起来不抖动,那么一排数码管必须要在这个时间范围内扫描完成,就这个程序而言,延时时间可能太长了,所以显示不正常。调整一下时间就好了。

相似回答