51单片机按键时,数码管
#define uchar unsigned char
#define uint unsigned int
uchar tt,bai,shi,ge;
uint count=300;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
void delay(uchar z);
void init();
void key();
void display(uint count);
void main()
{
dula=1;
P0=0;
dula=0;
wela=1;
P0=0xf8;
wela=0;
init();
while(1)
{
key();
display(count);
}
}
void delay(uchar z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void timer_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
count--;
}
}
void key()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
TR0=1;
}
while(!key1);
}
}
void display(uint count)
{
delay(10);
bai=count/100;
shi=(count-bai*100)/10;
ge=count%10;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(2);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(3);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(3);
}
按键按下,数码管只显示最后一个个位,好无奈啊 ,试了好长时间!
刚开始学51,希望大虾们详细给说一下什么原因,要怎么修改。
建议你修改显示函数中的语句:
把三个P0=oxff语句全部删掉
在delay(3)语句后面放置P0=oxff语句
试试看看
明天来Proteus板块直接提问吧,就怕找不到你的帖子。我一有时间,就帮你弄!
Proteus板块支持:51,avr,pic,msp430,lm3s,lpc21。
部分单片机lpc13,68hc,tms320,8086还在研究中。
欢迎你的加入。
我在一个程序中也遇到相同问题,不知如何解决
一个显示函数需要这么多行代码吗?两个for循环解决的事情干嘛还要这么写?建议去网上再找找其他的程序,看别人是怎么写的,然后借鉴别人的经验该成自己的!
确定硬件连接没有问题吗
如果找出问题 ,说出来大家分享
这个应该和你的按键有关系 当按键按下的时候执行命令 然后有个等待按键释放的程序 while key取反 这时候程序就在这停了 显示就不好使了 你的硬件可以用74ls573来进行锁存 这样就不会出现了
我有12864电子钟的套件需要不,可以下载程序学习,当电子钟用,PCB板与12864液晶尺寸一样大,非常美观的。我QQ:176798246
void display(uint count)函数中count改成随便一个形参
出现这种情况是因为你把数码管的显示函数放到了main函数中。当单片机的CPU被按键部分占用的时候,单片机一直卡在按键哪里,根本不去执行数码管的显示函数,而数码管同一时间只能显示一位。
所以你应该把数码管的扫描显示函数放入到定时器的中断中执行就可以了。 如果有不明白的地方,可以发我邮件ntsyans@126.com