📄 text.lst
字号:
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEXT
OBJECT MODULE PLACED IN Text.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE Text.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /* 51单片机+1602LCD+PC键盘(测试OK)[路漫漫其修远兮,吾将上下而求索!]
2 [ 2007-1-25 10:06:00 | By: elecqht ] */
3
4 #include <Reg51.h>
5 #include <intrins.h> //_nop_();
6 #include <stdio.h>
7 #define uchar unsigned char
8 #define uint unsigned int
9 #define ulong unsigned long
10 #define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
11
12 sbit LCM_RW= P3^6; //定义LCD引脚
13 sbit LCM_RS= P3^7;
14 sbit LCM_E= P1^7;
15 #define LCM_Data P0
16
17 sbit Key_Data =P1^6; //定义Keyboard引脚
18 sbit Key_CLK= P3^3;
19
20 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
21
22 void LCMInit(void);
23 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
24 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
25 void Delay5Ms(void);
26 void Delay400Ms(void);
27 void Decode(unsigned char ScanCode);
28 void WriteDataLCM(unsigned char WDLCM);
29 void WriteCommandLCM(unsigned char WCLCM,BuysC);
30
31 unsigned char ReadDataLCM(void);
32 unsigned char ReadStatusLCM(void);
33 unsigned char code cdle_net[] = {"www.newmcu.com"};
34 unsigned char code email[] = {"zsdfwnl@163.com"};
35 unsigned char code Cls[] = {" "};
36 static unsigned char IntNum = 0; //中断次数计数
37 static unsigned char KeyV; //键值
38 static unsigned char DisNum = 0; //显示用指针
39 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
40 static unsigned char BF = 0; //标识是否有字符被收到
41 unsigned char code UnShifted[59][2] =
42 {
43 0x1C, 'a',
44 0x32, 'b',
45 0x21, 'c',
46 0x23, 'd',
47 0x24, 'e',
48 0x2B, 'f',
49 0x34, 'g',
50 0x33, 'h',
51 0x43, 'i',
52 0x3B, 'j',
53 0x42, 'k',
54 0x4B, 'l',
55 0x3A, 'm',
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 2
56 0x31, 'n',
57 0x44, 'o',
58 0x4D, 'p',
59 0x15, 'q',
60 0x2D, 'r',
61 0x1B, 's',
62 0x2C, 't',
63 0x3C, 'u',
64 0x2A, 'v',
65 0x1D, 'w',
66 0x22, 'x',
67 0x35, 'y',
68 0x1A, 'z',
69 0x45, '0',
70 0x16, '1',
71 0x1E, '2',
72 0x26, '3',
73 0x25, '4',
74 0x2E, '5',
75 0x36, '6',
76 0x3D, '7',
77 0x3E, '8',
78 0x46, '9',
79 0x0E, '`',
80 0x4E, '-',
81 0x55, '=',
82 0x5D, '\\',
83 0x29, ' ',
84 0x54, '[',
85 0x5B, ']',
86 0x4C, ';',
87 0x52, '\'',
88 0x41, ',',
89 0x49, '.',
90 0x4A, '/',
91 0x71, '.',
92 0x70, '0',
93 0x69, '1',
94 0x72, '2',
95 0x7A, '3',
96 0x6B, '4',
97 0x73, '5',
98 0x74, '6',
99 0x6C, '7',
100 0x75, '8',
101 0x7D, '9',
102 };
103
104 unsigned char code Shifted[59][2] = {
105 0x1C, 'A',
106 0x32, 'B',
107 0x21, 'C',
108 0x23, 'D',
109 0x24, 'E',
110 0x2B, 'F',
111 0x34, 'G',
112 0x33, 'H',
113 0x43, 'I',
114 0x3B, 'J',
115 0x42, 'K',
116 0x4B, 'L',
117 0x3A, 'M',
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 3
118 0x31, 'N',
119 0x44, 'O',
120 0x4D, 'P',
121 0x15, 'Q',
122 0x2D, 'R',
123 0x1B, 'S',
124 0x2C, 'T',
125 0x3C, 'U',
126 0x2A, 'V',
127 0x1D, 'W',
128 0x22, 'X',
129 0x35, 'Y',
130 0x1A, 'Z',
131 0x45, '0',
132 0x16, '1',
133 0x1E, '2',
134 0x26, '3',
135 0x25, '4',
136 0x2E, '5',
137 0x36, '6',
138 0x3D, '7',
139 0x3E, '8',
140 0x46, '9',
141 0x0E, '~',
142 0x4E, '_',
143 0x55, '+',
144 0x5D, '|',
145 0x29, ' ',
146 0x54, '{',
147 0x5B, '}',
148 0x4C, ':',
149 0x52, '"',
150 0x41, '<',
151 0x49, '>',
152 0x4A, '?',
153 0x71, '.',
154 0x70, '0',
155 0x69, '1',
156 0x72, '2',
157 0x7A, '3',
158 0x6B, '4',
159 0x73, '5',
160 0x74, '6',
161 0x6C, '7',
162 0x75, '8',
163 0x7D, '9',
164 };
165
166
167
168 void main(void)
169 {
170 1 unsigned char TempCyc;
171 1
172 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
173 1 LCMInit(); //LCM初始化
174 1 Delay5Ms(); //延时片刻(可不要)
175 1
176 1 DisplayListChar(0, 0, cdle_net);
177 1 DisplayListChar(0, 1, email);
178 1 ReadDataLCM();//测试用句无意义+
179 1 for (TempCyc=0; TempCyc<10; TempCyc++)
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 4
180 1 Delay400Ms(); //延时
181 1 DisplayListChar(0, 1, Cls);
182 1
183 1 IT1 = 0; //设外部中断1为低电平触发
184 1 EA = 1;
185 1 EX1 = 1; //开中断
186 1
187 1 do
188 1 {
189 2 if (BF)
190 2 Decode(KeyV);
191 2 else
192 2 EA = 1; //开中断
193 2 }
194 1 while(1);
195 1
196 1 }
197
198 //写数据
199 void WriteDataLCM(unsigned char WDLCM)
200 {
201 1 ReadStatusLCM(); //检测忙
202 1 LCM_Data = WDLCM;
203 1 LCM_RS = 1;
204 1 LCM_RW = 0;
205 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
206 1 LCM_E = 0; //延时
207 1 LCM_E = 1;
208 1 }
209
210 //写指令
211 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
212 {
213 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
214 1 LCM_Data = WCLCM;
215 1 LCM_RS = 0;
216 1 LCM_RW = 0;
217 1 LCM_E = 0;
218 1 LCM_E = 0;
219 1 LCM_E = 1;
220 1 }
221
222 //读数据
223 unsigned char ReadDataLCM(void)
224 {
225 1 LCM_RS = 1;
226 1 LCM_RW = 1;
227 1 LCM_E = 0;
228 1 LCM_E = 0;
229 1 LCM_E = 1;
230 1 return(LCM_Data);
231 1 }
232
233 //读状态
234 unsigned char ReadStatusLCM(void)
235 {
236 1 LCM_Data = 0xFF;
237 1 LCM_RS = 0;
238 1 LCM_RW = 1;
239 1 LCM_E = 0;
240 1 LCM_E = 0;
241 1 LCM_E = 1;
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 5
242 1 while (LCM_Data & Busy); //检测忙信号
243 1 return(LCM_Data);
244 1 }
245
246 void LCMInit(void) //LCM初始化
247 {
248 1 LCM_Data = 0;
249 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
250 1 Delay5Ms();
251 1 WriteCommandLCM(0x38,0);
252 1 Delay5Ms();
253 1 WriteCommandLCM(0x38,0);
254 1 Delay5Ms();
255 1
256 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
257 1 WriteCommandLCM(0x08,1); //关闭显示
258 1 WriteCommandLCM(0x01,1); //显示清屏
259 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
260 1 WriteCommandLCM(0x0F,1); // 显示开及光标设置
261 1 }
262
263 //按指定位置显示一个字符
264 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
265 {
266 1 Y &= 0x1;
267 1 X &= 0xF; //限制X不能大于15,Y不能大于1
268 1 X|= 0x40; //当要显示第二行时地址码+0x40;
269 1 X |= 0x80; //算出指令码
270 1 WriteCommandLCM(X, 1); //发命令字
271 1 WriteDataLCM(DData); //发数据
272 1 }
273
274 //按指定位置显示一串字符
275 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
276 {
277 1 unsigned char ListLength;
278 1
279 1 ListLength = 0;
280 1 Y &= 0x1;
281 1 X &= 0xF; //限制X不能大于15,Y不能大于1
282 1 while (DData[ListLength]>0x19) //若到达字串尾则退出
283 1 {
284 2 if (X <= 0xF) //X坐标应小于0xF
285 2 {
286 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
287 3 ListLength++;
288 3 X++;
289 3 }
290 2 }
291 1 }
292
293 //5ms延时
294 void Delay5Ms(void)
295 {
296 1 unsigned int TempCyc = 5552;
297 1 while(TempCyc--);
298 1 }
299
300 //400ms延时
301 void Delay400Ms(void)
302 {
303 1 unsigned char TempCycA = 5;
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 6
304 1 unsigned int TempCycB;
305 1 while(TempCycA--)
306 1 {
307 2 TempCycB=7269;
308 2 while(TempCycB--);
309 2 };
310 1 }
311
312 void Keyboard_out(void) interrupt 2
313 {
314 1 if ((IntNum > 0) && (IntNum < 9))
315 1 {
316 2 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
317 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
318 2 }
319 1 IntNum++;
320 1 while (!Key_CLK); //等待PS/2CLK拉高
321 1
322 1 if (IntNum > 10)
323 1 {
324 2 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
325 2 BF = 1; //标识有字符输入完了
326 2 EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声
-明为再入函数)
327 2 }
328 1 }
329
330 void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
-+shift的断码+G的断码
331 {
332 1 unsigned char TempCyc;
333 1
334 1 if (!Key_UP) //当键盘松开时
335 1 {
336 2 switch (ScanCode)
337 2 {
338 3 case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
339 3 Key_UP = 1;
340 3 break;
341 3
342 3 case 0x12 : // 左 SHIFT
343 3 Shift = 1;
344 3 break;
345 3
346 3 case 0x59 : // 右 SHIFT
347 3 Shift = 1;
348 3 break;
349 3
350 3 default:
351 3 if (DisNum > 15)
352 3 {
353 4 DisplayListChar(0, 1, Cls);//清LCD第二行
354 4 DisNum = 0;
355 4 }
356 3 if(!Shift) //如果SHIFT没按下
357 3 {
358 4 for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
359 4 if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
360 4 DisNum++;
361 4 }
362 3 else //按下SHIFT
363 3 {
C51 COMPILER V8.02 TEXT 10/13/2007 21:47:57 PAGE 7
364 4 for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
365 4 if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
366 4 DisNum++;
367 4 }
368 3
369 3 break;
370 3 }
371 2 }
372 1 else
373 1 {
374 2 Key_UP = 0;
375 2 switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
376 2 {
377 3 case 0x12 : // 左 SHIFT
378 3 Shift = 0;
379 3 break;
380 3
381 3 case 0x59 : // 右 SHIFT
382 3 Shift = 0;
383 3 break;
384 3 }
385 2 }
386 1 BF = 0; //标识字符处理完了
387 1 }
388
389
390
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 592 ----
CONSTANT SIZE = 269 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 11
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 + -