CNT EQU 32H
ORG 0000H ;程序開始
AJMP MAIN
ORG 000BH ;定時器0中斷地址
AJMP TIME
ORG 0013H ;外總中斷0中斷地址
AJMP INT00
ORG 0030H ;程序開始執行
MAIN:
MOV SP,#5FH ;移動堆棧
MOV COUNT,#00H ;清寄存器
MOV CNT,#00H ;
MOV TMOD,#01H ;定時器0工作方式1
MOV TH0,#3CH ;50MS初值
MOV TL0,#0B0H ;
SETB ET0 ;開定時器0中斷
SETB EA ;開總中斷
SETB EX0 ;開外總中斷0中斷
SETB TR0 ;開啟定時器0
LOOP:
CALL DISP ;調用顯示子程序
JMP LOOP ;采用查詢方式
;P0口數據輸出。P2.0、P2.1位碼控制端
DISP: MOV A,CNT ;CNT數據送入A中
MOV B,#10 ;10送入B中=分離出個位、十位數
DIV AB ;A除B
MOV R0,B ;B送入R0中
MOV DPTR,#TAB ;查表地址
MOVC A,@A+DPTR ;根據A的值查表
MOV P2,#0FEH ;開啟位碼=個位
MOV P0,A ;送個位數據
CALL DELAY ;延時壹會,保持亮度
MOV A,R0 ;R0送入A中、
MOV DPTR,#TAB ;
MOVC A,@A+DPTR ;
MOV P2,#0FDH ;開啟位碼=十位
MOV P0,A ;送個位數據
CALL DELAY ;
RET
;采用定時器每秒數碼管加1
TIME:
PUSH PSW ;狀態寄存器壓入堆棧
PUSH ACC ;累加器A壓入堆棧
MOV TH0,#3CH ;重裝50MS定時器初值
MOV TL0,#0B0H ;
INC COUNT ;50MS時間到寄存器加1
MOV A,COUNT ;送入A中
CJNE A,#20,UENRET ;比較不等於20,即1秒時間沒到
MOV COUNT,#00H ;到了1秒時間,寄存器清規
INC CNT ;CNT寄存器加1
MOV A,CNT ;送入A中
CJNE A,#100,UENRET ;比較=這裏因為只有兩位數碼管
MOV CNT,#00H ;意思跟上面20 的壹樣,
UENRET:POP ACC ;彈出A保護的值
POP PSW ;彈出狀態寄寄原值
RETI ;中斷返回
;外總中斷復位
INT00:
PUSH PSW
PUSH ACC
MOV COUNT,#00H;清COUNT寄存器
MOV CNT,#00H;清CNT寄存器
CALL DELAY
POP ACC ;彈出保護數據
POP PSW
RETI
DELAY: MOV R5,#100 ;延時程序
DJNZ R5,$
RET
;***陰數據
TAB: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END