📄 serial.src
字号:
; .\serial.SRC generated from: serial.c
; COMPILER INVOKED BY:
; C:\Keil\C51\BIN\C51.EXE serial.c LARGE BROWSE DEBUG OBJECTEXTEND SRC(.\serial.SRC)
$NOMOD51
NAME SERIAL
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
EA BIT 0A8H.7
IE DATA 0A8H
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
PS BIT 0B8H.4
SP DATA 081H
OV BIT 0D0H.2
WR BIT 0B0H.6
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
TF1 BIT 088H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
REN BIT 098H.4
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?_?InitSerial?SERIAL SEGMENT CODE
?PR?_?InitSerialBuffer?SERIAL SEGMENT CODE
?PR?_?serial?SERIAL SEGMENT CODE
?PR?_?yygetch?SERIAL SEGMENT CODE
?PR?_?PrintChar?SERIAL SEGMENT CODE
?PR?_?PrintCh?SERIAL SEGMENT CODE
?PR?_?insidePrintByte?SERIAL SEGMENT CODE
?PR?_?PrintByte?SERIAL SEGMENT CODE
?PR?_?insidePrintWord?SERIAL SEGMENT CODE
?PR?_?PrintWord?SERIAL SEGMENT CODE
?PR?_?PrintLong?SERIAL SEGMENT CODE
?PR?_?PrintStr?SERIAL SEGMENT CODE
?PR?_?clrscr?SERIAL SEGMENT CODE
?PR?_?yyprintf?SERIAL SEGMENT CODE
?PR?_?PrintN?SERIAL SEGMENT CODE
?PR?_?PrintUN?SERIAL SEGMENT CODE
?PR?_?PrintLN?SERIAL SEGMENT CODE
?PR?_?PrintLUN?SERIAL SEGMENT CODE
?PR?_?DispF?SERIAL SEGMENT CODE
?PR?_?PrintW?SERIAL SEGMENT CODE
?CO?SERIAL SEGMENT CODE
?C_INITSEG SEGMENT CODE
?BI?SERIAL SEGMENT BIT
?XD?SERIAL SEGMENT XDATA
EXTRN CODE (?C?ADDXBP)
EXTRN CODE (?C?CLDPTR)
EXTRN CODE (?C?IILDX)
EXTRN DATA (?C_XBP)
EXTRN CODE (?C?CSTPTR)
EXTRN CODE (?C?XBPOFF)
EXTRN CODE (?C?LSTXDATA)
EXTRN CODE (?C?ULSHR)
EXTRN CODE (?C?CLDOPTR)
EXTRN CODE (?C?ILDIX)
EXTRN CODE (?C?CCASE)
EXTRN CODE (?C?ILDPTR)
EXTRN CODE (?C?LSTKXDATA)
EXTRN CODE (?C?LLDPTR)
EXTRN CODE (?C?PLDPTR)
EXTRN CODE (?C?SIDIV)
EXTRN CODE (?C?UIDIV)
EXTRN CODE (?C?SLCMP)
EXTRN CODE (?C?LNEG)
EXTRN CODE (?C?SLDIV)
EXTRN CODE (?C?ULCMP)
EXTRN CODE (?C?ULDIV)
EXTRN CODE (?C?FPCMP3)
EXTRN CODE (?C?FPMUL)
EXTRN CODE (?C?FPDIV)
EXTRN CODE (?C?CASTF)
EXTRN CODE (?C?LMUL)
PUBLIC TxBuf
PUBLIC RxBuf
PUBLIC outTxBuf
PUBLIC inTxBuf
PUBLIC outRxBuf
PUBLIC inRxBuf
PUBLIC TIflag
PUBLIC _?PrintW
PUBLIC _?DispF
PUBLIC _?PrintLUN
PUBLIC _?PrintLN
PUBLIC _?PrintUN
PUBLIC _?PrintN
PUBLIC _?yyprintf
PUBLIC _?clrscr
PUBLIC _?PrintStr
PUBLIC _?PrintLong
PUBLIC _?PrintWord
PUBLIC _?insidePrintWord
PUBLIC _?PrintByte
PUBLIC _?insidePrintByte
PUBLIC _?PrintCh
PUBLIC _?PrintChar
PUBLIC _?yygetch
PUBLIC _?serial
PUBLIC _?InitSerialBuffer
PUBLIC _?InitSerial
RSEG ?BI?SERIAL
TIflag: DBIT 1
RSEG ?XD?SERIAL
inRxBuf: DS 3
outRxBuf: DS 3
inTxBuf: DS 3
outTxBuf: DS 3
RxBuf: DS 50
TxBuf: DS 2000
RSEG ?CO?SERIAL
?SC_0:
DB 00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH
DB 00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH
DB 00AH,00AH,00AH,00AH,00AH,000H
?SC_26:
DB '?' ,'.' ,'?' ,'?' ,'?' ,'?' ,'?' ,'?' ,000H
?SC_35:
DB 'E' ,'%' ,'d' ,000H
RSEG ?C_INITSEG
DB 0C1H, TIflag + 080H ; bit-init
; /*
; *********************************************************************************************************
; * uC/OS-II
; * 实时内核
; *
; * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
; * 版权所有
; *
; * MCU-51 专用代码
; * KEIL C51大模式编译
; *
; * 文件名 : SERIAL.C
; * 作者 : Jean J. Labrosse
; * 改编 : 杨屹 gdtyy@ri.gdt.com.cn 巨龙公司系统集成开发部 2002.09.27
; *********************************************************************************************************
; */
;
; //**********************************************************************************
; //杨屹 2002/08/20 第一版
; //基于中断的串口驱动及显示程序
; //联系方法:gdtyy@ri.gdt.com.cn(2003/07/31以前有效)
; //**********************************************************************************
; //程序特点:
; // 1.基于中断,可并发执行
; // 2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
; //**********************************************************************************
; //使用方法:(此范例自包含,独立于其他程序。)
; // 先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
; // 1.开头加入#include <reg51.h>语句,一定要有。
; // 2.初始化串口 InitSerial();//本例中为20MHz晶体,300波特率,模式2初始化
; // 3.初始化串口缓冲区 InitSerialBuffer();
; // 4.使用显示字节,字,长字,字符,字符串,清屏函数。
; //自包含
; //**********************************************************************************
; //波特率计算公式:
; // TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
; // 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
; // 本例中,SMOD=0;Fosc=20*10E6;Bound=300,所以TH1=0x52。
; //Baud rate(20Mhz)
; //300(52);1200(D5);2400(EA);4800(F5);9600(FB);19200(FD);38400(FF);
; //**********************************************************************************
; //书写风格:
; // 1.带yy前缀标志的函数为杨屹改写的等效C库函数。
; // 2.单个单词用小写,yy定义为前缀,不算一个单词。
; // 3.多个单词(2个及以上),每个单词首字母大写。(有时变量名第一个单词首字母小写)
; // 4.采用内缩风格,每次缩进8个空格。
; //**********************************************************************************
; //应用举例:(可在KEIL仿真环境下运行)
; //源程序文件:serial.h/serial.c/main.c
; //main.c内容:
; //#include <reg51.h>//Note:It must be added.必须在serial.c之前
; //#include <serial.h>
; //main()
; //{
; // unsigned char ch;
; //
; // InitSerial();
; // InitSerialBuffer();
; // while(1){
; // PrintStr("\n");
; // PrintByte(90);PrintStr(" ");
; // PrintWord(90);PrintStr(" ");
; // PrintLong(90);PrintStr(" ");
; // PrintChar('y');PrintChar(' ');//千万别写成双引号,否则打印0(乱字符)。
; // PrintStr("\nHello!\nI'm YangYi.\n");
; // PrintStr("Press any key to continue...");
; // while(!yygetch(&ch));
; // }
; //}
; //**********************************************************************************
; //建议:
; // 你完全可以把该子程序当作函数库使用,以便减少重复劳动,提高代码质量。
; //**********************************************************************************
;
; #ifndef OS_MASTER_FILE
; #include "includes.h"
; #endif
;
; //#include <includes.h>
; //#include <serial.h>
; //#include <reg51.h>
;
; unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
; unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收发缓冲区读写指针
; bit TIflag=1;//Note:It must be 1.
;
; void InitSerial() reentrant//串口初始化
RSEG ?PR?_?InitSerial?SERIAL
_?InitSerial:
; SOURCE LINE # 87
; {
; TMOD=TMOD&0x0F;
; SOURCE LINE # 89
ANL TMOD,#0FH
; TMOD=TMOD|0x20;
; SOURCE LINE # 90
ORL TMOD,#020H
; TL1=0xFD,TH1=0xFD;//19200 , 22.1184MHz
; SOURCE LINE # 91
MOV TL1,#0FDH
MOV TH1,#0FDH
; SCON=0x50;PCON=0x00;
; SOURCE LINE # 92
MOV SCON,#050H
CLR A
MOV PCON,A
; TR1=1;
; SOURCE LINE # 93
SETB TR1
; }
; SOURCE LINE # 94
RET
; END OF _?InitSerial
;
; void InitSerialBuffer(void) reentrant//串口缓冲区初始化
RSEG ?PR?_?InitSerialBuffer?SERIAL
_?InitSerialBuffer:
USING 0
; SOURCE LINE # 96
; {
; inTxBuf=TxBuf;outTxBuf=TxBuf;
; SOURCE LINE # 98
MOV DPTR,#inTxBuf
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (TxBuf)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (TxBuf)
MOVX @DPTR,A
MOV R1,A
INC DPTR
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (TxBuf)
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; inRxBuf=RxBuf;outRxBuf=RxBuf;
; SOURCE LINE # 99
MOV DPTR,#inRxBuf
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (RxBuf)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (RxBuf)
MOVX @DPTR,A
MOV R1,A
INC DPTR
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (RxBuf)
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; ES=1;
; SOURCE LINE # 100
SETB ES
; //EA=1;
; }
; SOURCE LINE # 102
RET
; END OF _?InitSerialBuffer
;
; void serial(void) reentrant
RSEG ?PR?_?serial?SERIAL
_?serial:
USING 0
; SOURCE LINE # 104
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; { //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
; unsigned char *t;
;
; if(TI){
; SOURCE LINE # 108
JNB TI,?C0003
; TI=0;
; SOURCE LINE # 109
CLR TI
; if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
; SOURCE LINE # 110
MOV DPTR,#outTxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
PUSH AR3
PUSH AR2
PUSH AR1
MOV DPTR,#inTxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
POP DPL
POP DPH
POP ACC
XRL A,R3
JNZ ?C0175
MOV A,R1
XRL A,DPL
JNZ ?C0175
MOV A,R2
XRL A,DPH
?C0175:
JNZ ?C0004
SETB TIflag
LJMP ?C0005
?C0004:
; SBUF=*outTxBuf; outTxBuf++;
; SOURCE LINE # 111
MOV DPTR,#outTxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
LCALL ?C?CLDPTR
MOV SBUF,A
MOV DPTR,#outTxBuf+01H
CLR A
MOV B,#01H
LCALL ?C?IILDX
; if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
; SOURCE LINE # 112
MOV DPTR,#outTxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV A,#01H
MOV DPTR,#TxBuf+07D0H
XRL A,R3
JNZ ?C0176
MOV A,R1
XRL A,DPL
JNZ ?C0176
MOV A,R2
XRL A,DPH
?C0176:
JNZ ?C0003
MOV R3,#01H
MOV DPTR,#outTxBuf
INC A
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (TxBuf)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (TxBuf)
MOVX @DPTR,A
; }
; SOURCE LINE # 113
?C0003:
; if(RI){
; SOURCE LINE # 114
JB RI,$ + 6H
LJMP ?C0005
; RI=0;
; SOURCE LINE # 115
CLR RI
; t=inRxBuf;t++;
; SOURCE LINE # 116
MOV DPTR,#inRxBuf
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?IILDX
; if(t==RxBuf+LenRxBuf) t=RxBuf;
; SOURCE LINE # 117
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV A,#01H
MOV DPTR,#RxBuf+032H
XRL A,R3
JNZ ?C0177
MOV A,R1
XRL A,DPL
JNZ ?C0177
MOV A,R2
XRL A,DPH
?C0177:
JNZ ?C0008
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC A
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (RxBuf)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (RxBuf)
MOVX @DPTR,A
?C0008:
; if(t==outRxBuf) return; //RxBuf Full
; SOURCE LINE # 118
MOV DPTR,#outRxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
PUSH AR3
PUSH AR2
PUSH AR1
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
POP DPL
POP DPH
POP ACC
XRL A,R3
JNZ ?C0178
MOV A,R1
XRL A,DPL
JNZ ?C0178
MOV A,R2
XRL A,DPH
?C0178:
JZ ?C0005
?C0009:
; *inRxBuf=SBUF;
; SOURCE LINE # 119
MOV DPTR,#inRxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV A,SBUF
LCALL ?C?CSTPTR
; inRxBuf=t;
; SOURCE LINE # 120
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPTR,#inRxBuf
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; }
; SOURCE LINE # 121
; }
; SOURCE LINE # 122
?C0005:
MOV DPTR,#03H
LJMP ?C?ADDXBP
; END OF _?serial
;
; bit yygetch(unsigned char *ch) reentrant//从串口缓冲区读1字节数据
RSEG ?PR?_?yygetch?SERIAL
_?yygetch:
USING 0
; SOURCE LINE # 124
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; {
; //ES=0;
; if(inRxBuf==outRxBuf) {ES=1;return 0;} //RxBuf Empty
; SOURCE LINE # 127
MOV DPTR,#outRxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
PUSH AR3
PUSH AR2
PUSH AR1
MOV DPTR,#inRxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
POP DPL
POP DPH
POP ACC
XRL A,R3
JNZ ?C0179
MOV A,R1
XRL A,DPL
JNZ ?C0179
MOV A,R2
XRL A,DPH
?C0179:
JNZ ?C0010
SETB ES
CLR C
SJMP ?C0011
?C0010:
; *ch=*outRxBuf; outRxBuf++;
; SOURCE LINE # 128
MOV DPTR,#outRxBuf
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
LCALL ?C?CLDPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV A,R7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -