数码管显示原理
又折腾了一个上午,经过昨晚 加上今天上午的奋斗,我终于弄懂了这个编辑文档的HTML方式,不得不吐槽一下,然后一个博客改了几次,辛苦那边的工作人员了。好,废话少说了,来整理一下今天的成果——数码管显示原理。
学一个东西最好按照需求来学,就比如今天的数码管显示原理,本意是要使用单片机上的数码管资源显示数字,为了能做到这一点,所投入的时间就会给我们带来收获。
要说明这个好像很复杂,那就从我要做的步骤开始。
1.数码管如何显示:
关于数码管的外形,看到单片机就知道,那就不上图了。首先整理一下所需要的基础知识。数码管其实就是8个LED灯,如果按照一位数码管来说的话。当然一组数码管含有许多位数码管,每位数码管含有7跟线条和一个小数点,跟控制LED灯一样控制就可以。数码管是封装好的电子器件,有共阴极和共阳极的区别,其区别就是点亮所需要的电平的高低不同。我所使用的单片机数码管是共阴极的,也就是说给高电平就可以点亮。一般不同的位置有不同的字母标注,可以控制哪个亮。
当然,数码管也由74HC573锁存器控制电平,8个输出端依次连接,锁存器输入端有不同的寄存器控制,这个不同是相对于前面控制LED灯而言的。
2.位选与段选:
现在正是开始点亮数码管了,好开心。前面说一组数码管含有许多位,如果是静态显示的话就要涉及到位选了,位选就是在一组数码管里面选出一个。这里有个问题,数码管一次其实只能显示一位,但是经常看到有好几位数码管显示了,这个数动态的不停扫描,利用视觉的残留形成的。好,开始位选了。不同的硬件,也就是不同的单片机位选系统是不一样的,有的是把位选的接口接到控制数码管的寄存器上,我学的书上就是这样,但是不凑巧,我的单片机是另外一种方式。将每个数码管接到138译码器上,通过控制LED的三个输出端有二进制控制数码管。关于138译码器的真值表在后面,当然我没有学数字电路,不知道逻辑运算的规则,但是可以理解成三个输入端口的二进制数的大小从右往左的控制。关于数码管的具体控制系统可以查看单片机电路原理图,后面也有我的单片机电路原理图。
位选之后就是段选,这个好理解,就是选择不同的根数进行点亮。
3.编写程序:
现在就是程序的落地了,从程序最容易了解这个知识。
1.1 静态显示
#include<reg51.h>
sbit s1 = P2^2;
sbit s2 = P2^3;
sbit s3 = P2^4;
void main()
{
s1 = 0;
s2 = 0;
s3 = 0;
P0 = 0xff;
}
分析一下这个代码。首先是把P2的三个特殊端口拿出来赋值,这三个就是位选的控制端。数对(0.0.0)可以组成二进制数000,当然可以组成其他的数字控制不一样的数码管。后面的P0好理解,这个时候位选已经好了,那么就可以给控制端输入信号开始段选了,0xff就是全部点亮。
1.2 动态扫描
#include<reg51.h>
sbit s1 = P2^2;
sbit s2 = P2^3;
sbit s3 = P2^4;
unsigned int code _code[] = {0xff};
void delay(unsigned int t);
void main()
{
while(1)
{
P0 = _code[0];
s1 = 0;
s2 = 0;
s3 = 0;
delay(100);
s1 = 0;
s2 = 0;
s3 = 1;
delay(100);
s1 = 0;
s2 = 1;
s3 = 0;
delay(100);
s1 = 0;
s2 = 1;
s3 = 1;
delay(100);
s1 = 1;
s2 = 0;
s3 = 0;
delay(100);
s1 = 1;
s2 = 0;
s3 = 1;
delay(100);
s1 = 1;
s2 = 1;
s3 = 0;
delay(100);
s1 = 1;
s2 = 1;
s3 = 1;
delay(100);
}
}
void delay(unsigned int t)
{
unsigned int i;
for(t;t > 0;t--)
for(i = 100;i > 0;i--)
;
}
这个是个傻逼程序,我直接枚举了所有的情况,但是具体意思到看。就是没有可能的组合都组合出来,不停地更换所操作的数码管。加了个延时可以更好的观察切换的过程。