电动汽车锂金属电池开发商及制造商「SES」获1.39亿美元D轮融资
06-17
动态扫描显示接口是单片机中应用最广泛的显示方式之一。
接口电路连接所有显示器的八个笔画段a-h的同一端,每个显示器的公共极COM由I/O线独立控制。
当CPU将字形代码发送到现场输出端口时,所有显示器都会收到相同的字形代码,但是哪个显示器点亮取决于COM端,而该端是由I/O控制的,所以我们可以自己决定。
当时显示的是哪一个。
所谓动态扫描,就是我们采用分时的方式,依次控制各个显示屏的COM端,使各个显示屏依次点亮。
在轮流点亮和扫描的过程中,每个显示屏的点亮时间极短(约1ms)。
然而,由于人类视觉的暂留以及发光二极管的余辉效应,尽管显示屏实际上并不会同时亮起来,但只要扫描速度足够快,给人的印象是给出的是一组稳定的显示数据,没有闪烁。
下图是我们实验板上的动态扫描界面。
89C51的P0口可以注入很大的电流,所以我们使用共阳极数码管,不使用限流电阻。
相反,我们只使用两个1N来降低电压并为数码管供电。
这里只使用了两个。
事实上,它是可以扩展的。
它们的公共端由 PNP 晶体管控制。
显然,如果打开的话,对应的数码管可以点亮,但是如果关闭的话,对应的数码管就不能点亮。
它是由P2.7和P2.6控制的。
这样我们就可以通过控制P27和P26来控制某个数码管的开启或关闭。
以下程序利用实验板上的数码管显示0和1。
第一设备 P2.7;第一数码管SECOND EQU P2.6的位控制;第二位数码管DISPBUFF EQU 5AH的位控制;显示缓冲区为5AH和5BHORG HAJMP STARTORG 30HSTART:MOV SP,#5FH;设置堆栈 MOV P1,#0FFHMOV P0,#0FFHMOV P2,#0FFH;初始化,所有显示,LED 关闭 MOV DISPBUFF, #0;第一个显示屏显示0MOV DISPBUFF,#1;第二个显示屏显示1LOOP:LCALL DISP;调用显示程序AJMP LOOP;主程序到此结束 DISP: PUSH ACC; ACC被压入堆栈PUSH PSW; PSW被压入堆栈MOV A,DISPBUFF;取第一个要显示的数字 MOV DPTR,#DISPTAB;字体表首地址MOVC A,@A+ DPTR;获取字形代码 MOV P0,A;将字形代码发送到P0位(段端口)CLR FIRST;打开第一个显示位端口LCALL DELAY;延迟1毫秒SETB FIRST;关闭第一个显示(开始准备第二个显示)位数据)MOV A,DISPBUFF;取显示缓冲区的第二位 MOV DPTR,#DISPTABMOVC A,@A+DPTRMOV P0,A;将第二个字形代码发送到P0端口CLR SECOND;打开第二个显示 LCALL DELAY ;延迟 SETB SECOND ;关闭第二个数字显示 POP PSWPOP ACCRETDELAY: ;延迟 1 毫秒 PUSH PSWSETB RS0MOV R7,#50D1: MOV R6,#10D2: DJNZ R6,$DJNZ R7,D1POP PSWRETDISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60HEND 从上例可以看出,动态扫描显示必须由CPU不断调用显示程序才能保证连续显示。
上面的程序可以显示数字,但是不太实用。
为什么?这里我们只显示两个数字,不做其他工作。
因此,两个数码管轮流显示1毫秒。
没有问题。
在实际工作中,当然不可能只显示两个数字。
我们还要做其他事情。
,使得第二次调用显示程序之间的时间间隔是可变的。
如果时间间隔较长,则显示会不连续。
在实际工作中,很难保证短时间内完成所有工作。
而且,这个显示程序也有点“浪费”。
每个数码管显示占用1毫秒,这在很多应用中是不允许的。
我应该怎么办?我们可以利用定时器,在定时器到时产生一个中断,点亮一个数码管,然后立即返回。
数码管会一直亮到下一个定时器到时,不调用延时程序。
这段时间可以留给主程序去做其他的事情。
当下一个定时器到时,就会显示下一个数码管,这样就不会浪费了。
计数器 EQU 59H;计数器,显示程序通过它知道当前显示的是哪个数码管FIRST EQU P2.7;第一数码管SECOND EQU P2.6的位控制;第二位数码管DISPBUFF EQU 5AH的位控制;显示缓冲区为5AH和5BHORG HAJMP STARTORG BH;定时器T0的表项AJMP DISP;显示程序 ORG 30HSTART:MOV SP,#5FH;堆栈 MOV P1,#0FFHMOV P0,#0FFHMOV P2,#0FFH;初始化,显示,LED灭 MOV TMOD,#B;定时器 T0 工作在模式 1(16 位定时/计数模式) MOV TH0,#HIGH(6-)MOV TL0,#LOW(6-)SETB TR0SETB EASETB ET0MOV Counter,#0 ;计数器初始化 MOV DISPBUFF,#0 ;第一个数字始终显示 0MOV A,#0LOOP:MOV DISPBUFF,A ;第二个数字交替显示 0-9INC ALCALL DELAYCJNE A,#10,LOOPMOV A,#0AJMP LOOP ;中间可以安排任意节目,这个只是用于演示。
;主程序到此结束 DISP: ;定时器T0中断响应程序 PUSH ACC ; ACC 入栈 PUSH PSW ;PSW 入栈 MOV TH0,#HIGH(6-) ;计时时间为一个周期,约微秒(11.M) MOV TL0,#LOW(6-)SETB FIRSTSETB第二;关闭显示 MOV A,#DISPBUFF;显示缓冲区首地址ADD A、CounterMOV R0、AMOV A、@R0;根据计数器值获取对应的显示缓冲区 MOV DPTR 的值,#DISPTAB;字体表MOVC A首地址,@A+DPTR;获取字形代码MOV P0,A;将字形代码发送到P0位(段端口)MOV A,计数器;获取计数器JZ DISPFIRST的值;如果为0,则显示第一位 CLR SECOND;否则显示第二位 AJMP DISPNEXTDISPFIRST:CLR FIRST;显示第一位 DISPNEXT:INC 计数器;计数器MOV A、CounterDEC A加1;如果计数器计数到 2,则让它返回 0DEC AJZ RSTCOUNTAJMP DISPEXITRSTCOUNT:MOV Counter,#0 ;计数器值只能为 0 或 1DISPEXIT:POP PSWPOP ACCRETIDELAY: ;延迟毫秒 PUSH PSWSETB RS0MOV R7,#D1: MOV R6, #D2: NOPNOPNOPNOPDJNZ R6,D2DJNZ R7,D1POP PSWRETDISPTAB :DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60HEND 从上面的程序可以看出,与静态显示相比,动态扫描程序有点复杂,但这是值得的。
该程序具有一定的通用性。
只要改变端口的值和计数器的值,就可以显示更多的位数。

下面给出了显示该程序的流程图。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-17
06-18
06-18
06-18
06-18
06-17
最新文章
使用电子管有哪些注意事项?如何检查电子管之间是否短路?
博通支付1200万美元和解SEC财务欺诈指控
八名运营商高管确认加入虚拟运营商
内蒙古农牧区雷电灾害成因分析及防雷对策
北京联通将5G应用于世园会远程医疗急救
TD-SCDMA最后一轮冲刺测试启动,产业前景更加光明
专访阿里云总裁王健:云计算服务平台梦想成真
USB2.0控制器CY7C68013的接口设计与实现