;A 采用***陽極數碼管
;B P2口控制LED的段碼,p2.0接A段,負輸出有效
;C P1口控制位碼,P1.0接最高位,P1.3接最高位,負輸出有效。
;D 晶振采用12M
;E 數碼管顯示0.5S後自動加1
;程序:
ORG 0000H
LJMP 0080H
ORG 0030H
VAR1:DS 1 ;高位數據
VAR2:DS 1 ;低位數據
VAR3:DS 1 ;數碼管位狀態
VAR4:DS 1 ;暫存
VAR5:DS 1 ;周期
ORG 0080H
MOV SP, #60H
;初始狀態為00.00
MOV VAR1, #00H
MOV VAR2, #00H
MOV VAR3, #01H
;==關閉數碼管====
MOV P1, #0FFH
MOV P2, #0FFH
MOV VAR5, #12
INT:
;==================================================
ACALL AJTDATA ;將兩位數據調整成按每位輸出的單獨數據
ACALL OUTSIM ;數碼管顯示程序
;===================================================
;==以上兩個小程序執行的時間約為40MS,
;所以,當延時12次以後,程序運行了480ms,
;子程序ADDONE就是等待約0.5秒後,顯示數據自動加1
ACALL ADDONE
LJMP INT
ADDONE:
DJNZ VAR5, EXITADD
MOV VAR5, #12
MOV A, VAR2
CLR C
ADDC A, #01H
DA A
MOV VAR2, A
MOV A, VAR1
ADDC A, #00H
DA A
MOV VAR1, A
EXITADD:
RET
AJTDATA:
MOV R0, #VAR4
;最高位
MOV A, VAR1
SWAP A
ANL A, #0FH
MOV @R0, A
;第二位
INC R0
MOV A, VAR1
ANL A, #0FH
MOV @R0, A
;第三位
INC R0
MOV A, VAR2
SWAP A
ANL A, #0FH
MOV @R0, A
;第四位
INC R0
MOV A, VAR2
ANL A, #0FH
MOV @R0, A
RET
OUTSIM:
MOV R0, #VAR4
;送第壹位
MOV A, @R0
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV P2, A
MOV P1, #01H
ACALL DEL10 ;延時10MS,以保證數碼管顯示時的視覺延緩時間
;送第二位
INC R0
MOV A, @R0
MOV DPTR, #TABLE
MOVC A, @A+DPTR
ANL A, #7FH ;將最高位,即小數點位清零,讓其亮
MOV P2, A
MOV P1, #02H
ACALL DEL10
;送第三位
INC R0
MOV A, @R0
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV P2, A
MOV P1, #04H
ACALL DEL10
;送第二位
INC R0
MOV A, @R0
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV P2, A
MOV P1, #08H
ACALL DEL10
RET
DEL10: ;10MS延時程序
MOV R6, #20
DEL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6, DEL1
RET
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,32H,82H,0F8H,80H,90H
END