38译码器驱动数码管电路图

使用38译码器来驱动数码管来节省IO端口

(1)什么是38译码器?

38译码器驱动数码管电路图_第1张图片

38译码器有3个输入端口A、B、C和8个输出端口Y0-Y7。由输入端口控制输出端口的值

(2)为什么要使用38译码器

38译码器驱动数码管电路图_第2张图片

回想之前的驱动动态数码管的时候,一个段码端口控制显示的数字,一个com端口控制哪个数码管工作,段码端口接8个IO引脚,com端口接8个IO引脚。这样很浪费IO口资源,为了节省IO资源,使用38译码器接在com口,这样可以使用3个输入引脚控制8个com端口了。J15接到J16端口。

(3)为什么3个输入端可以控制8个输出端口值?

3个输入端口,每一个端口有两种状态(0或1),3个端口可以组成8中不同的状态。

(4)3个输入端口如何控制8个输出端口?

根据74LS138芯片的数据手册查询38译码器芯片的译码表即可。

38译码器驱动数码管电路图_第3张图片

分析数据手册可以得到:

(1)G1、G2*两个端口是使能引脚,并且要想让38译码器工作,G1接高电平,G2*接低电平。所以看上面38译码器的原理图中G1接VCC,G2*接GND。

(2)当ABC三个输入端口输入不同的值时,Y0-Y7会对应的输出低电平,回想动态数码管是共阴数码管,而38译码器Y0-Y7默认输出高电平,这样衔接的天衣无缝。

实验分析:

第一步:八个数码管阳极接一个IO端口,来负责输出显示的数字(也就是输出对应的段码)。

第二步:八个数码管的com端分别接入38译码器的Y0-Y7引脚。由38译码器的ABC三个输入端来控制数码管的com端口从而达到控制哪个数码管工作的目的。

第三步:根据原理图接线,J15-J16、ABC分别接P1.0、P1.1、P1.2

第四步:测出数码管的段码和38译码器的译码表。

第五步:编程。

实验代码:

#include

void delay(void)

{

unsigned char i=0,j=0;

for(i=0;i<100;i++);

for(j=0;j<20;j++);

}

void main(void)

{

/* P0.0接到 A,P0.1接到B,P0.2接到C

P0端口是段码口,控制要显示的数字

P1端口是38译码器的端口,通过com端控制第几个数码管工作

*/

/* 测试38译码器的位码

c b a

000 Y0输出低电平 第1个数码管工作 对应十六进制数0x1

001 Y1输出低电平 第2个数码管工作 对应十六进制数0x2

010 Y2输出低电平 第3个数码管工作 对应十六进制数0x3

011 Y3输出低电平 第4个数码管工作 对应十六进制数0x4

100 Y4输出低电平 第5个数码管工作 对应十六进制数0x5

101 Y5输出低电平 第6个数码管工作 对应十六进制数0x6

110 Y6输出低电平 第7个数码管工作 对应十六进制数0x7

111 Y7输出低电平 第8个数码管工作 对应十六进制数0x8

*/

unsigned char duanma[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};

//段码

unsigned char weima[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7}; //38译码器的位码

unsigned char i=0;

while(1)

{

for(i=0;i<=7;i++)

{

P1=weima[i]; //38译码器的位码

P0=duanma[i]; //八个数码管的段码

delay();

P0=0; //消隐

}

}

}

实验总结:

(1)使用38译码器就是为了节省IO口,如果IO口够用可以不使用38译码器。

(2)动态数码管的阳极接在P0这个IO端口上,控制数码管显示的数字,阴极接在38译码器的八个输出引脚上Y0-Y7,Y0-Y7由38译码器的ABC三个输入引脚控制。控制哪个数码管工作。

(3)测试数码管的段码和38译码器的位码。

(4)先分析原理图看如何接线,再看38译码器的数据手册看它怎么工作。最后编程。

(5)着重实验分析过程,而非知识本身,多总结学习方法。

你可能感兴趣的:(科普,算法,单片机,嵌入式硬件,51单片机,物联网)