一、STC89C52实现数码管轮流显示"HELLO"和"12345",每隔1s进行转换
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = { //数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92
};
unsigned char code LedChar1[]={
0xC0, 0x89, 0x86, 0xC7, 0xC7, 0xC0
};
unsigned char LedBuff[6] = { //数码管显示缓冲区,初值0xFF确保启动时都不亮
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
void main()
{
unsigned char i = 0; //动态扫描的索引
unsigned int cnt = 0; //记录T0中断次数
//unsigned long sec = 12345; //记录经过的秒数
int flag=1;//控制转换
ENLED = 0; //使能U3,选择控制数码管
ADDR3 = 1; //因为需要动态改变ADDR0-2的值,所以不需要再初始化了
TMOD = 0x01; //设置T0为模式1
TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms
TL0 = 0x67;
TR0 = 1; //启动T0
P2 = 0xF7;//P2.3置0,即KeyOut1输出低电平,此时,K1,K2,K3,K4相当于4个独立的按键
while (1)
{
if (TF0 == 1) //判断T0是否溢出
{
TF0 = 0; //T0溢出后,清零中断标志
TH0 = 0xFC; //并重新赋初值
TL0 = 0x67;
cnt++; //计数值自加1
if (cnt >= 1000) //判断T0溢出是否达到1000次
{
cnt = 0; //达到1000次后计数值清零
//秒计数自加1
//以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符
if(flag>0)
{
LedBuff[0] = LedChar1[5];
LedBuff[1] = LedChar1[4];
LedBuff[2] = LedChar1[3];
LedBuff[3] = LedChar1[2];
LedBuff[4] = LedChar1[1];
LedBuff[5] = LedChar1[0];
}
else
{
LedBuff[0] = LedChar[5];
LedBuff[1] = LedChar[4];
LedBuff[2] = LedChar[3];
LedBuff[3] = LedChar[2];
LedBuff[4] = LedChar[1];
LedBuff[5] = LedChar[0];
}
flag=-flag;
}
//以下代码完成数码管动态扫描刷新
if (i == 0)
//74HC138三个使能端控制选择的数码管
{ ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; }
else if (i == 1)
{ ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; }
else if (i == 2)
{ ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; }
else if (i == 3)
{ ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; }
else if (i == 4)
{ ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; }
else if (i == 5)
{ ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; }
}
}
}