近日,有一位人找我问了一个数码管的问题,我一看他的板子上面有位选和段选引脚,我就知道他的板子肯定没有74HC138芯片的,经过确认,果真没有,那我们先说什么是位选和段选呢?
1.1段选与位选
段选就是你想要数码显示什么数字,如图,有a、b、c、d、e、f、g、dp,共8段,通过配置这8段的高低电平就可以达到显示0-F的效果。
?
位选则就是数码管需要显示的位置,比如4位一体的数码管,我需要他显示在第3个位置,这就是位选。
1.2有74HC138芯片的配置
如图可以看到,数码管一般是由74hc138与74hc245驱动的,但是没有138译码器也是可以的,下面会有具体的讲解。
贴上代码(有138译码器)
#include <REGX52.H>
//显示0-9,定义数组,确定自己的是共阴极还是共阳极连接
unsigned char smg_code[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*有138芯片配置*/
//location:显示位置,即位选
//num:显示的数字,即段选
void smg(unsigned int location, num)
{
switch(location)
{
case 1: P2_4=1; P2_3=1; P2_2=1; break;//7,对应数码管第一个位置
case 2: P2_4=1; P2_3=1; P2_2=0; break;//6
case 3: P2_4=1; P2_3=0; P2_2=1; break;//5
case 4: P2_4=1; P2_3=0; P2_2=0; break;//4
case 5: P2_4=0; P2_3=1; P2_2=1; break;//3
case 6: P2_4=0; P2_3=1; P2_2=0; break;//2
case 7: P2_4=0; P2_3=0; P2_2=1; break;//1
case 8: P2_4=0; P2_3=0; P2_2=0; break;//0
}
P0 = smg_code[num];
}
void main()
{
smg(4,7);
while(1)
{
}
}
1.3无74HC138的配置
看图,没有138译码器,但是多了一个锁存器芯片573,可以看到DULA连接到了P2.6上面,是段选,控制a、b、c、d、e、f、g、dp,的亮灭,也就是说,在使用段选时,必须要把P2.6拉高,打开锁存端口,在进行配置,配置完之后记得置0关闭锁存端口。同理,WELA连接到了P2.7,也需要打开锁存端口才能配置。具体二进制配置应该不要多说。
代码如下
/*在第3个数码管显示6*/
#include <REGX52.H>
/*有些同学会使用下面这个头文件,注意,此头文件没有P2_1这种类似的定义,如需使用,必须位定义,使用方法如下*/
//#include <reg52.h>
//sbit DU = P2^6;
//sbit WE = P2^7;
unsigned char smg_code2[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf};//后面自行补充,数码管显示位置
void main(void)
{
P2_7 = 1;//位选引脚打开
P0 = smg_code2[3];//第3个位置
P2_7 = 0;//位选引脚关闭
P2_6 = 1;//段选引脚打开
P0 = smg_code[6];//显示6
P2_6 = 0;//段选引脚关闭
while(1)
{
}
}
1.4总结
可以看出,两者还是有一些区别的,但是逻辑是差不多的,所以说我们编程之前可以先看看自己的原理图是哪种,再来具体的写代码。
以上就是我对数码管的理解,有什么错误的地方欢迎在评论区指出。
?
本文暂时没有评论,来添加一个吧(●'◡'●)