单片机的输出显示部分可采用动态扫描或静态显示方法,动态扫描法占用CPU的时间较多,使CPU负担加重,某些场合可能并不适用。例如某型自控仪表,在运行中需消耗几百毫秒时间计算测得的数据并进行控制,输出显示为12位LED数码管,显示更新周期为1s。若采用循环调用显示子程序的方法进行动态扫描显示,则因刷新周期远大于人眼的视觉暂留特性(24ms),会产生明显的闪烁,根本无法看清。这种情况下可采用静态显示方法,每次CPU发送完需显的数据后,可以用较长的时间处理其他内容,而不必时刻去关心显示。目前已有专用的显示电路,如7289A、ZLG7290等。为了使大家加深理解静态显示的原理,这里笔者采用传统的74LS164移位寄存器进行扩展,实现对显示、键盘的控制。
电路概述
可预置的8位计数器电路见图1。

IC2作为键盘扫描输出口,单片机的P3.2、P3.5作键入线。IC3~IC10串行连接,用于驱动8位LED数码管进行显示。U1为光电遮断器,每产生一个输入脉冲,使单片机进入中断并进行加法计数。U2为输出光耦,用于驱动外部负载动作。8位数码管的供电电压由三端可调稳压器IC11调压后(约2V)供应,这样可省去大量的LED数码管的段限流电阻(共8×8=64个)。当CPU进行串行发送时,P3.7送出高电平使VT1导通,这时IC11的输出电压远低于发光二极管的导通电压,使LED显示器消隐。串行发送完毕后,P3.7输出低电平,LED显示器正常显示。
图2为74LS164的逻辑结构图。它具有两个串行数据输入端,可将其并联使用,也可将其中一个作数据输入允许端。在时钟上升沿时对输入的串行数据进行移位并锁存。

图3为74LS164的引脚排列图。74LS164的引脚功能是:A1、A2为串行数据输入端,QA~QH为8位并行数据输出端。时钟输入端上升沿有效,复位端下降沿有效。

单片机AT89S51完成的任务为: (1)扫描键盘得到所需的预置数据。(2) 将计数值发送到8位LED显示器进行静态显示。(3)进行输出控制。
软件设计思路及方案
先检测键盘是否被按下,若按下则键标志为1,否则为0。随后检测S9键,若S9键按下则工作标志set_flag取反(0或1)。以后程序根据工作标志进行计数、显示计数、输出控制或者扫描按键S1~S8、显示预置值等。本设计中,按键S10~S16未用。为了编程方便,8位计数值及8位预置值均使用8个变量存放,虽然RAM的利用率不高,但初学者比较容易理解。在显示预置值时,显示屏的最低位数码管的小数点点亮,以示与显示计数值的差别。当计数值等于预置值时,输出(P3.4)动作,可控制负载(电机等)动作。
图4为主程序状态流程。限于篇幅,对程序的主要部分的分析及完整的程序请见本期配刊光盘。

文/周兴华