📄 实验五(3).asm
字号:
;功能:LED动态显示演示实验
TCOCON DATA 40H ;定时器溢出计数单元
DISPC DATA 41H ;显示数码计数器
DISPP DATA 43H ;显示指针
DISPBUF DATA 48H ;显示缓冲区,48H单元记录十位,49H单元记录个位
TIME1 EQU 5 ;溢出次数
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP CTC2 ;定时/计数器T2中断服务程序入口地址
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
;----初始化定时器T2
MOV TH2, #1130H
MOV TL2, #00H ;初值0DC00送定时器T2
MOV RCAP2H, #1130H
MOV RCAP2L, #00H ;初始化重装初值
MOV T2CON, #00000100B ;初始化T2工作方式(自动重装初值、定时)
;并启动了T2
;-----初始化中断控制器
SETB ET2 ;允许定时器T2中断
SETB EA ;开中断
MOV TCOCON, #TIME1 ;T2每10ms中断一次,则TCOCON回零时间为100*10ms
LCALL DATA_BUF ;把数码对应笔段码送显示缓冲区
SJMP $ ;虚拟主程序,等待中断
END
;定时/计数器T2中断服务程序
PROC CTC2
CTC2:
PUSH PSW
PUSH ACC
CLR RS0
SETB RS1 ;切换工作寄存器区(这里假设用1区)
DJNZ TCOCON, NEXT1 ;溢出次数减1,不为0跳转
;溢出次数已经回到0,重新初始化溢出次数
MOV TCOCON, #TIME1
INC DISPC ;数码计数器+1
LCALL DATA_BUF ;把数码对应笔段码送显示缓冲区
NEXT1:
;笔段码送P0
INC DISPP ;显示指针+1
MOV A, DISPP ;取显示指针
CJNE A, #0, NEXT2
;显示指针为0,说明本次中断要显示个位
SETB P3.4 ;关闭十位
CLR P1.2 ;打开个位
MOV R0, #DISPBUF+1 ;选择个位笔段码
SJMP NEXT4
NEXT2:
CJNE A, #1, NEXT3
;显示指针为1,说明本次中断要显示十位
CLR P3.4 ;打开十位
SETB P1.2 ;关闭个位
MOV R0, #DISPBUF ;选择十位笔段码
SJMP NEXT4
NEXT3:
;显示指针>=2,重新置为0
MOV DISPP, #0
SETB P3.4 ;关闭十位
CLR P1.2 ;打开个位
MOV R0, #DISPBUF+1 ;选择个位笔段码
NEXT4:
MOV P0, @R0 ;笔段码送P0口
POP ACC
POP PSW
CLR TF2 ;清除定时器T2溢出标志
RETI
END
PROC DATA_BUF ;把数码对应笔段码送显示缓冲区
DATA_BUF:
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOV R0, #DISPBUF
MOV A, DISPC
ANL A, #0F0H ;取十位
SWAP A
MOVC A, @A+DPTR ;取显示数码对应笔段码
MOV @R0, A ;送显示缓冲区
INC R0
MOV A, DISPC
ANL A, #0FH ;取个位
MOVC A, @A+DPTR ;取显示数码对应笔段码
MOV @R0, A ;送显示缓冲区
RET
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 + -