在项目6中,数码管采用静态显示方式,1个数码管占用8个I/O接口。如果有多个数码管显示仍采用静态显示方式,则占用更多的I/O接口,造成单片机资源的浪费。多个数码管显示常采用动态显示方式,即利用较少的I/O接口驱动,通过分时控制每个数码管轮流显示,由于人眼视觉暂留特性实现多个数码管同时显示方式。
在图4-10电路中,6只共阳极型数码管的段选端并联在一起分别连接P0接口的相应端口,P2通过74HC04反相器驱动数码管的阳极,6只共阳极型数码管可以显示时、分、秒信息。
图4-106 位七段数码管显示
1.动态显示原理
如果让数码管的最低位(秒个位)显示,P2.0输出低电平,P2的其他端口输出高电平,并且此时P0输出最低位段选数据;同理,如果让次低位显示,P2.1输出低电平,P2的其他端口输出高电平,并且此时P0输出位次低位段选数据;以此循环到最高位数码管显示,然后回来再显示最低位。这种利用P2分时控制实现的多位数码管显示方式为动态显示。只要每个数码管显示的交替时间足够的快,由于人的视觉暂留特性,我们看到的结果是6个数码管同时显示。
在程序设计中,动态显示一般在定时器的中断完成。如果定时器5ms中断1次,每次中断只显示数码管的一位,每个数码管显示时间就占用5ms时间,则6位数码管显示1遍需要30ms的时间。因此在1s时间内,数码管动态循环显示了33次,人眼会看到所有的数码管都在同时显示。
动态显示驱动方式多应用在LED显示屏的显示控制中,通过I/O接口对外部器件的动态扫描、查询和驱动是单片机控制外部设备的主要方式。
2.程序设计
定时器初始化和中断的设定仍利用项目6中的设置,6位数码管动态显示内容为时间的小时、分钟和秒信息。在程序中要通过秒计数得到分钟和小时信息,参考程序如下:
(www.xing528.com)
3.程序说明
(1)动态显示控制
项目7利用了switch case语句分时控制数码管显示。T0第1次中断,cp3=0,显示秒个位,5ms后,timer0第2次中断,cp3=1,显示秒十位。以后随着中断发生依次显示分和小时的个位和十位。
在“P0=seven_seg[sec % 10];P2=~0x01;break;”一行指令中,P0输出秒个位段选数据。此时P2=~0x01即P2=0xFE,P2.0输出低电平,P2的其他引脚输出高电平,由于共阳极型数码管经过非门反相驱动,此时只有秒个位数码管的共阳极加高电平,因此只有秒个位显示。
(2)小数点闪烁实现
flash 1s内变化一次,当flash为0xFF(11111111)时,0x7F|flash为0xFF,式子seven_seg[hour % 10]&(0x7F|flash)运算后仍为seven_seg[hour % 10],不影响显示效果;当flash为0x00(00000000)时,0x7F|flash为0x7F,式子seven_seg[hour % 10]&(0x7F|flash)运算后,seven_seg[hour % 10]的最高位变为0,此时小数点显示。
(3)变量的命名
程序中会使用很多变量,通俗易懂的变量名可提高程序的可读性。习惯上,小写的i、j、k、x等简单字符用于局部变量,全局变量一般采用与变量相同意义的英文小写缩写或中文拼音小写,尽量避免使用大写或没有意义的字母组合成冗长的字符串作为变量。
单片机的CPU在处理数据的同时可用软件启动定时器自动计数,通过中断让CPU去执行相应处理,提高了单片机系统运行效率。由于单片机不能实现多任务多进程处理,在与时间控制有关的单片机系统中会经常用到定时器。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。