在上次51单片机课程中老师布置了一个小作业
作业要求:
四位数码管闪烁显示H66S,且要求中间数字为66倒计时。
代码思路类似于两位倒计时,只不过第一位和第四位固定显示而已。
参考代码分享给小伙伴:
#include <reg52.h>
sbit LSA=P1^5;
sbit LSB=P1^6;
sbit LSC=P1^7;
unsigned int cnt=0;
signed char sec;
signed char sec_all=66;
signed char count=0;
unsigned char smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x0f8,0x80,0x90,0x89};
void timer10ms()
{
TMOD = 0x00; //清空T0控制位
TMOD = 0x01; //设置T0模式为01
TL0 = -9216%256; //计数值装载
TH0 = -9216/256;
ET0 = 1; //使能T0中断
}
void EXINT0() interrupt 0
{
count++;
}
void Timer0() interrupt 1
{
TH0 = -9216/256;
TL0 = -9216%256;
cnt++; //中断次数加一
if (cnt >= 100) //中断50次=1s
{
cnt = 0;
sec--;
if (sec < 0) //当显示数值到0时,闪烁
{
sec = 0;
}
}
}
void ledscan(unsigned char wei,unsigned char display)
{
unsigned char i;
for(i=0;i<=wei;i++)
{
P0=display;
switch(wei) //位选
{
case(0):
LSA=1;LSB=0;LSC=0; break; //显示第0位
case(1):
LSA=0;LSB=1;LSC=0; break; //显示第1位
case(2):
LSA=1;LSB=1;LSC=0; break; //显示第2位
case(3):
LSA=0;LSB=0;LSC=1; break; //显示第3位
}
P0=0xff;LSA=1;LSB=1;LSC=1;//消隐
}
}
void delayms(unsigned int xms)
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main(void)
{
LSA = 0;
LSB = 0;
LSC = 0;
cnt = 0;
sec = sec_all;
timer10ms();
EA=1;
IT0=1;
EX0=1;
TR0=1;
while(1)
{
if(count%2==0)
{
TR0 = 1;
}
else
{
TR0 = 0;
}
if((cnt>50))
{
ledscan(0,0xff);
ledscan(1,0xff); //清除个位
ledscan(2,0xff); //清除十位
ledscan(3,0xff);
}
else
{
ledscan(0,smgduan[5]);
ledscan(1,smgduan[sec%10]); //显示个位
ledscan(2,smgduan[sec/10]); //显示十位
ledscan(3,smgduan[10]);
}
}
}