?? 實驗五(1).asm
字號:
;功能:定時器T0(方式1)演示實驗
TCOCON DATA 40H ;定時器溢出計數單元
DISPC DATA 41H ;顯示數碼計數器
TIME1 EQU 5 ;溢出次數
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTC0 ;定時/計數器T0中斷服務程序入口地址
ORG 0050H
;-----主程序開始-----
PROC MAIN
MAIN:
MOV SP, #5FH ;對于只有前128字節內部RAM芯片來說,
;將60H-7FH,共計32字節作為堆棧區
; MOV SP, #0DFH ;對于具有256字節內部RAM芯片來說,
;將0E0H-0FFH,共計32字節作為堆棧區
; MOV DPTR, #8000H ;關閉蜂鳴器
;MOV A, #0FFH
;MOVX @DPTR, A
;---復位后,將08H-0FF內部RAM單元清0。
MOV R7, #248
MOV R0, #08H
LOOP1:
MOV @R0, #0
INC R0
DJNZ R7, LOOP1
;----初始化定時器T0
MOV TH0, #0B8H
MOV TL0, #00H ;初值0B800H送定時器T0
ANL TMOD, #0F0H
ORL TMOD, #000000001B
;定時器T0工作在方式1;C/T位為0,定時狀態;
;軟件啟動。
;-----初始化中斷控制器
SETB ET0 ;允許定時器T0中斷
SETB EA ;開中斷
;----啟動定時器T0
SETB TR0 ;啟動T0
MOV TCOCON, #TIME1 ;T0每20ms中斷一次,則TCON回零時間為50*20ms
CLR A ;從0開始顯示
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOVC A, @A+DPTR ;取顯示數碼對應字模
MOV P0, A ;字模送P0口
SJMP $ ;虛擬主程序,等待中斷
END
;定時/計數器T0中斷服務程序
PROC CTC0
CTC0:
MOV TL0, #00H ;由于T0工作在方式1,需要重裝初始化
MOV TH0, #0B8H ;為避免更大誤差,進入T0中斷服務程序后
;立即重裝。
PUSH PSW
PUSH ACC
CLR RS0
SETB RS1 ;切換工作寄存器區(這里假設用1區)
DJNZ TCOCON, EXIT ;溢出次數減1,不為0跳轉
;溢出次數已經回到0,重新初始化溢出次數
MOV TCOCON, #TIME1
INC DISPC ;數碼計數器+1,顯示下一個數碼
MOV A, DISPC
CJNE A, #16, NEXT1
NEXT1:
JC NEXT2
;顯示數碼已經大于F,從開始顯示
CLR A
MOV DISPC, #0 ;再從0開始
NEXT2:
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOVC A, @A+DPTR ;取顯示數碼對應字模
MOV P0, A ;字模送P0口
EXIT:
POP ACC
POP PSW
RETI
END
LEDTAB: ;八段LED共陽數碼管字模
;數碼 0 1 2 3 4 5 6 7
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H
;數碼 8 9 A B C D E F
DB 80H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -