LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成"8"字器件
51单片机是共阴极连接
74HC245这个芯片有什么作用呢?解:这个芯片被称之为双向数据缓冲器这个芯片的作用,用来进行数据缓冲(提高驱动能力)的。那么缓冲这个是什么意思?
假设我们给上二进制,就从A0到达B0这是连接的关系,DIR如果接的是高电平(1)那么就能把左边的数据接到我们右边的数据上。电容(100nf)在这里的作用是:芯片的供电更加稳定叫做电源滤波
静态数码管显示:
确定阴码(选择第几个数字):根据译码器的CBA表示
确定阳码(具体哪个段亮):通过abcdefg(dp)组合出01序列,经过双向数据缓冲器后高位对高位(逆序)
选择第六个数字:
LED3 -> Y2 -> 010 -> P2_4=0;P2_3=1;P2_2=0;
显示"6":
abcdefg(dp) -> 10111110 -逆序-> 0111 1101 -> P0=0x7d;
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char location, Number){
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[Number];
}
void main(){
Nixie(2, 2);
while(1){}
}
动态数码管显示:
消影:
当我们要显示数码管的时候首先要:位选 段选、还要显示的话就还要 位选、段选,循环。
那么这样就会出现问题:首先是选择"位选端"给上低电平,然后是段选给上数据,然后给上下一位位选的数据。但是:由于我们单片机的速度是很快的,在段选到下一个位选之间就会出现问题。我们选中下一位这个时刻很短的时间内,上一个数据就会串到下一个数据。因为它们是挨着一起的,我在选中下一位之后 上一位的数据自然是会直接过来的。这样就会显示出数据的串位的问题了!
那么我们应该怎么避免这个问题?那我们就需要在上一个段选端给清零,这样即使到下一位它也不会对上一位产生影响!因为以及清零了。所以在子函数上需要优化下,显示完之后我们首先要延迟1ms这个是为了能让程序更加稳定显示,并且 进行清零!
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms)
{
unsigned char i, j;
i = 2;
j = 239;
while(xms--){
do{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char location, Number, short dp){
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 = dp ? NixieTable[Number] | 0x80 : NixieTable[Number]; // 可以显示小数点
Delay(1);
P0 = 0;
}
void main(){
while(1){
Nixie(1, 1, 1);
Nixie(2, 2, 0);
Nixie(3, 3, 1);
Nixie(4, 4, 0);
}
}
数码管驱动方式:
- 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
- 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉她显示什么即可(TM1640)
静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个的单片机I/O口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
- 静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多。
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制。
所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的。
流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的。
- 动态驱动的优点是能够节省大量的I/O端口,而且功耗更低。缺点是花费cpu占用时间,编程较为复杂。