📄 实验五(1)d.asm
字号:
;功能:定时器T0(方式1)演示实验
TCOCON DATA 40H ;定时器溢出计数单元
DISPC DATA 41H ;显示数码计数器
TIME1 EQU 20 ;溢出次数
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
CPL P1.1
CPL P2.6
INC DISPC ;数码计数器+1,显示下一个数码
MOV A, DISPC
CJNE A, #10, 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 090H, 080H, 0F8H, 082H, 092H, 099H, 0B0H, 0A4H
;数码 8 9 A B C D E F
DB 0F9H, 0C0H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -