基于C语言在数码管上实现只显示有效位的秒表,高位的0不显示。
本程序是基于STC-51开发板电路实现的。
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
code unsigned char LedChar[16] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
}; //LED显示0-F字符时,对应的P0值
void main()
{
ENLED = 0;
ADDR3 = 1; //使能U3(74HC138),选择数码管
TMOD = 0x01; //设置T0为模式1
TH0 = 0xfc;
TL0 = 0x67; //设置定时初值为0xFC67,定时为1ms
TR0 = 1; //打开定时器T0
EA = 1; //打开总中断
ET0 = 1; //打开T0中断
while(1);
}
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0; //ms计数变量
static unsigned long sec = 0; //s计数变量
static unsigned char i = 0; //数码管编号
static unsigned char LedBuff[6]={0xff,0xff,0xff,0xff,0xff,0xff};
TH0 = 0xfc;
TL0 = 0x67; //定时溢出时,重新赋值,保证每次定时为1ms
cnt++;
//秒数变化时,重新计算每个数码管要显示的值,以及关闭高位的0,只显示有效位
if(cnt >=1000)
{
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
if(sec <= 9)
{
LedBuff[1] = 0xff;LedBuff[2] = 0xff;LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
}
else if(sec <= 99)
{
LedBuff[2] = 0xff;LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
}
else if(sec <= 999)
{
LedBuff[3] = 0xff;LedBuff[4] = 0xff;LedBuff[5] = 0xff;
}
else if(sec <= 9999)
{
LedBuff[4] = 0xff;LedBuff[5] = 0xff;
}
else if(sec <= 99999)
{
LedBuff[5] = 0xff;
}
}
P0 = 0xff; //数码管显示消隐
switch(i)
{
case 0 : ADDR2 = 0; ADDR1 = 0; ADDR0 = 0;i++;P0 = LedBuff[0];break;
case 1 : ADDR2 = 0; ADDR1 = 0; ADDR0 = 1;i++;P0 = LedBuff[1];break;
case 2 : ADDR2 = 0; ADDR1 = 1; ADDR0 = 0;i++;P0 = LedBuff[2];break;
case 3 : ADDR2 = 0; ADDR1 = 1; ADDR0 = 1;i++;P0 = LedBuff[3];break;
case 4 : ADDR2 = 1; ADDR1 = 0; ADDR0 = 0;i++;P0 = LedBuff[4];break;
case 5 : ADDR2 = 1; ADDR1 = 0; ADDR0 = 1;i=0;P0 = LedBuff[5];break;
default : break;
}
}
显示效果如下: