STC89C52-数码管

一、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]; }
           
        }
    }
}

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值