不同于上一案例的是图3-7所示仿真电路在集成式数码管上“同时”显示了多个不同字符。有上一案例做基础,掌握集成式数码管的动态扫描显示程序的设计方法就很容易了。
图3-7 8位集成式数码管扫描显示多个不同字符
(一)集成式数码管动态扫描显示原理
前面已经讨论过,对于集成式数码管,任何时候发送的段码会被所有数码管收到,如果仿真电路中所有共阳数码管(7SEG-MPX8-CA-BLUE)的位码均为1(0xFF),则所有数码管都会显示同一字符。由于市面常见的是4位集成式数码管,本例电路中未直接使用元件库中的8位集成式共阳数码管,而是改用两组4位共阳集成式数码管拼装成一组“8位集成式”共阳数码管。拼装时注意“段引脚并联”、“位引脚分立”。
为使不同数码管显示不同字符,主程序使用了集成式数码管常用的动态扫描显示技术,它利用了人的视觉暂留特征。在选通第1位数码管时,发送第1个数字的段码,选通第2位数码管时发送第2个数字的段码,依此类推,每次仅选通1位数码管,并发送对应的段码。
由于切换选通下一数码管并发送相应段码的时间间隔非常短暂,视觉惰性使人感觉不到字符是一个接一个地显示在不同数码管上,而是会觉得到所有字符是很稳定地“同时”显示在不同数码管上的。
这里提出的设计方法和上一案例类似的是仍然在数码管不同位置逐个显示不同字符,只是切换速度大大增加了,在控制切换延时的时候,要注意全屏的扫描频率要高于视觉暂留频率16~20Hz。电影胶片正是采取了24张/秒的播放速度,观众才会觉察不到人物或景色是一帧一帧地显示出来的,观众会觉得画面非常连贯,没有任何抖动或闪烁感。
(二)动态扫描显示程序设计
主函数的核心部分是由for循环控制的数码管动态扫描显示代码,根据数码管输出控制的经验,可采取以下两种可靠方式之一输出,这样可以有效解决乱码现象或无显示现象。
方式1:先暂时关闭段码,然后再发送位码和段码,顺序简称为“段、位、段”。
方式2:先暂时关闭位码,然后再发送段位和位码,顺序简称为“位、段、位”。
两种方式中的第一步都是先暂时关闭段码(或位码),然后再发送位码、段码(或段码、位码)。对于其中的“位码”输出,或称“位扫描码”输出,同样可以有两种选择。
方法1:使用专门的位码表。
使用该方法时要在程序中单独建立数码管位码表,对于所设计的仿真电路有:
有了位码表以后,源程序中的发送位码语句PORTC=1<<i即可改成PORTC=Scan_BITs[i]。
方法2:使用位运算符(<<、>>、~)。
这种方法在上一案例中已有相关应用,下面对这种方法做完整阐述。
(1)对于共阳数码管,可使用1<<i,当i取值为0~7时,输出序列为00000001,00000010,…,10000000,可依次选通8位共阳数码管中的每一位。
(2)对于共阴数码管,则可使用~(1<<i),输出序列为11111110,11111101,…,01111111,可依次选通共阴数码管中的每一位。
除可以使用1<<i和~(1<<i)以外,还可以使用0x80>>i和~(0x80>>i),唯一差别是循环扫描顺序刚好相反,要注意,如果端口并非直接连接数码管位引脚,而是通过NPN或PNP三极管控制,此时的位码输出序列具体由三极管开关逻辑决定。
① 源程序最后一行语句_delay_ms(4)的参数修改为10、20或100并编译运行,观察会出现什么样的效果。
② 改用位码表Scan_BITs实现对集成式数码管的位码控制。
③ 重新设计程序实现任意数字串显示,例如显示“23-57-39”,其中“-”的段码可在原码表的后面添加。
④ 选用一只4位集成式数码管,两只2位的集成式数码管,通过4+2+2拼装,显示“2011年08月15日”,其中3个汉字直接用Proteus的“2D图形文本模式”按钮“A”分别贴到三组数码管的后面。