📄 uart.lst
字号:
C51 COMPILER V4.01, UART 06/10/05 11:07:07 PAGE 1
DOS C51 COMPILER V4.01, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: C:\TOPICE52\BIN\C51.EXE UART.C NOREGPARMS OE OT(0) DB PR RB(0) LARGE OJ(UART.OBJ)
stmt level source
1 #include <reg51.h>
2 #include <stdio.h>
3
4 #define SYSCLK 12000000
5 #define BAUDRATE 4800
6
7 //收发缓冲区长度
8 #define LenTxBuf 1024 //不要太小
9 #define LenRxBuf 32
10 #define MaxLenStr 80 //buf[MaxLenStr+1]为 '\0'
11 #define TABNum 4 //TAB键移动长度
12
13 unsigned char RxBuf[LenRxBuf], TxBuf[LenTxBuf]; //收发缓冲区实体
14 unsigned char *rRxBuf, *wRxBuf, *rTxBuf, *wTxBuf; //收发缓冲区读写指针
15 unsigned char Cmd[16]; //分析处理后的命令
16 bit TIflag = 1; //发送标志
17 bit RIflag = 0; //接收标志
18
19
20 /****************************************************************************************
21 * 功能: 串口初始化,缓冲区初始化
22 * 参数: 无
23 ****************************************************************************************/
24 void uartInit(void)
25 {
26 1 SCON = 0x50; //方式1
27 1 PCON = 0x80; //SMOD=1;
28 1
29 1 TMOD = 0x20; //定时器1为自动重装载的8 位计数器/定时器
30 1 TH1 = 256 - (SYSCLK/12/16/BAUDRATE);
31 1 TL1 = TH1;
32 1 TR1 = 1; //启动定时器1
33 1
34 1 rTxBuf = TxBuf; //串口缓冲区初始化
35 1 wTxBuf = TxBuf;
36 1 rRxBuf = RxBuf;
37 1 wRxBuf = RxBuf;
38 1
39 1 EA = 1;
40 1 ES = 1;
41 1 }
42
43
44 /****************************************************************************************
45 * 功能: 串口中断服务程序
46 * 参数: 无
47 ****************************************************************************************/
48 void uartISR(void) interrupt 4
49 {
50 1 unsigned char *t;
51 1
52 1 if (TI)
53 1 {
54 2 TI = 0;
55 2 if (rTxBuf == wTxBuf) //TxBuf Empty
56 2 {
57 3 TIflag = 1;
58 3 return;
59 3 }
C51 COMPILER V4.01, UART 06/10/05 11:07:07 PAGE 2
60 2 SBUF = *rTxBuf;
61 2 rTxBuf++;
62 2 if (rTxBuf == TxBuf + LenTxBuf)
63 2 rTxBuf = TxBuf;
64 2 }
65 1 if (RI)
66 1 {
67 2 RI = 0;
68 2 t = wRxBuf;
69 2 t++;
70 2 if (t == RxBuf + LenRxBuf)
71 2 t = RxBuf;
72 2 if (t == rRxBuf) //RxBuf Full
73 2 {
74 3 RIflag = 1;
75 3 return;
76 3 }
77 2 *wRxBuf = SBUF;
78 2 if (*(wRxBuf - 1) == '\r') // 判断接收到回车否
79 2 {
80 3 RIflag = 1;
81 3 return;
82 3 }
83 2 else
84 2 {
85 3 wRxBuf = t;
86 3 }
87 2 }
88 1 }
89
90
91 /****************************************************************************************
92 * 功能: 显示单个字符
93 * 参数: 单个字符
94 ****************************************************************************************/
95 void PrintChar(unsigned char ch)
96 {
97 1 unsigned char *t;
98 1
99 1 ES = 0;
100 1 if (TIflag)
101 1 {
102 2 TIflag = 0;
103 2 TI = 1;
104 2 }
105 1 t = wTxBuf;
106 1 t++;
107 1 if (t == TxBuf + LenTxBuf)
108 1 t = TxBuf;
109 1 if (t == rTxBuf) //TxBuf Full
110 1 {
111 2 ES = 1;
112 2 return;
113 2 }
114 1 *wTxBuf = ch;
115 1 wTxBuf = t;
116 1 ES = 1;
117 1 }
118
119
120 /****************************************************************************************
121 * 功能: 显示字符串
122 * 参数: 字符串指针
123 ****************************************************************************************/
124 void PrintStr(unsigned char *str)
125 {
C51 COMPILER V4.01, UART 06/10/05 11:07:07 PAGE 3
126 1 int i;
127 1 unsigned char j;
128 1 unsigned char ch;
129 1
130 1 EA = 0;
131 1 for (i=0; i<MaxLenStr; i++)
132 1 {
133 2 ch = *(str + i);
134 2 if (ch == '\0')
135 2 break;
136 2 else
137 2 if (ch == '\n')
138 2 {
139 3 PrintChar(10);
140 3 PrintChar(13);
141 3 }
142 2 else
143 2 if (ch == '\t')
144 2 {
145 3 for (j=0; j<TABNum; j++)
146 3 PrintChar(' ');
147 3 }
148 2 else
149 2 PrintChar(ch);
150 2 }
151 1 EA=1;
152 1 }
153
154
155 /****************************************************************************************
156 * 功能: 从串口缓冲区读一个字节数据
157 * 参数: 单个字符指针
158 ****************************************************************************************/
159 bit mygetch(unsigned char *ch)
160 {
161 1 ES = 0;
162 1 if (rRxBuf == wRxBuf) //RxBuf Empty
163 1 {
164 2 ES = 1;
165 2 return 0;
166 2 }
167 1
168 1 *ch = *rRxBuf;
169 1 rRxBuf++;
170 1 if (rRxBuf == RxBuf + LenRxBuf)
171 1 rRxBuf = RxBuf;
172 1 ES = 1;
173 1 return 1;
174 1 }
175
176
177 /****************************************************************************************
178 * 功能: 读取串口缓冲区的数据
179 * 参数: 字符串指针
180 ****************************************************************************************/
181 bit readRxBuf(unsigned char *str)
182 {
183 1 unsigned char ch, i;
184 1
185 1 EA = 0;
186 1 if (RIflag)
187 1 {
188 2 RIflag = 0;
189 2 }
190 1 if (rRxBuf == wRxBuf) //RxBuf Empty
191 1 {
C51 COMPILER V4.01, UART 06/10/05 11:07:07 PAGE 4
192 2 EA = 1;
193 2 return 0;
194 2 }
195 1
196 1 for (i=0; i<LenRxBuf; i++)
197 1 {
198 2 if (mygetch(&ch))
199 2 {
200 3 if (ch == '\r')
201 3 {
202 4 *str = '\0';
203 4 break;
204 4 }
205 3 else
206 3 {
207 4 *str = ch;
208 4 str++;
209 4 }
210 3 }
211 2 else
212 2 {
213 3 return 0;
214 3 }
215 2 }
216 1
217 1 rRxBuf = RxBuf;
218 1 wRxBuf = RxBuf;
219 1 EA = 1;
220 1 return 1;
221 1 }
222
223
224 /****************************************************************************************
225 * 功能: 去除接收缓冲区字符串ComBuf中的空格,并处理退格,形成命令字符串cmd
226 * 参数: ComBuf--串口缓冲区字符串指针
227 * cmd--命令字符串指针
228 ****************************************************************************************/
229 void parse(unsigned char *ComBuf, unsigned char *cmd)
230 {
231 1 int i, j;
232 1
233 1 for (i=0, j=0; 1; i++)
234 1 {
235 2 if (ComBuf[i] == '\0') //End
236 2 {
237 3 cmd[j] = '\0';
238 3 break;
239 3 }
240 2
241 2 if (ComBuf[i] == ' ') //Blank
242 2 {
243 3 continue;
244 3 }
245 2 else
246 2 if (ComBuf[i] == 0x08) //Back Space
247 2 {
248 3 j--;
249 3 }
250 2 else
251 2 {
252 3 cmd[j++] = ComBuf[i];
253 3 }
254 2 }
255 1 }
256
257
C51 COMPILER V4.01, UART 06/10/05 11:07:07 PAGE 5
258 /****************************************************************************************
259 * 功能: 显示的欢迎信息
260 * 参数: 无
261 ****************************************************************************************/
262 void Welcome(void)
263 {
264 1 PrintStr("\n\n\n\n");
265 1 PrintStr("\n/************************* 51 shell ***********************************/\n");
266 1 PrintStr("\n Welcome to the command mode!\n");
267 1 PrintStr("\n/**********************************************************************/\n");
268 1 }
269
270
271 /****************************************************************************************
272 * 功能: 显示命令行提示符
273 * 参数: 无
274 ****************************************************************************************/
275 void CmdLine(void)
276 {
277 1 PrintStr("\n\n>");
278 1 }
279
280
281 /****************************************************************************************
282 * 功能: 命令不匹配时的功能函数
283 * 参数: 无
284 ****************************************************************************************/
285 void CmdError(void)
286 {
287 1 PrintStr("Command error!\nPlease input 'help' or '?' to get for help.\n");
288 1 }
289
290
291 /****************************************************************************************
292 * 功能: D命令功能函数,读memeory内容
293 * CmdDI(): 读内部RAM
294 * CmdDC(): 读程序存储器ROM
295 * CmdDX(): 读外部RAM
296 * 参数: 无
297 ****************************************************************************************/
298 void CmdDI(void);
299 void CmdDC(void);
300 void CmdDX(void);
301
302 void CmdD(void)
303 {
304 1 switch (Cmd[1])
305 1 {
306 2 case 'i' :
307 2 CmdDI();
308 2 break;
309 2 case 'c' :
310 2 CmdDC();
311 2 break;
312 2 case 'x' :
313 2 CmdDX();
314 2 break;
315 2 default :
316 2 CmdError();
317 2 }
318 1 }
319
320
321 void CmdDI(void)
322 {
323 1 int i, j;
C51 COMPILER V4.01, UART 06/10/05 11:07:07 PAGE 6
324 1 unsigned char idata * pchar; // memory access pointer
325 1 unsigned char ch;
326 1 unsigned char buffer[100];
327 1
328 1 if (Cmd[4] != '\0')
329 1 {
330 2 CmdError();
331 2 return;
332 2 }
333 1
334 1 for (i=2; i<=3; i++)
335 1 {
336 2 if ((Cmd[i] >= '0' && Cmd[i] <='9') || (Cmd[i] >= 'a' && Cmd[i] <='f')
337 2 || (Cmd[i] >= 'A' && Cmd[i] <='F'))
338 2 {
339 3 if ((Cmd[i] >= 'a' && Cmd[i] <='f') || (Cmd[i] >= 'A' && Cmd[i] <='F'))
340 3 Cmd[i] += 9;
341 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -