C51 动态数码管 个人笔记

8段led管构成一个数字。
开发板上共有8个数字。
每个数字有一个使能端(段选引脚)
每个数字的位选端(选择8段led管哪些亮,即构成什么图案)并联在一起
轮流点亮不同数字,速度很快,视觉暂留,从而形成8个数字同时亮的效果

#include <reg51.h>
typedef unsigned int u16;        
typedef unsigned char u8;

#define DIG P0
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;


//共阴的表
u8 code ledSegment  [9] = { 0x3f , 0x06,   0x5b,   0x4f,   0x66,   0x6d, 0x7d,   0x07,  0xe6
                            };

void delay(u16 i)
{
    while(i--);
}

void DigDisplay()
{
    u8 i;
    
    for(i=0;i<8;i++)
    {
    //段选,使能8个数码管中的某一个
    //38译码器输出端和动态数码管段选端短接
        switch(i)
        {
            case (0):       //段选选中第一个动态数码管,(共阴,J16^1是公共阴极,输出低电平)
                LSA = 0;     //J15(38译码器输出)和J16(数码管输入)用短接片短接
                LSB = 0;     //故J15^1即38译码器输出端Y0与J16^1相同,为低电平
                LSC = 0;    //因此38译码器输入端为000(由真值表知A0是低位,A2是高位)
                break;
            case (1):   LSC = 0;LSB = 0;LSA = 1;break;
            case (2):   LSC = 0;LSB = 1;LSA = 0;break;
            case (3):   LSC = 0;LSB = 1;LSA = 1;break;
            case (4):   LSC = 1;LSB = 0;LSA = 0;break;
            case (5):   LSC = 1;LSB = 0;LSA = 1;break;
            case (6):   LSC = 1;LSB = 1;LSA = 0;break;
            case (7):   LSC = 1;LSB = 1;LSA = 1;break;
        }
    //--位选,选择被使能的数码管中,哪几段点亮,(显示什么数字)
    //P0端口控制动态数码管的8个位选引脚J12
        DIG = ledSegment[i];  //     共阴,高电平有效
        delay(200); //短暂延时1ms   (去掉或改变时间长度可能会变亮变暗)
        DIG = 0x00;
    }    
}
void main(void)
{  
    while(1)
    {
        DigDisplay();  
    }
}

猜你喜欢

转载自www.cnblogs.com/YuQiao0303/p/9936473.html