📄 serial.lst
字号:
C51 COMPILER V8.02 SERIAL 09/14/2007 22:10:13 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE serial.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 //**********************************************************************************
2 // 孙尚新
3 //基于中断的串口驱动及显示程序
4 //联系方法: sunshangxin@163.com
5 //**********************************************************************************
6
7
8 #include <command.h>
9 #define ENTER_KEY 0x0d
10 #define BACK_KEY 0x08
11 #define ESC_KEY 0x1b
12
13
14 unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
15 unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收发缓冲区读写指针
16 bit TIflag=1;//Note:It must be 1.
17
18 #define CRYSTAL 22118400
19 #define SERBAUD 19200
20
21 void InitSerial()//串口初始化
22 {
23 1 TMOD=TMOD&0x0F;
24 1 TMOD=TMOD|0x20;
25 1 TL1=256 - (CRYSTAL/12/32/SERBAUD),TH1=256-(CRYSTAL/12/32/SERBAUD);
26 1 SCON=0x50;PCON=0x00;
27 1 TR1=1;
28 1 }
29
30 void InitSerialBuffer(void) //串口缓冲区初始化
31 {
32 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
33 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
34 1 ES=1;
35 1 //EA=1;
36 1 }
37
38 void serial(void) interrupt 4
39 { //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
40 1 unsigned char *t;
41 1 if(TI){
42 2 TI=0;
43 2 if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
44 2 SBUF=*outTxBuf; outTxBuf++;
45 2 if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
46 2 }
47 1 if(RI){
48 2 RI=0;
49 2 t=inRxBuf;t++;
50 2 if(t==RxBuf+LenRxBuf) t=RxBuf;
51 2 if(t==outRxBuf) return; //RxBuf Full
52 2 *inRxBuf=SBUF;
53 2 inRxBuf=t;
54 2 }
55 1 }
C51 COMPILER V8.02 SERIAL 09/14/2007 22:10:13 PAGE 2
56
57 bit getch(unsigned char *ch) //从串口缓冲区读1字节数据
58 {
59 1 //ES=0;
60 1 if(inRxBuf==outRxBuf) {ES=1;return 0;} //RxBuf Empty
61 1 *ch=*outRxBuf; outRxBuf++;
62 1 if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
63 1 //ES=1;
64 1 return 1;
65 1 }
66
67 void PrintChar(unsigned char ch) //显示字符
68 {
69 1 unsigned char *t;
70 1 //ES=0;
71 1
72 1 t=inTxBuf;t++;
73 1 if(t==TxBuf+LenTxBuf) t=TxBuf;
74 1 if(t==outTxBuf) {/*ES=1;*/return;} //TxBuf Full
75 1 *inTxBuf=ch;
76 1 inTxBuf=t;
77 1 if(TIflag){
78 2 TIflag=0;
79 2 TI=1;
80 2 }
81 1 //ES=1;
82 1 }
83
84 void PrintCh(unsigned char ch) //内部使用,不建议用户看到。
85 {
86 1 if(ch>=0&&ch<=9) ch=ch+'0';
87 1 else ch=ch+'A'-10;
88 1 PrintChar(ch);
89 1 }
90
91 void insidePrintByte(unsigned char Byte) //内部使用,以十六进制格式显示1个字节数据
92 {
93 1 unsigned char c;
94 1 c=Byte;
95 1 c=c>>4;
96 1 PrintCh(c);
97 1 c=Byte;c=c&0x0F;PrintCh(c);
98 1 }
99
100 void PrintByte(unsigned char Byte) //以十六进制格式显示1个字节数据
101 {
102 1 EA=0;
103 1 insidePrintByte(Byte);
104 1 EA=1;
105 1 }
106
107 void insidePrintWord(unsigned int Word) //内部使用,以十六进制格式显示1个字数据
108 {
109 1 insidePrintByte(Word>>8);
110 1 insidePrintByte(Word&0xFF);
111 1 }
112
113 void PrintWord(unsigned int Word) //以十六进制格式显示1个字数据
114 {
115 1 EA=0;
116 1 insidePrintWord(Word);
117 1 EA=1;
C51 COMPILER V8.02 SERIAL 09/14/2007 22:10:13 PAGE 3
118 1 }
119
120 void PrintLong(unsigned long LongWord) //以十六进制格式显示1个长字数据
121 {
122 1 EA=0;
123 1 insidePrintWord(LongWord>>16);
124 1 insidePrintWord(LongWord&0xFFFF);
125 1 EA=1;
126 1 }
127
128 void PrintStr(unsigned char *str) //显示字符串
129 {
130 1 int i;
131 1 unsigned char j;
132 1 unsigned char ch;
133 1
134 1 EA=0;
135 1 for(i=0;i<MaxLenStr;i++){
136 2 ch=*(str+i);
137 2 if(ch=='\0') break;
138 2 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
139 2 else if(ch=='\t'){
140 3 for(j=0;j<TABNum;j++)
141 3 PrintChar(' ');
142 3 }
143 2 else PrintChar(ch);
144 2 }
145 1 EA=1;
146 1 }
147
148 void clrscr() //清屏
149 {
150 1 PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//25个回车换行清屏幕。
151 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 946 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = 2062 17
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -