书本上的0~99显示程序都是用74LS593锁存器控制显示电路。我们的单片机可以直接驱动数码管,可以不用锁存器。
我想只用89C52单片机与四位共阳数码管写一个以一秒为递进的0~99数字显示程序。P0口控制数码管的位选,P2口控制数码管的段选。
以下是我的程序思路,运行起来一直动态显示01两个数字。我不知道问题出在哪里,恳求各位坛友给个修改思路,不胜感激!!!
# include <reg52.h>
# define uint unsigned int
# define uchar unsigned char
uchar a[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, //四位共阳数码管0~9显示代码
0x92, 0x82, 0xF8, 0x80, 0x90 };
uchar wei[2] = { 0xef, 0xdf }; //个位与十位选通代码
uchar duan[2]; //用于存储个位与十位值的数组
void delay(uchar m)
{
uchar i, j;
for (i=0; i<m; ++i)
for (j=110; j>0; --j);
}
void display(uchar n, uchar k) //数码管显示函数
{
P0 = 0xff; //个位显示
P2 = wei[n];
P0 = duan[n];
delay(5);
P2 = 0xff;
P0 = 0xff; //十位显示
P2 = wei[k];
P0 = duan[k];
delay(5);
P2 = 0xff;
}
void main(void)
{
uchar i=0, n=0, k=1, d=0;
while (1)
{
++d;
if (d==100)
d = 0;
duan[0] = a[d%10]; //个位显示的值
duan[1] = a[d/10]; //十位显示的值
display(n, k);
TMOD = 0X01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}
}
void T0_time() interrupt 1
{
uchar num=0, n=0, k=1;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
num++;
display(n, k); //定时过程中数码管显示
if (num==20)
num = 0;
} |