数码管,顾名思义就是用于显示数字的,无论是小型的闹钟、门牌指示等,还是大型的红绿灯、显示屏等,都是由最基础的LED拼凑而成。
数码管分为共阳极(+极接一起图b)和共阴极(-极接一起图c),将8个LED按照一定字符形状摆放即可显示不同数字。
单个数码管使用如上图,可发现要想显示数字0,那么abcdef亮,g和dp灭,如果是共阳极,那么abcdefg=0,对应的LED亮,编码后位dpgfedcba =11000000’b=0xC0,相反如果是共阴极,那么abcdefg=1,与共阳极相反,编码后段码位:0x3F,可以反向2者是取反的,即0x3F+0xC0=0xFF (或0x3F = ~ 0xC0)。
当2个数码管并排如上图,可发现有5和10引脚作为共阴极公共引脚,例如3 号引脚=1,如果P5=0,P10=1,那么第一个数码管的A灭,第二数码管的A亮;如果如果P5=0,P10=0,那么2个数码管的A都亮。这样就可以想亮哪个LED就亮哪个LED。
显示0-9那么就需要对数码管进行编码,共阴极和共阳极编码是相反的。
0——00111111——0x3F
1——00000110——0x06
2——01011011——0x5B
3——01001111——0x4F
4——01100110——0x66
5——01101101——0x6D
6——01111101——0x7D
7——00000111——0x07
8——01111111——0x7F
9——01101111——0x6F
74HC373驱动芯片的使用详情请见LED点灯部分。
那么8位数码管是如何显示的呢?
肉眼看到的是0-7是“静止”显示的,但实际上是一个个扫描动态显示的,当刷新频率较高时,就相当于是“静止”的。人眼能看到的动态刷新是50Hz,如灯泡的频率就是220V/50Hz。
那么8位数码管“静止”显示就需要至少400Hz。例程中是直接放在主函数中一直循环,而时钟是11.0592MHz,算上程序执行的延时,显示8位数码管绰绰有余。
肉眼看到的是0-7是“静止”显示的,但实际上是一个个扫描动态显示的,当刷新频率较高时,就相当于是“静止”的。当动态刷新>=50Hz时,人眼就会看到显示是“静态的”,如灯泡的频率就是220V/50Hz。
那么8位数码管“静止”显示就需要至少400Hz。例程中是直接放在主函数中一直循环,而时钟是11.0592MHz,算上程序执行的延时,显示8位数码管绰绰有余。
还有一个问题:残影。当数码管扫描时,如果扫描过快,上一次显示还没有结束,下一次显示就到来,那么会看到数码管上有多余的残影。因此在编程中会加上消影的小段程序。
程序解读:
首先位选,显示哪一个数码管;
然后段选,选择显示的数字;
最后进行消隐,并循环8次进行。
#include <main.h>
void main(void)
{
static uint8_t i = 0;
SEG.Init(); //SEG初始化
while(1)
{
for(i = 0;i < 8;i++) //动态显示0-7
{
SEG.Display(i,i);
}
}
}
例程详情请见:C51 Proteus仿真板TB链接
https://item.taobao.com/item.htm?ft=t&id=659157293088
如需Proteus和Keil安装包,请关注公众号:
Proteus仿真店子