菜农声明: 若有雷同,纯属巧合.本贴纯属技术讨论.
;;;;串口中断服务子程序;;;;;;;;;;;;;; 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;中断返回
相关链接:https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2747724 |