51单片机功能模块学习笔记 — 数码管

1. 共阳数码管的基本连接方式

这里写图片描述

如上图所示,当数码管的公共段连接到电源时,就被称为共阳数码管。那么,相应的共阴数码管就是公共段连接到地的一类数码管。

2.数码管的显示原理

根据数码管的显示原理:可分为共阴数码管和共阳数码管这里写图片描述

如上图所示,左图所有的二极管的公共段都被连接到地,如果我们想要在a-dp上有所显示,就应该在对应端口送“1”。同理,如果我们想要使得共阳数码管上显示某些特定的字符,就应该在对应位送“0”。

根据这个原理,我们可以算出0-F对应的共阴数码管和共阳数码管显示的十六进制字符。我们可以将所有字符放在一个数组里面,以便查询。

下列是共阴极数码管和共阳数码管段码的常用码表总结:

unsigned char code distab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} //共阴数码管段选码表,无小数点

unsigned char code distab[16]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1} //共阴数码管段选码表,有小数点

unsigned char code distab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}  //共阳数码管段选码表,无小数点

unsigned char code distab[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e} //共阳数码管段选码表,有小数点

3.共阳数码管实验程序


/*利用共阳极数码管显示0-F*/

#define SEGPORT P0      

unsigned char code TableCA[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                                0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  //共阳极数码管码表


/*** 共阳数码管显示0-F  ***/
void ShowSegCA()
{
    unsigned char i;

    //查表显示
    for(i = 0;i < 16;i++)
    {
        SEGPORT = TableCA[i];
        delay_ms(100);
    }

}

4.八位共阴数码管模块连接方式

这里写图片描述

如上图所示,两个74HC573锁存器分别连接到数码管的段码和位码端,分别进行位琐存控制和段琐存控制。那么,锁存器到底是干什么的呢?

4.1锁存器的电路原理图
这里写图片描述

锁存器百度百科:

锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。

以下是我个人对于锁存器的理解:

    锁存器就像是一道门,平时的时候门并不打开。当锁存器的琐存使能有效时,这道们才打开。就举上面八位共阴极数码管的例子来说,我现在想要实现在第一位数码管上显示数字“0”。
    那我应该如何利用锁存器来工作呢?第一步,先选中第一个数码管。
    首先,将选中第一位数码管的数据发送到位锁存器,这时候位琐存的门还没有开;接着,使能位琐存,门开了,数据送到数码管,根据数据选中第一位数码管;最后,关闭门。(为什么一定要关闭门呢?因为段琐存的数据输入端口和位琐存数据的数据输入端口都是连接到同一个P0的。我们必须要让数码管区分到底是发送的是位选数据还是段选数据,所以一个位数据发送完,我们必须把门再关上。)第二部,发送段选信号。即将“0”的十六进制数据发送到段锁存器,段锁存器默认情况下数据是不会变化的。接下来的操作过程和位锁存器一样。完成这两步,即可以使得第一位数码管上显示数字“0”。

5.八位共阴极数码管实验程序

/*使得八位共阴极数码管上依次显示数字0-7 */

#include "bsp.h"

#define SEGPORT P0      
sbit Wei_LATCH = P2^0;   //位琐存信号
sbit Duan_LATCH = P2^1;  //段琐存信号


unsigned char code TableCA[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                                0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  //共阳极数码管码表
unsigned char code TableCC[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                                0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //共阴极数码管码表
unsigned char code TableSel[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //位选码表

/*** 共阳数码管显示0-F  ***/
void ShowSegCA()
{
    unsigned char i;

    //查表显示
    for(i = 0;i < 16;i++)
    {
        SEGPORT = TableCA[i];
        delay_ms(100);
    }

}

/*** 八位共阴极数码管分别显示0-8  ***/
void ShowSegCC()
{
    unsigned char i;

    for(i = 0;i < 8;i++)
    {
        SEGPORT = TableSel[i];
        Wei_LATCH = 1;
        Wei_LATCH = 0;

        SEGPORT = TableCC[i];
        Duan_LATCH = 1;
        Duan_LATCH = 0;

        delay_ms(200);
    }
}

Ps:若是博客中有问题,欢迎各位提出,大家一起学习,一起进步!
(●’◡’●)

猜你喜欢

转载自blog.csdn.net/csdnxmj/article/details/79179342