11 动态数码管

单片机STC89C52学习——11 动态数码管

汇总:00 单片机STC89C52学习
参考教程:普中科技

1 工作原理

1.1 数码管动态显示原理

动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

1.2 74HC138芯片

三通道输入、八通道输出译码器


11 动态数码管_第1张图片
原理图

11 动态数码管_第2张图片
管脚说明

2 程序:动态数码管——依次显示76543210

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code LEDSeg[] = {0x3f , 0x06 , 0x5b , 0x4f , 
                    0x66 , 0x6d , 0x7d , 0x07 , 
                    0x7f , 0x6f , 0x77 , 0x7c ,
                    0x39 , 0x5e , 0x79 , 0x71};

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

void DigiDisplay()
{
    u8 i;
    for (i = 0; i < 8; i ++)
    {
        switch(i)
        {
            case 0:
                LSA = 0; LSB = 0; LSC = 0;
                break;
            case 1:
                LSA = 0; LSB = 0; LSC = 1;
                break;
            case 2:
                LSA = 0; LSB = 1; LSC = 0;
                break;
            case 3:
                LSA = 0; LSB = 1; LSC = 1;
                break;
            case 4:
                LSA = 1; LSB = 0; LSC = 0;
                break;
            case 5:
                LSA = 1; LSB = 0; LSC = 1;
                break;
            case 6:
                LSA = 1; LSB = 1; LSC = 0;
                break;
            case 7:
                LSA = 1; LSB = 1; LSC = 1;
                break;
        }
        P0 = LEDSeg[i];
        delay(100);// 约1ms
        P0 = 0x00;// 消隐,防止重影
    }
}

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

效果:同上一次,经测试位选没问题,段选总是显示"8."即0xff,暂未找到原因。这次表现出全是“8.”。结果第二天同样的程序成功了,但是不稳定...

你可能感兴趣的:(11 动态数码管)