📄 实验六(2).asm
字号:
;功能:利用串行口方式0,在“串入并出”芯片配合下扩展输出引脚
;把存放在44H-47H发送缓冲区内的笔段码送通过串行口方式0送LED显示。
RXDP DATA 43H ;发送指针
RXDBUF DATA 44H ;发送缓冲区
DISPBUF DATA 48H ;笔段码显示缓冲区:
;48H单元记录千位,49H单元记录百位
;4AH单元记录十位,4BH单元记录个位
BTIME DATA 40H ;10ms计数单元
SECOND DATA 4CH ;秒计数单元
MINUTE DATA 4DH ;分计数单元
DISPB BIT 00H ;1秒定时时间到标志
PCLK BIT P3.5 ;并行锁存脉冲输出
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP UART ;串行中断服务子程序入口地址
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, #0DCH
MOV TL2, #00H ;初值0DC00送定时器T2
MOV RCAP2H, #0DCH
MOV RCAP2L, #00H ;初始化重装初值
MOV T2CON, #00000100B ;初始化T2工作方式(自动重装初值、定时)
;并启动了T2
ANL PCON, #10111111B ;将PCON的b6位清0,使SCON的b7位含义为SM0
;串行口初始化
MOV SCON, #00H ;串行口工作在方式0,扩展I/O口
;(SM2位必须为0)
;-----初始化中断控制器
ORL IE, #10110000B
;SETB ET2 ;允许定时器T2中断
;SETB ES ;允许串行口中断
;SETB EA ;开中断
MOV BTIME, #100 ;T2每10ms中断一次,则BTIME回零时间为100*10ms
WAIT:
JNB DISPB, WAIT
CLR DISPB ;清除1秒时间到标志
LCALL TIMEPROC ;执行分秒处理及显示子程序
SJMP WAIT ;等待
END
;定时/计数器T2中断服务程序
PROC CTC2
CTC2:
DJNZ BTIME, EXIT ;溢出次数减1,不为0跳转
;溢出次数已经回到0,重新初始化溢出次数
MOV BTIME, #100
SETB DISPB ;置位1秒时间到标志
EXIT:
CLR TF2 ;清除定时器T2溢出标志
RETI
END
PROC TIMEPROC ;分秒处理及显示子程序
TIMEPROC:
;时间计数单元加+1处理
INC SECOND ;秒计数单元+1
MOV A, SECOND
CJNE A, #60, NEXT1
NEXT1:
JC NEXT2
;秒大于60,从0开始计数,且分计数单元加1
MOV SECOND, #0
INC MINUTE
MOV A, MINUTE
CJNE A, #60, NEXT21
NEXT21:
JC NEXT2 ;分小于60
MOV SECOND, #0
NEXT2:
;秒单元计数器笔段码送显示缓冲区
MOV A, SECOND
MOV B, #10
DIV AB ;转换为BCD码
;十位在A中,个位在B中
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOV R0, #DISPBUF+2
MOVC A, @A+DPTR ;查表取笔段码
MOV @R0, A ;秒高位笔段码送显示缓冲区
INC R0 ;指向缓冲区最低位
MOV A, B ;取个位码
MOVC A, @A+DPTR ;查表取笔段码
MOV @R0, A ;秒低位笔段码送显示缓冲区
;分单元计数器笔段码送显示缓冲区
MOV A, MINUTE
MOV B, #10
DIV AB ;转换为BCD码
;十位在A中,个位在B中
MOV DPTR, #LEDTAB ;0-F字模表首地址送DPTR
MOV R0, #DISPBUF
MOVC A, @A+DPTR ;查表取笔段码
MOV @R0, A ;分高位笔段码送显示缓冲区
INC R0 ;指向缓冲区最低位
MOV A, B ;取个位码
MOVC A, @A+DPTR ;查表取笔段码
CLR ACC.7 ;显示LED202数码管的小数点dp
MOV @R0, A ;分低位笔段码送显示缓冲区
;笔段码送串行口发送缓冲区
MOV R0, #DISPBUF
MOV R1, #RXDBUF
MOV R7, #4
LOOP1:
MOV A, @R0 ;由于串行口发送时,先输出b0位,而
;对于串入并出芯片来说,要求输入b7,
;需要调整字节顺序
MOV C, ACC.7
MOV B.0, C
MOV C, ACC.0
MOV B.7, C ;b7与b0对调
MOV C, ACC.6
MOV B.1, C
MOV C, ACC.1
MOV B.6, C ;b6与b1对调
MOV C, ACC.5
MOV B.2, C
MOV C, ACC.2
MOV B.5, C ;b5与b2对调
MOV C, ACC.4
MOV B.3, C
MOV C, ACC.3
MOV B.4, C ;b4与b3对调
MOV @R1, B ;写入发送缓冲区
INC R0
INC R1
DJNZ R7, LOOP1
MOV RXDP, #0 ;初始化串行发送指针
CLR TI
MOV R1, #RXDBUF
MOV A, @R1 ;取显示缓冲区笔段码
MOV SBUF, A ;写串行发送缓冲寄存器,启动串行发送。
RET
END
PROC UART ;串行发送中断服务程序
UART:
PUSH PSW
PUSH ACC
SETB RS0
SETB RS1 ;切换工作寄存器区
CLR TI ;清除串行发送结束标志
MOV A, RXDP
CJNE A, #3, NEXT1 ;发送
;已经发送了最后一个字节
CLR P3.5
SETB P3.5 ;将串行数据并行送LED数码管
SJMP EXIT
NEXT1:
;串行发送下位
INC RXDP ;串行发送指针加+1
MOV A, RXDP
ADD A, #RXDBUF ;加发送缓冲区首地址
MOV R1, A
MOV A, @R1 ;取数据
MOV SBUF, A ;写串行发送缓冲寄存器,启动串行发送。
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 + -