📄 serial.lst
字号:
C51 COMPILER V7.01 SERIAL 03/25/2006 17:00:53 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN Serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Serial.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************/
2 /*C51 serial console---Csc v1.0*/
3 /*Author: SPECIAL */
4 /*E_mail: pajoke@163.com */
5 /*******************************/
6 /*
7 编译时会出现:"*** WARNING L15: MULTIPLE CALL TO SEGMENT"
8 是交叉调用引起的,可以不用理会.
9 是可重入的问题(reentrant),可以处理掉,不过不想管它(有点烦)!
10 最小系统占用资源:Program Size: data=24.0 xdata=0 code=943
11 */
12 #include <REG52.H>
13 #include "Serial.h"
14 #define uchar unsigned char
15 //*********参数定义********
16 #define BufferLength 0x030 //定义串口字符串的缓冲区大小
17 #define CmdNum 0x06 //定义系统命令的个数
18 //*************************
19 #define CloseSerial SendString("\n>Serial Control System Halt...\n>Serial Close......");
20 //*************************
21 uchar S_Buffer[BufferLength];//串口缓冲区
22 uchar code cmd_tab[CmdNum][5]=//命令最多只能定义(5-1)个字母,否则会出乱
23 {
24 "exit",//0━┓这两个
25 "help",//1━┛不要改
26 "ghex",//2
27 };
28 //******************************
29 void serial_Int(void) interrupt 4 //串口中断服务子程序
30 {
31 1 if(RI)
32 1 {
33 2 ES=0;
34 2 switch(GetCmd())
35 2 {
36 3 case 0:CloseSerial;
37 3 ES=0;
38 3 return;
39 3 break;
40 3 case 1:SendCmdType();
41 3 break;
42 3 //***********以下为用户命令的执行区***************/
43 3 case 2:SendString("\nInput One Hex Number!\n");
44 3 SendHex(GetHex());
45 3 break;
46 3 //***********以上为用户命令的执行区***************/
47 3 default:SendString("\nInvalid command!\n");
48 3 break;
49 3 }
50 2 ES=1;
51 2 SendString("\nCsc=>");
52 2 }
53 1 }
54
55 //**************************
C51 COMPILER V7.01 SERIAL 03/25/2006 17:00:53 PAGE 2
56 void InitSerial() //串口初始化,设波特率要跟据实际情况调整
57 {
58 1 /*
59 1 TMOD=TMOD&0x0F;
60 1 TMOD=TMOD|0x**;
61 1 TL1=0x**,TH1=0x**;
62 1 SCON=0x**;
63 1 TR1=1;
64 1 */
65 1 SCON=0x90;//工作方式2 波特率=fosc/32(软件仿真就无所谓了)
66 1 ES=1;
67 1 EA=1;
68 1 SendString("@Serial Control System Start...\n*C51 serial console---Csc v1.0\n*Author: SPECIAL\n*E_mail:p
-ajoke@163.com\n>Input the command...(Type\"help\"to show CMD type)\nCsc=>");
69 1 }
70 //**************************
71 uchar GetCmd()//从串口取命令 ,返回值"0xFF"用作报错的保留值
72 {
73 1 uchar i,j;
74 1 GetString();
75 1 for(i=0;i<CmdNum;i++)
76 1 {
77 2 for(j=0;j<5;j++)
78 2 {
79 3 if(S_Buffer[j]!=cmd_tab[i][j])
80 3 break;
81 3 if((S_Buffer[j]=='\0')&&(cmd_tab[i][j]=='\0'))
82 3 return(i);
83 3 }
84 2 }
85 1 return(0xff);
86 1 }
87 //**************************
88 void SendString(uchar *ptr)//发送字符串
89 {
90 1 do
91 1 {
92 2 SendChar(*(ptr++));
93 2 }while(*(ptr)!='\0');
94 1 }
95 //***************************
96 void GetString()//读取一字符串
97 {
98 1 uchar i=0;
99 1 do
100 1 {
101 2 S_Buffer[i]=GetChar();
102 2 if(S_Buffer[i]=='\r')
103 2 {
104 3 S_Buffer[i]='\0';
105 3 return;
106 3 }
107 2 if(S_Buffer[i]!='\b')// 用于解决退格键的输入问题
108 2 {
109 3 SendChar(S_Buffer[i]);
110 3 i++;
111 3 }
112 2 else
113 2 {
114 3 if(i>0)
115 3 {
116 4 S_Buffer[i]='\0';
C51 COMPILER V7.01 SERIAL 03/25/2006 17:00:53 PAGE 3
117 4 i--;
118 4 S_Buffer[i]='\0';
119 4 SendChar('\b');
120 4 }
121 3 else
122 3 S_Buffer[i]='\0';
123 3 }
124 2 }while(i<BufferLength-1);
125 1 S_Buffer[i]='\0';
126 1 }
127 //****************************
128 void SendChar(uchar _char)//发送一个字节
129 {
130 1 F0=ES;//保护ES位
131 1 ES=0;
132 1 SBUF=_char;
133 1 while(!TI);
134 1 TI=0;
135 1 ES=F0;
136 1 }
137 //****************************
138 uchar GetChar() //读取一个字节
139 {
140 1 F0=ES;//保护ES位
141 1 ES=0;
142 1 while(!RI);
143 1 RI=0;
144 1 ES=F0;
145 1 return(SBUF);
146 1 }
147 //****************************
148 void SendHex(uchar ch) //发送一个字节的16进制数
149 { //也适用于发送压缩BCD码
150 1 SendCh(ch>>4);
151 1 SendCh(ch&0x0f);
152 1 }
153 //****************************
154 uchar GetHex()
155 {
156 1 uchar temp,ret_num;
157 1 do
158 1 {
159 2 temp=GetChar();
160 2 if(temp=='\b')
161 2 SendChar('\b');
162 2 }while(temp=='\b'||temp=='\r');
163 1 SendChar(temp);
164 1 if(temp>='0'&&temp<='9')
165 1 ret_num=(temp-'0')<<4;
166 1 else
167 1 if(temp>='A'&&temp<='F')
168 1 ret_num=(temp-'A'+10)<<4;
169 1 else
170 1 if(temp>='a'&&temp<='f')
171 1 ret_num=(temp-'a'+10)<<4;
172 1 else
173 1 {
174 2 SendString("\nError Format!\n");
175 2 return 0;
176 2 }
177 1 do
178 1 {
C51 COMPILER V7.01 SERIAL 03/25/2006 17:00:53 PAGE 4
179 2 temp=GetChar();
180 2 if(temp=='\b')
181 2 SendChar('\b');
182 2 }while(temp=='\b'||temp=='\r');
183 1 SendChar(temp);
184 1 if(temp>='0'&&temp<='9')
185 1 ret_num+=temp-'0';
186 1 else
187 1 if(temp>='A'&&temp<='F')
188 1 ret_num+=temp-'A'+10;
189 1 else
190 1 if(temp>='a'&&temp<='f')
191 1 ret_num+=temp-'a'+10;
192 1 else
193 1 {
194 2 SendString("\nError Format!\n");
195 2 return 0;
196 2 }
197 1 return(ret_num);
198 1 }
199 //****************************
200 void SendCh(uchar ch)//内部处理函数
201 {
202 1 if(ch>=0&&ch<=9)
203 1 ch=ch+'0';
204 1 else
205 1 ch=ch+'A'-10;
206 1 SendChar(ch);
207 1 }
208 //****************************
209 void SendCmdType()//发送系统所识别的命令列表
210 {
211 1 uchar i;
212 1 SendString("\nCommand list:\n");
213 1 for(i=0;i<CmdNum;i++)
214 1 {
215 2 SendChar(' ');
216 2 SendChar(i+0x30);
217 2 SendChar(':');
218 2 SendString(cmd_tab[i]);
219 2 SendChar('\n');
220 2 }
221 1 }
222 //*****************************
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 685 ----
CONSTANT SIZE = 323 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 48 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -