在学习完LED的知识后,可以通过IO口进行输入和输出高低电平使其点亮,还可以通过按键控制的方式来实现LED的动态显示,在学习数码管之前要认识74HC138译码器和动态数码管模块
一、74HC138译码器模块
74HC138是一个3-8线译码器,有三个(A,B,C)地址输入,三个使能输入,八个输出。当使能条件满足时,根据地址输入的值,对应的输出变为有效电平(低),其余无效。应用包括地址译码、存储器选择、数据分配等。使用时需要注意使能端的正确连接,以及输入和输出的电平匹配。
我们可以看下74HC138译码器的真值表
例:当输出LED1时,需要对IO口的P2的三个引脚进行输入低电平,使其Y0有效输出低电平,其余为高电平就可以点亮LED1。
二、动态数码管模块
下面是动态数码管模块的原理图
74HC245是一个双向数据缓冲器通过 方向控制(DIR) 和 输出使能(OE) 实现了灵活的双向数据传输,其高驱动能力、低功耗和三态输出特性使其成为数字系统中总线管理的核心器件。
以原理图共阴极数码管为例需要接入高电平使其点亮,只需要给段选进行相应的操作即可显示数码管相应的数字。
三、静态数码管显示
我们知道了138译码器的功能P2口输入地址,对应LED的输出,可以通过真值表进行判断锁定哪一个LED,判断数码管是共阴极还是共阳极,输入高低电平使其点亮。
代码如下:
#include <REGX52.H>void main()
{ P2_4 = 0;P2_3 = 0;P2_2 = 0;P0 = 0x5B;//0101 1011while(1){ //}
}
这个代码使数码管LED1显示数字2 ,下面的LED点亮是因为引脚冲突不用在意。
四、动态数码管显示
动态数码管显示其实是利用人眼的视觉暂留效应,需要注意消隐的问题,即在切换数码管时,先关闭所有位选,再更新段选数据,最后打开新的位选,以避免在切换过程中产生闪烁或残影。这可以通过在切换前关闭位选信号,更新数据后再开启来实现。
我们可以通过延时函数(Delay)来解决消隐问题。
代码如下:
#include <REGX52.H>unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管数字显示void Delay(unsigned int xms) //@11.0592MHz
{unsigned char data i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}}void Nixie(unsigned char Location,Num)
{switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Num];//使用数组下标进行访问
}
void main()
{ while(1){ Nixie(1,1);Delay(500);Nixie(2,2);Delay(500);Nixie(3,3);Delay(500);}
}
数码管以数字1,2,3,500ms进行间断显示。