文章目录
1. 数码管应用场景
以下均是使用的数码管的场景
对于显示器件常见的有很多种,有数码管、LED点阵、LCD液晶以及TFD彩屏。
2. 数码管显示原理
上图分别为共阴极和共阳极的接法
数码管根据内部连接不同分为共阴极和共阳极。八段数码管内部有8颗LED组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。
根据原理图我们可以判断其是共阴极还是共阳极接法,那么拿到一个实物如何去判断呢?
我们拿到一个数码管可以看它是几个8,一个8表示一位,有几个8就表示有几位,以上图中一位的数码管为例,我们观察数码管上下的引脚,中间的GND均为一个公共脚,如果这个公共脚为GND表示共阴极,公共脚为VCC则表示共阳极。可以使用万用表去测,用黑表笔接到公共脚,将红脚笔假设接到a脚上,如果数码管“abcdefg”中的a亮了,表示这是一个共阴极的数码管,如果将表笔更换之后,a亮了,那么这就是一个共阳极的。(这是因为红表笔输出的是正电压,红表笔在公共脚上,黑表笔在a脚上)
假设我们要显示“1”,那么只需要将“bc”点亮,如果采用共阴极的接法,那么只需要将bc口送1,其他口送0即可,利用单片机控制如何实现呢?
也就可以发送16进制数来实现相应位的置值
以下是一位数码管的“共阴极数码管码表”
3. 静态与动态显示
3.1 静态显示
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选
必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
上面的含义举例就是:为了显示数字“1”,就需要P0=0x6,也就是8位数据线需为0x6。
段选: 也就是指上面提到的一位数码管“abcdefg dp”中的一个,公共脚称为位选
静态显示缺点为: 使用的IO口非常多,为了将8位数码管都进行显示值,假如要显示“12345678”,它每一位段选都需要8位数据线来控制,就需要64个IO口进行控制。
3.2 动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
同样的去显示“12345678”就只需要8位IO口结合锁存器就可以实现,所以静态显示用的非常少
4. 74HC573锁存器的工作原理
4.1 为什么需要使用锁存器
上面的8位数码管如果采用4个一组,段选为8段是固定的“ABCDEFGH”(H也就是dp)接到锁存器11-20引脚,8个数码管有8个位选公共极接到锁存器的11-20引脚,也就说控制8位数码管需要16个IO口进行控制,但是单片机上IO口总共就32个,接了很多外设,为了节省IO口使用锁存器,使用锁存器之后,只需要用到8个IO口就可以控制8位数码管。锁存器的作用也就是节省IO口,以下具体介绍锁存器的作用。
4.2 锁存器工作原理
锁存器作用: 可以把数据输入端D与输出端Q进行隔离或连接
- 输出口Q要想Q端输出高低电平OE脚必须接GND,当OE脚为高电平的时候,Q端为高阻态,也就是一个开路状态
- LE脚为高时,输出端Q随输入端D的数据而变化(在D端输入什么值,Q端也就是什么值,假设P0口给D端输入0x06,Q端也输出0x06,
相当于D和Q是直接相连
)。 - LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据(当LE脚为0时,此时Q端为0x06,此时接到D端的P0口如果要去控制别的东西,此时D0口要随着P0口发生变化,结社变为0x04,Q端的数值不变,还是保持0x06,
相当于D和Q是断开的
)。
以下就是真值表
在硬件选型的时候怎么知道芯片是如何工作的?
需要看芯片的原理图、data sheet(芯片的数据手册查询网址:alldatasheet.com)
5. 上拉电阻的作用
数码管接的是单片机的P0口,其如果要做准双向IO口使用的话需要加上拉电阻。
上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。
当P0口作为输入/输出口时,上电复位后处于开漏模式(可以输出低电平,不可以输出高电平)。P0口内部无上拉电阻,所以作I/O口必须外接10K-4.7K的上的上拉电阻(增加上拉电阻就既可以输出高电平又能输出低电平)
我们知道4组IO口中,P1P2P3是准双向,P0是开漏的
。
在主控芯片的P0口的外部是接了上拉电阻的,
-
左侧图为准双向IO,口线寄存器后是一个非门,后接一个场效应管的G栅极,其上方为D漏极,下为S源极,G和S之间要有一个正偏(正电压),D和S才导通。假设口线寄存器输入一个1,经过非门输出0,此时场效应管不导通,此时VCC为高电压和D连接,D经过内部上拉电阻上拉,输出一个高电平5V;若内部给0,经非门输出为1,GS之间存在正向电压(只要达到门限电压,GS之间导通),S接地,右侧管脚相当于接到地,它的电压就会被拉低,此时引脚的电压变为0V,准双向是可以正常输出高低电平的。
-
右侧图为漏极开路输出,漏极就是场效应管的上面的D极,开漏就是输出高电平的漏极与IO口的内部是不相连接的。假设内部输出一个1,经过非门输出为0,GS没有正向电压,DS不导通,D只与外部管脚连接,管脚是高是低无法确定,我们称之为高阻态(不确定的值);假设内部输出一个0,经过非门输出为1,GS之间有正向电压,DS导通,外部管脚连接通过DS接到地,外边管脚相当于接到地,管脚变为0V用来输出低电平,但是不能输出高电平
左右相差的就是一个VCC+上拉电阻
6. 本节相关原理图分析
此处提示:数码管锁存器模块中左侧的“D0-D7”网络标号表示上面的“74HC573”与下面“74HC573”对应的引脚连接到一起,“D0-D7”又同时接到单片机的“P0.0-P0.7”,这样就可以通过“P0.0-P0.7”连接8位数码管。
底下的数码管锁存器通过“A-H”接口,A接到数码管的A段,对应所有位数码管8顶上的一横,B对应数码管8右侧上的一竖。数码管锁存器D0接到P0,当打开锁存器的时候,D0和Q0数据是相同的,也就可以实现P0口控制A口的功能,“A-H”口的均采用该方法控制
上面的8位数码管如果采用4个一组,段选为8段是固定的“ABCDEFGH”(H也就是dp)接到锁存器11-20引脚,8个数码管有8个位选公共极接到锁存器的11-20引脚,也就说控制8位数码管需要16个IO口进行控制,但是单片机上IO口总共就32个,接了很多外设,为了节省IO口使用锁存器,使用锁存器之后,只需要用到8个IO口就可以控制8位数码管。
原理图解析:
使用2个锁存器,U9负责数码管的段选,U8锁存器负责数码管的位选,OE都接到了GND,LE是控制锁存与不锁存的脚,控制段的LE接到P26,控制位的LE接到P27,所以通过P26和P27就可以控制锁存器的开断,这样就可以分时复用P0口控制8位数码管,这就工作原理。
从原理图可以看到U9锁存器的Q端接了300Ω的排阻,其起到限流的作用,这是因为你锁存器是具有一定驱动能力的,不像单片机的IO口,其电流较大,可能会烧毁数码管。
7. 实践编程
7.1 单独一位数码管显示
#include <reg52.h>
#include <intrins.h>
#define unit unsigned int
#define uchar unsigned char
//对控制锁存器开通与关断的LE进行位定义
//查看电路原理图可以看到OE接的GND,Q0-Q7可以正常输出高低电平
//当LE接高电平,Q端随着D端变化,相当于D和Q是直接相连;LE接低电平,Q保持不变,不受D端干扰
//两个锁存器分别控制数码管的段和位,段选锁存器U9,其LE接的P26
sbit DU = P2^6; //数码管段选
sbit WE = P^7; //数码管位选
void main() //main函数自身就会循环
{
//结合原理图可以看到,让第一个数码管显示1
//让第一个数码管点亮的首要条件是让其位选,也就是给WE1一个0(共阴极),然后再控制段选
//LE接高电平,Q端随着D端变化
WE = 1; //打开位选锁存器
//P0控制U8 Q端的WE值,为了选中WE1,使WE1=0,其他WE为1,D端和Q端变化一致
P0=0xFE; //1111 1110
//LE接低电平,U8 Q端0xFE保持不变(U8的WE1=0),位选的锁存器相当于断开,这样P0的就可以在操作段选锁存器U9的时候,不影响位选锁存器
WE = 0; //锁存位选数据
//打开段选锁存器,U9的D和Q相通
DU = 1;
//bc亮,采用共阴极的接法,阳极需要为高电平1,bc为1,其他位为0
P0=0x06; //0000 0110
DU = 0; //段选锁存,锁存段选数据
//经过上面步骤,位选锁存在0xFE, 段选锁存在0x06,低位数码管显示为1
while(1)
{
}
}
以上代码输出一个1
7.2 多位数码管显示
如果想要8位数码管都显示为1,只需要将位选的值变为0x00,也就是以下代码:
#include <reg52.h>
#include <intrins.h>
#define unit unsigned int
#define uchar unsigned char
sbit DU = P2^6; //数码管段选
sbit WE = P^7; //数码管位选
void main() //main函数自身就会循环
{
WE = 1; //打开位选锁存器
P0=0x00; //0000 0000
WE = 0; //锁存位选数据
//打开段选锁存器,U9的D和Q相通
DU = 1;
//bc亮,采用共阴极的接法,阳极需要为高电平1,bc为1,其他位为0
P0=0x06; //0000 0110
DU = 0; //段选锁存,锁存段选数据
//经过上面步骤,位选锁存在0x00, 段选锁存在0x06,8位数码管显示为1
while(1)
{
}
运行结果如下:
需要注意:在同时位选和段选的情况下,P0发生变化事不会影响到数码管显示的。