;;;;串口中断服务子程序;;;;;;;;;;;;;; L4E60: PUSH PSW;保护现场 PUSH ACC PUSH DPL PUSH DPH PUSH B SETB RS1 CLR RS0;选择第1组寄存器组,这样可以不保护08H~0FH,R0~R7=08H~0FH JNB TI,L4E8E;不是发送中断 ;;;;串口发送中断服务子程序;;;;;;;;;;; CLR TI;清除发送中断标志 ;;;;串口发送中断空(R4=1为空)判断;;;;;;;;;;; DJNZ R4,L4E78;发送缓冲区未满继续(最大256个字节) LJMP L4E8E;发送缓冲区已满退出(估计要丢数据~~~应该做成滚筒式的) L4E78: MOV DPL,R0;当前发送缓冲区低8位地址 MOV DPH,R1;发送缓冲区高8位地址 MOVX A,@DPTR;从发送缓冲区中取出数据 INC DPTR;移动发送缓冲区指针 MOV SBUF,A;通过串口硬件模块发送数据 MOV R0,DPL;保存发送缓冲区低8位地址 MOV R1,DPH;保存发送缓冲区高8位地址 ;;;;串口发送中断缓冲区越界判断;;;;;;;;;;; MOV A,R1 CJNE A,#03FH,L4E8E;串口发送中断缓冲区未越界 ;;;;越界处理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOV R0,#000H;发送缓冲区头低8位地址 MOV R1,#03EH;发送缓冲区头高8位地址(3E00H~3EFEH共255个字节缓冲区) MOV R4,#001H;越界标志(发送缓冲区已满) L4E8E: JNB RI,L4EAA;不是接收中断 CLR RI;清除接收中断标志 MOV A,SBUF;通过串口硬件模块接收数据 MOV DPL,R2;当前接收缓冲区低8位地址 MOV DPH,R3;当前接收缓冲区高8位地址 MOV R7,#003H;设置接收中断软件标志,表示刚收到过数据 ;;;;终止或特殊字符判断;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CJNE A,#07EH,L4E9F;不为终止或特殊字符7EH INC R5;找到1个终止或特殊字符,记录次数 L4E9F: MOVX @DPTR,A;保存到接收缓冲区 INC DPTR;移动接收缓冲区指针 LCALL S4EB5;DPH=3CH或3DH CLR A;零标志表示已经存入数据??? MOVX @DPTR,A;????估计是软件握手之类或标志等 MOV R2,DPL;保存接收缓冲区低8位地址 MOV R3,DPH;保存接收缓冲区高8位地址 L4EAA:;总之该汇编串口接收发送中断服务程序写得非常不错,应该表扬~~~ POP B;恢复现场 POP DPH POP DPL POP ACC POP PSW RETI ;;;;DPH=3CH或3DH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; S4EB5: PUSH ACC MOV A,DPH ANL A,#001H ORL A,#03CH MOV DPH,A POP ACC RET
|