51单片机学习笔记5 数码管显示
- 一、动态数码管
-
- [1. 动态数码管工作原理](#1. 动态数码管工作原理)
- [2. 工作过程](#2. 工作过程)
- [3. 原理图](#3. 原理图)
- [4. 74HC245介绍](#4. 74HC245介绍)
- [5. D74HC138 介绍](#5. D74HC138 介绍)
- [6. 代码实现](#6. 代码实现)
一、动态数码管
1. 动态数码管工作原理
动态数码管是一种常见的数字显示设备,通常由七段LED组成。每个数码管都有七段LED分别表示数字的不同部分,通过控制这些LED的亮灭,可以显示数字0到9以及一些字母。
在动态数码管中,每个数码管的七段LED是依次被控制的,通过快速地依次使每个数码管的七段LED亮起,可以形成多位数字的连续显示效果。
单片机通过扫描技术和适时的输出控制信号,使得数码管的各个段依次显示所需的数字或字母。
动态数码管特点:
动态数码管具有显示效果清晰、功耗低、寿命长、驱动电路简单等特点,广泛应用于计时器、电子表、计数器等设备中。
由于动态数码管需要单片机不断地扫描和控制,因此需要一定的处理能力和时间,适合用于单片机控制的场合。
我使用的普中开发板,使用 74HC245 作为动态数码管的驱动器,使用 D74HC138 作为译码器。
2. 工作过程
- 首先,单片机输出控制信号,选择要显示的数码管。
- 然后,单片机根据要显示的数字或字母,通过输出控制信号,通过D74HC138,连接 74HC245,控制对应的七段LED灯亮起或熄灭。
- 单片机通过不断地切换显示的数码管,并控制每个数码管的七段LED灯,实现多位数字或字母的连续显示效果。
3. 原理图
(1)数码管及74HC245
(2)74HC138译码器
4. 74HC245介绍
74HC245是一款常用的8位双向电平转换器,也被称为总线驱动器。它常用于数字系统中的数据总线扩展、电平转换以及信号缓冲等应用,其主要特点:
- 高速:74HC245具有较高的数据传输速率,适用于高速数字系统。
- 低功耗:它的静态功耗较低,适用于功耗要求较低的应用。
- 低电平输出:74HC245的输出端口可以提供低电平输出,适用于5V和3.3V系统之间的电平转换。
其管脚定义:
(1)功能
- 74HC245具有8位双向数据传输功能,可以将数据从一个总线转移到另一个总线,并在两个方向上进行数据传输。
- 它还具有电平转换功能,可以将高电平信号转换为低电平信号,反之亦然。
- 74HC245还具有输出使能功能,可以通过控制输入引脚来控制数据的传输使能。
(2)引脚
-
74HC245具有16个引脚,分为两组,每组包含8个数据引脚和一个使能引脚。
-
数据引脚用于连接输入或输出数据总线。
-
使能引脚用于控制数据传输的使能。
-
OE 是输出使能引脚,L 表示输出使能,H 表示输出禁用。
-
DIR 是方向控制引脚,L 表示数据从A端到B端传输,H 表示数据从B端到A端传输。
(3)工作原理
- 74HC245的工作原理基于双向缓冲器的原理。当使能引脚为高电平时,数据可以从A端传输到B端,并且数据也可以从B端传输到A端。
- 当使能引脚为低电平时,输入和输出端口之间的连接被切断,此时输入数据不会传输到输出端口,输出端口也不会对输入数据进行响应。
(4)真值表
5. D74HC138 介绍
D74HC138是一种八线三至八译码器,也被称为3-8译码器。它通常用于数字系统中的地址译码、片选信号生成等应用,用于将三位二进制地址转换为八个输出端口中的一个低电平输出。它具有快速响应、低功耗、高阻抗输入端口等特点。
管脚定义:
(1)功能
- D74HC138具有八个输入端口(A0-A2),可以接受三位二进制地址输入。
- 它有八个输出端口(Y0-Y7),每个输出端口对应一个使能输入端口(G1、G2A、G2B),输出对应的输出端口为低电平。
- D74HC138将三位输入地址转换为八个输出端口中的一个为低电平,其余输出端口为高电平。
(2)引脚
- A0-A2:三位地址输入端口,接受二进制地址输入。
- Y0-Y7:八个输出端口,其中一个为低电平,其余为高电平。
- G1、G2A、G2B:使能输入端口,通过这些端口控制输出的使能状态。
(3)工作原理
- 当输入地址的二进制值与译码器的某个输出对应时,该输出端口将产生低电平输出,其余输出端口为高电平。
- 通过使能端口G1、G2A、G2B来控制译码器的工作状态,使能信号为高电平时,译码器处于工作状态,可以根据输入地址产生对应的输出信号。
(4)真值表
6. 代码实现
下面代码实现的功能,每1秒在一个数码管上显示当前的数值,即第一个数码管显示0,第二个数码管显示1,以此类推 。
下面定义的gsmg_code中的含义,以0x3f为例,换算成二进制: 00111111,根据电路原理图:
可以看出赋值情况:
- a 引脚 P00=1
- b 引脚 P01=1
- c 引脚 P02=1
- d 引脚 P03=1
- e 引脚 P04=1
- f 引脚 P05=1
- g 引脚 P06=0
- dp 引脚 P07=0
最终在数码管上就会显示数值 0。
c
#include "segment_display_utils.h"
#include "types.h"
#include "common_utils.h"
#define SMG_A_DP_PORT P0
// 3-8译码器控制端口
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71, 0x00};
void segment_display() {
u8 i=0;
for(i=0;i<8;i++){
switch(i){
case 0:
// 选择第一位数码管,即数码管1, 通过3-8译码器,转换为二进制码111,即7,即选中LED8
LSA = 1; LSB = 1; LSC = 1;
break;
case 1:
LSA = 0; LSB = 1; LSC = 1;
break;
case 2:
LSA = 1; LSB = 0; LSC = 1;
break;
case 3:
LSA = 0; LSB = 0; LSC = 1;
break;
case 4:
LSA = 1; LSB = 1; LSC = 0;
break;
case 5:
LSA = 0; LSB = 1; LSC = 0;
break;
case 6:
LSA = 1; LSB = 0; LSC = 0;
break;
case 7:
LSA = 0; LSB = 0; LSC = 0;
break;
}
SMG_A_DP_PORT = gsmg_code[i];
delay_ms(1000);
}
}
本文代码开源地址: