用动态扫描方法和定时器0在数码管的后五位显示出秒表,精确到1%秒,即最后一位显示1%秒,一直循环下去
数码管显示为 ×××:×× 。
我的代码如下://程序运行的结果是数码管压根不亮……求大神指教[抱拳]
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
***it LSA=P2^2; //138译码器,用于控制数码管位选
***it LSB=P2^3;
***it LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
u8 b,s,g,sf,bf,tempt,x;
void ini
tial(); //初始化子函数
void delay(u16 a); //延时子函数
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf); //显示子函数
void main()
{
initial();
while(1)
{
if(x==10) //x在定时器中,每1ms++
{
tempt++;
if(tempt==100000) //加到五位数则tempt清零
tempt=0;
b=tempt/10000; //b即百,即×××:××中第一位,b××:××
s=tempt%10000/1000; //s即十,即×××:××中第一位,×s×:××
g=tempt%1000/100; //以此类推
sf=tempt%100/10;
bf=tempt%10;
display(b,s,g,sf,bf);
}
}
}
void delay(u16 a)
{
while(a--);
}
void initial()
{
tempt=0;
b=0;
s=0;
g=0;
bf=0;
sf=0;
TMOD|=0x01; //TMOD=TMOD|0x01
//TH0=(65535-10000)/256;
//TL0=(65535-10000)%256;
TH0=0xfc;
TL0=0x18; //初值使定时器显示1ms
EA=1;
ET0=1;
TR0=1;
}
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf)
{
u8 i;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:
LSA=0;LSB=0;LSC=0; break; //LSA,LSB,LSC为138译码器的三个输入端
P0=smgduan[bf]; //LSA=0;LSB=0;LSC=0位选第一个数码管
delay(50);
case 1:
LSA=1;LSB=0;LSC=0; break;
P0=smgduan[sf];
delay(50);
case 2:
LSA=0;LSB=1;LSC=0; break;
P0=smgduan[g];
delay(50);
case 3:
LSA=1;LSB=1;LSC=0; break;
P0=smgduan[s];
delay(50);
case 4:
LSA=0;LSB=0;LSC=1; break;
P0=smgduan[b];
delay(50);
}
delay(50);
P0=0x00; //消影
}
}
void timer0() interrupt 1 //定时器0
{
//TH0=(65535-10000)/256;
//TL0=(65535-10000)%256;
TH0=0xfc;
TL0=0x18;
x++;
}