单片机学习小组
直播中

一曲作罢

9年用户 865经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术
私信 关注

如何去实现八位数码管的静态与动态显示代码呢

八位数码管的原理是什么?

如何去实现八位数码管的静态与动态显示代码呢?

回帖(1)

张鑫

2022-2-23 09:27:08
一、数码管原理图


开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极);a–dp分别控制数码管每一位的八个段。它们两又分别被锁存器U6和U7控制着。



当com端为高电平,对应的a–dp为低电平时相应段码就会亮。如:com1为高电平,com2–com8为低电平,此时让dp为低电平,a–g为高电平,则第一个数码管只有dp亮,也就是亮一个点。

由于段码有八个,如果一个一个赋值很麻烦,因此一般用十六进制数一次性给段码进行赋值。十六进制数控制的段码显示如下:


二、数码管显示代码


下面举几个例子:
1、让数码管八个位都显示6(数码管静态显示)

#include"reg52.h"
***it HC138_A = P2^5;//定义译码器中ABC所在引脚
***it HC138_B = P2^6;
***it HC138_C = P2^7;

void Show_SMG()
{      
        HC138_C = 1;  //给CBA赋值,打通U6
        HC138_B = 1;
        HC138_A = 0;
        P0 = 0xff;   //com1-8设为高电平
      
        HC138_C = 1;  //给CBA赋值,打通U7
        HC138_B = 1;
        HC138_A = 1;
        P0 = 0x82;  //给八个段赋值显示6
}

void main()
{
        while(1)
        {
        Show_SMG();
        }
}
2、让数码管八个位从0显示到9(数码管静态显示)


为了方便,我们将所有要用的段码放在一个数组中;将选择锁存器的代码也进行优化,要理解这些的原理都要将十六进制转化为二进制来理解。

#include"reg52.h"

unsigned char SMG_Duanma[12] =
        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
         0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
void Delay(unsigned int t)
{
        while(t--);
}

void SelectHC573(unsigned channel)  //选择锁存器
{
        switch(channel)
        {
                case 6:  //选择U6锁存器
                  P2 = P2 & 0x1f | 0xc0;
                break;
                case 7:  //选择U7锁存器
                      P2 = P2 & 0x1f | 0xe0;
                  break;
        }
}

unsigned char i;
void ShowSMG()
{
        SelectHC573(6);
        P0 = 0xff;  //com1-8设为高电平
        SelectHC573(7);
        for(i = 0; i<=9; i++)
        {
                P0 = SMG_Duanma;
                Delay(50000);
                Delay(50000);
        }      
}

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

}

3、让数码管从0显示到99(数码管动态显示)


动态显示原理:让不同位的数码管只亮一小段极小时间,从而造成视觉暂留效果,人眼无法识别这极小段的熄灭时间,从而觉得这些不同位数码管是同时亮的。

上代码:

#include"reg52.h"

unsigned char SMG_Duanma[12]=
        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
         0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
         
void Delay(unsigned int t)
{
        while(t--);
}

void SelectHC573(unsigned char channel)
{
        switch(channel)
        {
                case 6:  //选择U6锁存器
                       P2 = P2 & 0x1f | 0xc0;
                 break;
                 case 7:  //选择U7锁存器
                    P2 = P2 & 0x1f | 0xe0;
                  break;
        }
}

void ShowSMG_Bit(unsigned char pos,  unsigned char value)  //pos位显示value
{
        SelectHC573(6);
        P0 = 0x01 << (pos - 1);
        SelectHC573(7);
        P0 = value;
        Delay(200);  //消影
        P0 = 0xff;   //消影
}

unsigned char i, j;
void DelaySMG(unsigned int t)
{
        while(t--)
        {
                ShowSMG_Bit(1, SMG_Duanma);  //第一位显示SMG_Duanma
                Delay(200);
                ShowSMG_Bit(2, SMG_Duanma[j]);  //第二位显示SMG_Duanma[j]
                Delay(200);
        }
}

void ShowSMG()
{
        for(i = 0; i<=9; i++)      
                for(j = 0; j <= 9; j++)
                {      
                        ShowSMG_Bit(1, SMG_Duanma);  //第一位显示SMG_Duanma
                        DelaySMG(200);
                        ShowSMG_Bit(2, SMG_Duanma[j]);  //第二位显示SMG_Duanma[j]
                        DelaySMG(200);
                }                       
}

void main()
{
        while(1)
        {
                ShowSMG();
        }
}
                 
         
         
      
        ```
举报

更多回帖

发帖
×
20
完善资料,
赚取积分