0%

数码管显示原理及应用实现

前面学过了发光二极管的控制,再来讲数码管精容易理解了。

静态/动态数码管显示

数码管工作原理简介

数码管其实就是几个LED灯组合在一起,所以我们操作数码管也就是操作LED灯。
在这里插入图片描述
图中七个组成数字的LED加一个小数点LED一共八个LED灯管,如果我们要显示1,那就把b和c点亮,其他类推。

共阴极/共阳极接法

这八个LED连接的方法有两种,共阴极和共阳极,下图左边是共阴极,右边是共阳极

共阴极中,我们给端口输入高电平,LED就会亮
共阳极中,我们输入低电平LED亮。

位选/段选

如果我们要显示一个8位数,那么我们要控制8个字段,每个字段有8个LED,我们将选定控制哪一位字段的过程叫做位选,将选定控制某一字段中的哪一个LED的过程叫做段选。

静态显示

静态显示特点是每一位数码管都要接到一个八位数据线来保存显示字形码。送入字形码后显示的字形可一直保持。
比如假设现在我们要显示一个两位数,那么我们可能需要单片机的P1与P2接口,每个接口的8位分别连接两位数码管的八个LED,以此来控制每一位数字的显示。

动态显示

静态显示的缺点显然就是占用单片机太多,如果我们需要显示一个8位数,那就需要64个引脚。
动态显示将所有数码管段选线并联在一起,有位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示,轮流向各数码管发送字形码,利用数码管的余辉喝人眼的视觉暂留作用,使人感觉各位数码管在同时显示。

本实验板的电路图


这就是HC6800—ES V2.0的数码管的电路。左端的138译码器用来位选,其左上角有ABC三个端口,三端口分别接在P22P23P24引脚上,数值分别是0或1,组成一个三位二进制数,其数值介于0~7之间,用来表示8位数码管。右图左下角是一个573锁存器,在这里的功能是控制某一位上的八个LED灯管,用P0的八位针脚来表示。这样,我们控制单片机的11个引脚,实现了对64个LED的控制。

关于锁存器

这块实验板上的锁存器功能体现的不明显,我们以天翔电子的TX-1C为例。
那块板子上的段选和位选都是由573锁存器来控制,每个锁存器都有一个锁存端,就是上图中的右图左下角LE端口。当LE打开,锁存器内部导通,上图可以看出锁存器左端接一个个引脚,右端接段选线控制LED,内部导通时引脚输入什么数,右端就会输出 什么数,左端的数会传导到右端。当LE关闭时,内部不导通,左端将保持原来的值不变。
在TX-1C中,我们用两个引脚控制两个锁存器的锁存端,两个锁存器再共用8个引脚做位输入,一共10个引脚完成控制。
位选时,位选锁存器打开,8个引脚输入相应数值(11111110表示控制第一个数码管,11111101表示控制第二个,类推),再关闭锁存器,保存这一数值。接着打开段选的锁存端,输入相应的字形码以控制某一个数码管显示什么数字。

实验程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<reg52.h> 

typedef unsigned char uchar;
typedef unsigned int uint;

sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
uint code smgwei[9][3]={0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1}; //位选,code将数组存在ROM中
uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0,1,2....的字形码

void delay(uint i){
while(i--);
}
void smg(uint i,uint j){
lsa=smgwei[i][2];lsb=smgwei[i][1];lsc=smgwei[i][0]; //位选赋值
P0=smgduan[j]; //断选
delay(100); //因为要以一定的频率刷新,所以需要延时一定时间
P0=0x00; //归零一下,否则在下一位数码管会出现残影
}
void main()
{
uint i;
while(1){
for(i=0;i<8;i++){
smg(i,i); //第一位到第八位分别显示0~7
}
}
}