本文已参与「新人创作礼」活动,一起开启掘金创作之路。
- 多位数码管显示原理 在多位LED显示时, 由于静态显示占用的I/O口线较多,CPU的开销很大, 所以为了节省单片机的I/O口线, 简化硬件电路, 常采用动态扫描方式来作为LED数码管的接口电路。 在实际的工程应用中, 它是使用最为广泛的一种显示方式, 其接口电路是把所有显示器的8个笔划段h~a 同名端连在一起, 而每一个显示器的公共极COM 端与各自独立的I/O口连接。当MCU向字段输出口送出字形码时, 所有显示器接收到相同的字形码, 但究竟是那个显示器亮, 则取决于COM 端, 而这一端是由I/O口控制的, 所以我们就可以自行决定何时显示哪一位了。
- 动态扫描 而所谓动态扫描就是指我们采用分时的方法, 一位一位地轮流控制各个显示器的COM 端, 使各个显示器每隔一段时间点亮一次。 在轮流点亮的扫描过程中, 每位显示器的点亮时间是极为短暂的(约1 ms左右) , 由于人的视觉暂留现象及发光二极管的余辉效应, 尽管实际上各位显示器并非同时点亮, 但只要扫描的速度足够快, 给人的印象就是一组稳定的显示数据, 不会有闪烁感。 LED不同位显示的时间间隔可以通过定时中断完成。 如对8位LED显示器, 扫描显示频率为50Hz,假如显示一位保持1 ms时间, 则显示完所有8位只需8ms, 于是另外1 2ms时间内, CPU完全可以处理其它工作。 上述保持1 ms的时间应根据实际情况而定, 不能太短, 时间太短发光二极管发光太弱, 无法看清。但也不能太长, 时间越长, 占用CPU时间也越多,CPU处理其它工作的时间就越少。 动态显示方式实质是以牺牲CPU时间换取元件和能耗的减少。
注意: 在以扫描的方式显示多位数码管时,在切换到下一位数码管的显示之前,要做清屏操作,即让数码管熄灭。否则刚刚被被显示的图样会在下一位数码管上被短暂显示。导致显示不正常。 以下面的代码为例,在切换位之间的P1=0x00实现清屏操作。
void Display()
{
P1=dispbitcode[dispbuf[3]];
dis1=0;
dis2=1;
dis3=1;
dis4=1;
Delay(10);
// P1=0x00;
P1=dispbitcode[dispbuf[2]];
P17=1;
dis1=1;
dis2=0;
dis3=1;
dis4=1;
Delay(10);
// P1=0x00;
P1=dispbitcode[dispbuf[1]];
dis1=1;
dis2=1;
dis3=0;
dis4=1;
Delay(10);
// P1=0x00;
P1=dispbitcode[dispbuf[0]];
dis1=1;
dis2=1;
dis3=1;
dis4=0;
Delay(10);
// P1=0x00;
}
假使P1=0x00被注释,则在proteus中的仿真现象如图所示。
但如果消除注释加上清屏操作后,仿真结果便恢复正常。