;;;;串口中断服务子程序;;;;;;;;;;;;;;
L76B4:
PUSH PSW;保护现场
PUSH ACC
PUSH DPL
PUSH DPH
PUSH B
SETB RS1
CLR RS0;选择第1组寄存器组,这样可以不保护08H~0FH,R0~R7=08H~0FH
JNB TI,L76D9;不是发送中断
;;;;串口发送中断服务子程序;;;;;;;;;;;
CLR TI;清除发送中断标志
INC R1;移动发送缓冲区指针
;;;;串口发送中断越界判断;;;;;;;;;;;
MOV A,R0;发送缓冲区尾指针
MOV B,R1;当前发送缓冲区指针
CJNE A,B,L76D1;发送缓冲区未满继续
LJMP L76D9;发送缓冲区已满退出(估计要丢数据~~~应该做成滚筒式的)
L76D1:
MOV DPL,R1;当前发送缓冲区低8位地址
MOV DPH,#021H;发送缓冲区高8位固定地址
MOVX A,@DPTR;从发送缓冲区中取出数据
MOV SBUF,A;通过串口硬件模块发送数据
L76D9:
JNB RI,L76E9;不是接收中断
;;;;串口接收中断服务子程序;;;;;;;;;;;
CLR RI;清除接收中断标志
MOV R6,#002H;设置接收中断软件标志,表示刚收到过数据
MOV A,SBUF;通过串口硬件模块接收数据
MOV DPL,R2;当前接收缓冲区低8位地址
MOV DPH,#020H;接收缓冲区高8位固定地址(估计为256个字节,应该是滚筒式的)
MOVX @DPTR,A;保存到接收缓冲区
INC R2;移动接收缓冲区指针
L76E9:;总之该汇编串口接收发送中断服务程序写得非常不错,应该表扬~~~
POP B;恢复现场
POP DPH
POP DPL
POP ACC
POP PSW
RETI;中断返回