正文 基於AT89S52單片機的通用動態掃描顯示接口的設計(2 / 3)

從上麵的程序中可以看出,動態掃描顯示必須由CPU不斷地調用顯示程序,才能保證持續不斷的顯示。上麵的這個程序可以實現數字的顯示,這裏僅是顯示兩個數字,並沒有做其他的工作,因此,兩個數碼管輪流顯示1毫秒,沒有問題,實際的工作中,當然不可能隻顯示兩個數字,還是要做其他的事情的,這樣在二次調用顯示程序之間的時間間隔就不一不定了,如果時間間隔比較長,就會使顯示不連續。而實際工作中是很難保證所有工作都能在很短時間內完成的。況且這個顯示程序也有點“浪費”,每個數碼管顯示都要占用1個毫秒的時間,這在很多合是不允許的,我們可以借助於定時器,定時時間一到,產生中斷,點亮一個數碼管,然後馬上返回,這個數碼管就會一直亮到下一次定時時間到,而不用調用延時程序了,這段時間可以留給主程序幹其他的事。到下一次定時時間到則顯示下一個數碼管,這樣就很少浪費了。借助於定時器編寫的程序如下:

Counter EQU 59H ;計數器,顯示程序通過它得知現正顯示哪個數碼管,FIRST EQU P2.7 ;第一位數碼管的位控製,SECOND EQU P2.6 ;第二位數碼管的位控製,DISPBUFF EQU 5AH ;顯示緩衝區為5AH和5BH,ORG 0000H,AJMP START,ORG 000BH ;定時器T0的入口,AJMP DISP ;顯示程序,ORG 30H,START:MOV SP,#5FH ;設置堆棧,MOV P1,#0FFH,MOV P0,#0FFH,MOV P2,#0FFH ;初始化,所顯示器,LED滅,MOV TMOD,#00000001B ;定時器T0工作於模式1(16位定時/計數模式),MOV TH0,#HIGH(65536-2000),MOV TL0,#LOW(65536-2000),SETB TR0,SETB EA,SETB ET0,MOV Counter,#0 ;計數器初始化,MOV DISPBUFF,#0 ;第一位始終顯示0,MOV A,#0,LOOP:,MOV DISPBUFF+1,A ;第二位輪流顯示0-9,INC A,LCALL DELAY,CJNE A,#10,LOOP,MOV A,#0,AJMP LOOP ;在此中間可以按排任意程序,;主程序到此結束,DISP: ;定時器T0的中斷響應程序,PUSH ACC ;ACC入棧,PUSH PSW ;PSW入棧,MOV TH0,#HIGH(65536-2000) ;定時時間為2000個周期,約2170微秒(11.0592M),MOV TL0,#LOW(65536-2000),SETB FIRST,SETB SECOND ;關顯示,MOV A,#DISPBUFF ;顯示緩衝區首地址,ADD A,Counter,MOV R0,A,MOV A,@R0;根據計數器的值取相應的顯示緩衝區的值,MOV DPTR,#DISPTAB;字形表首地址,MOVC A,@A+DPTR ;取字形碼,MOV P0,A ;將字形碼送P0位(段口),MOV A,Counter ;取計數器的值,JZ DISPFIRST;如果是0則顯示第一位,CLR SECOND ;否則顯示第二位,AJMP DISPNEXT,DISPFIRST:CLR FIRST ;顯示第一位 ,DISPNEXT:INC Counter ;計數器加1,MOV A,Counter ,DEC A ;如果計數器計到2,則讓它回0,DEC A ,JZ RSTCOUNT,AJMP DISPEXIT,RSTCOUNT:MOV Counter,#0 ;計數器的值隻能是0或1,DISPEXIT:POP PSW,POP ACC,RETI,DELAY: ;延時130毫秒,PUSH PSW,SETB RS0,MOV R7,#255,D1: MOV R6,#255,D2:NOP,NOP,NOP,NOP,DJNZ R6,D2,DJNZ R7,D1,POP PSW,RET,DISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H,END。