51单片机 数码管的显示与译码器

共阳极数组0~9:display[]={0xC0,0xF9,0xA4,0xB0,0x91,0xA2,0x82,0xF8,0x80,0x90}

共阳极数组A~F:display[]={0x88,0x83,0xA6,0xC1,0x86,0x8E}

 

共阴极数组0~9:display[]={0x3F,0x06,0x5B,0x4F,0x6E,0x6D,0x7D,0x07,0x7F,0x6F}

共阴极数组A~F:display[]={0x77,0x7C,0x59,0x3E,0x79,0x71}

 

共阴、两组四位一体数码管,位选接74LS138译码器,输入(位选)CBA接P20,P21,P22。段选通过74573后接P1口。

若不使用译码器,可直接将位选段接IO口,赋值改变。


/*******************************************************************************
* 实 验 名         : 动态数码管显示
* 实验说明         : 8位数码管依次显示0~7
* 作    者         : L2
* 时    间         : 2016-08-02

*******************************************************************************/
#include<reg51.h>

#define GPIO_DIG P1         //Digitron  数码管
sbit LSA= P2^0;
sbit LSB= P2^1;
sbit LSC= P2^2;

unsigned char code DIG_CODE[10]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //0~9的显示码
void DigDisplay();

void main(void)
{
    while(1)
        DigDisplay();                
}


void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)     //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位    
        }
        GPIO_DIG=DIG_CODE[i];//发送段码
        j=10000;                         //扫描间隔时间设定,若减少j,可观察到稳定显示的0~7 (扫描速度太快,人眼识别不了)
        while(j--);    
        GPIO_DIG=0x00;//消隐
    }
}


posted @ 2016-08-06 13:25  Aurora_l  阅读(518)  评论(0编辑  收藏  举报