再改下,加注释
目的:发送时不需要考虑当前串口状态,也不关心过程,入缓冲就好 ;系统上电初始化. MOV R0,#60H ;R0存储当前允许写的缓冲区地址.缓冲区地址60H~6FH MOV R1,#60H ;R1存储当前待发送数据的缓冲区地址.R1在指定数据发送完毕,接收到本数据的TI后inc.R0=R1即所有需要发送的数据均已经发送且收到TI
;数据入缓冲在非中断中.数据发送不考虑缓冲区耗尽产生数据覆盖 CLR ES ;禁止串口中断
MOV A,R0 ;检测当前是否有未接受到的TI或者有未发送的数据,即本次待发送的数据写入缓冲区而非SBUF后仍旧会产生串口中断 XRL A,R1 JNZ loop1 MOV SBUF,#58H ;此时串口发送空闲,所有发送已经完成,且TI已经处理掉 MOV A,R0 ;检测前次数据入缓冲是否已经进入6FH,前次更新后为70H,本次得翻转地址存入60H,指向61H XRL A,#70H JNZ LOOP0 MOV R0,#61H ;检测R0=70H,即前次已经把6FH用掉,写入缓冲后R0更新为70H;本次写入后更新为61,相当于本次写入60H,允许写为61H SJMP LOOP3 LOOP0:INC R0 ;因接受到TI后会INC R1,这里更新R0,使匹配 SJMP LOOP3
LOOP1:MOV A,R0 ;串口尚有未发送,或者未接收处理TI,本次写入缓冲(非SBUF)后会产生串口发送中断 XRL A,#70H JNZ LOOP2 MOV R0,#61H LOOP2:MOV @R0,#58H INC R0 LOOP3:SETB ES ;使能串口中断
;串口中断处理,在串口中断中执行 JB TI,LOOP6 SJMP LOOP10 LOOP6: CLR TI INC R1 ;每次接收到TI再更新R1 MOV A,R0 XRL A,R1 JZ LOOP10 CJNE R1,#70H,LOOP7 MOV R1,#60H LOOP7: MOV SBUF,@R1
LOOP10: ;其他 |
|