许多时候,数码管与单片机几乎是形影不离的!
当需要驱动的数码管超过 2 位(个) 时,大部分情况下都会使用扫描方式进行分时驱动.
我们这里示例一个需要驱动 8 位数码管时的考虑,比较,以期可以举一反三,更好取舍!(示例使用共阳极数码管).
图 1 就是最普通的驱动方案----使用 8 次分时显示完成一轮显示:
图 2 也是是最普通的驱动方案----使用 4 次分时显示完成一轮显示:
图 1 图 2 对单片机而言,要求是有区别的:
区别又分别 2 种情况: 直接使用端口做笔段驱动还是通过串行到并行芯片来驱动笔段.(例如HC595,HC164等.)
端口直接驱动笔段:
图 1 使用 8SEG + 8 COM =16 个端口.图 2 使用 2*8SEG + 4 COM =20 个端口.
--------图 2 用 4 个端口换来了省 4 个三极管和扫描一轮时间快一倍! -----推荐使用 图 2 !
通过串行到并行芯片来驱动笔段:
这种方案又有不同区别:
图 3 是让 2 个 HC164 自身也连接为串联状态,单片机仅仅提供 2 根连接线就可以了.-----但是,需要连续发送 16 位二进制数据,才完成一次 2 位数码管显示.
图 4 是让 2 个 HC164 自身不连接为串联状态,而是时钟线公共使用,数据线分别使用,单片机需要提供 3 根连接线才行.-----但是,这种方式仅仅需要连续发送 8 位二进制数据,就完成一次 2 位数码管显示.(每次分别 2 个 HC164 各同时发送 1 位!)
很明显,图 4 的速度比图 3 的速度要快差不多一倍!-----因此,推荐使用图 4 是有利的!
;=============================================
示例程序:
; 2 个 HC164 三线制驱动子程序----温湿度显示
B_TLED164:;写数据到HC164
MOV_ JS164,#8;移位计数8次
@@:
B0BCLR PWDA_A ;温度显示数据 P
BTS0 WDATA.7 ;温度
B0BSET PWDA_A
B0BCLR PSDA_B ;湿度显示数据 P
BTS0 SDATA.7 ;湿度
B0BSET PSDA_B
B0BSET SCL164 ;时钟 P
JMP $+1
B0BCLR SCL164;送时钟
RLCM SDATA ;2只HC164并联使用.
RLCM WDATA
DECMS JS164;输出计数
JMP @B
RET
;======================================================
以上推荐是因为:当选择单片机引脚数量时,多几个引脚并不会明显增加开支,但是多使用单片机引脚可以带来节省外部硬件或提高运行速率!因此是符合节省又高效的原则的.
此外,还有利用锁存器(或触发器)的并行驱动方式,使用端口数量比串行/到并行驱动要多,但是其 8 线并行口可以分时无限制复用!却不适合那些具有特定任务的端口---例如控制输出等!
仅仅几个数码管,实际做起驱动来,还是很多考虑的.------限于篇幅不要过长,这里就打住吧!