小黄 单片机-实验四
PORT EQU 0CFA0H
START: MOV TMOD,#20H ;选择定时器模式 2,计时方式自动装填
MOV TL1,#0E8H ;预置时间常数,波特率为 1200
MOV TH1,#0E8H
MOV 87H,#00H ;PCON=00,使 SMOD=0,波特率不倍增
SETB TR1 ;启动定时器 1
MOV SCON,#50H ;串行口工作于方式 1,允许串行接收
SETB EA ;打开中断总开关
SETB ES ;打开串行中断开关
MOV R1,#12H ;R1 中存放显示计数值 18
MOV DPTR,#TABLE ;把表的地址赋给 DPTR
MOV A,DPL ;把此时 DPTR 保存的表低位地址赋给 A
MOV DPTR,#L1 ;把 L1 入口地址赋给 DPTR
CLR C ;清除进位 C 给下一条减法指令带来的影响
SUBB A,DPL ;计算从表地址到 L11 入口的偏移量
MOV R0,A ;存放偏移量到 R0
MOV DPTR,#TABLE ;把表的地址赋给 DPTR
MOV A,DPL ;把此时 DPTR 保存的表低位地址赋给 A
MOV DPTR,#L11 ;把 L1 入口地址赋给 DPTR
CLR C ;清除进位 C 给下一条减法指令带来的影响
SUBB A,DPL ;计算从表地址到 L11 入口的偏移量
MOV R6,A ;存放偏移量到 R6 和 R7
MOV R7,A
SEND: MOV A,R0 ;把 R0 存储的偏移量赋给 A
MOVC A,@A+PC ;取显示码
L1: MOV SBUF,A ;通过串行口发送显示码
LJMP $ ;原地踏步,等待中断的到来
SEND2: MOV A,R6 ;把 R6 内更新后的偏移量赋给 A
MOVC A,@A+PC ;取新的显示码
L11: MOV SBUF,A ;通过串行口发送显示码
RETI ;返回主程序,退出中断
UARTINT: JB RI,L2 ;进入中断,判定是否为 RI 触发,是则跳转 L2
CLR TI ;若为 TI 触发中断,则对清零接收中断位 TI,
;为下一次进入中断做准备
INC R6 ;偏移量下移
DJNZ R1,SEND2 ;判断循环次数是否达到 18 次,若未继续发送
MOV R1,#12H ;若达到,置初始化计数初值和偏移量
MOV A,R7
MOV R6,A
LJMP SEND2 ;回跳 SEND2,进行新一轮显示码发送
L2: CLR RI ;若为 RI 触发,首先清零接收中断标志
MOV A,SBUF ;接收数据送 A
MOV DPTR,#PORT ;把 273 端口地址给到 DPTR
MOVX @DPTR,A ;把显示码输出到端口
ACALL DELAY ;延时 0.5 秒
RETI ;回跳主程序断点处
TABLE: DB 01H, 03H, 07H, 0FH, 1FH, 3FH,7FH,0FFH,0FEH
DB 0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H
DELAY: MOV R4,#10 ;延时 0.5 秒
DEL1: MOV R3,#200
DEL2: MOV R2,#229