📄 lcd3.lst
字号:
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE LCD3
OBJECT MODULE PLACED IN lcd3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd3.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <absacc.h>
2 #include <reg51.h>
3 #include <string.h>
4 #include <stdarg.h>
5 #include <stdio.h>
6 #include <zifu.c>
7 #include <hz.c>
8 #define ulong unsigned long
9 #define uint unsigned int
10 #define uchar unsigned char
11 #define LC_CUR_POS 0x21 // 光标位置设置
12 #define LC_CGR_POS 0x22 // CGRAM偏置地址设置
13 #define LC_ADD_POS 0x24 // 地址指针位置
14 #define LC_TXT_STP 0x40 // 文本区首址
15 #define LC_TXT_WID 0x41 // 文本区宽度
16 #define LC_GRH_STP 0x42 // 图形区首址
17 #define LC_GRH_WID 0x43 // 图形区宽度
18 #define LC_MOD_OR 0x80 // 显示方式:逻辑“或”
19 #define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
20 #define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
21 #define LC_MOD_TCH 0x83 // 显示方式:文本特征
22 #define LC_DIS_SW 0x9B // 显示开关:D0=1/0:光标闪烁启用/禁用;
23 // D1=1/0:光标显示启用/禁用;
24 // D2=1/0:文本显示启用/禁用;
25 // D3=1/0:图形显示启用/禁用;
26 #define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
27 #define LC_AUT_WR 0xB0 // 自动写设置
28 #define LC_AUT_RD 0xB1 // 自动读设置
29 #define LC_AUT_OVR 0xB2 // 自动读/写结束
30 #define LC_INC_WR 0xC0 // 数据一次写,地址加1
31 #define LC_INC_RD 0xC1 // 数据一次读,地址加1
32 #define LC_DEC_WR 0xC2 // 数据一次写,地址减1
33 #define LC_DEC_RD 0xC3 // 数据一次读,地址减1
34 #define LC_NOC_WR 0xC4 // 数据一次写,地址不变
35 #define LC_NOC_RD 0xC5 // 数据一次读,地址不变
36 #define LC_SCN_RD 0xE0 // 屏读
37 #define LC_SCN_CP 0xE8 // 屏拷贝
38 #define LC_BIT_OP 0xF0 // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除
39
40
41 #define LCMDW XBYTE[0x7AFF] // 数据口
42 #define LCMCW XBYTE[0x7BFF] // 命令口
43 void key(void);
44 uchar xdata rbuf[500];
45 uchar xdata tbuf[88];
46
47 uint r_in;
48 uchar c,q;
49 uchar a,b;
50 uchar key_flag;
51 uchar x,y;
52 uchar t=0;
53 uchar gCurRow,gCurCol;
54 uint d,g,n,h;
55 uchar uRow,uCol;
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 2
56 uint i,e,f;
57
58 uchar fnGetRow(void)
59 {
60 1 return gCurRow;
61 1 }
62 uchar fnGetCol(void)
63 {
64 1 return gCurCol;
65 1 }
66 void fnST01(void) // 状态位STA1,STA0 判断(读写指令和读写数据)
67 {uchar sta;
68 1 do{ sta=LCMCW & 0x03; }
69 1 while(sta!=0x03);
70 1
71 1 }
72
73 /*void fnST2(void) // 状态位ST2 判断(数据自动读状态)
74 {
75 uchar sta;
76 do{ sta=LCMCW & 0x04; }
77 while(sta!=0x04);
78 }*/
79
80 void fnST3(void) // 状态位ST3 判断(数据自动写状态)
81 {
82 1 uchar sta;
83 1 do{ sta=LCMCW & 0x08; }
84 1 while(sta!=0x08);
85 1 }
86 /*uchar fnST6(void) // 状态位ST6 判断(屏读/屏拷贝状态)
87 {
88 uchar i;
89 for(i=10;i>0;i--)
90 {
91 if((LCMCW & 0x40) == 0x40)
92 break;
93 }
94 return i; // 若返回零,说明错误
95 }*/
96
97
98 void fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令
99 {
100 1 fnST01();
101 1 LCMDW = uPar1;
102 1 fnST01();
103 1 LCMDW = uPar2;
104 1 fnST01();
105 1 LCMCW = uCmd;
106 1
107 1 }
108 void fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令
109
110 {
111 1 fnST01();
112 1 LCMDW = uPar1;
113 1 fnST01();
114 1 LCMCW = uCmd;
115 1 }
116 void fnPR12(uchar uCmd) // 写无参数的指令
117 {fnST01();
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 3
118 1 LCMCW = uCmd;
119 1 }
120 void fnPR13(uchar uData) // 写数据
121 {fnST01();
122 1 LCMDW = uData;
123 1 }
124 /*uchar fnPR2(void) // 读数据
125 {fnST01();
126 return LCMDW;
127 }*/
128 // 设置当前地址
129 void fnSetPos(uchar urow, uchar ucol)
130 {
131 1 uint iPos;
132 1 iPos = urow * 30 + ucol;
133 1 fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
134 1 gCurRow = urow;
135 1 gCurCol = ucol;
136 1 }
137 // 设置当前显示行、列
138 void cursor(uchar uRow, uchar uCol)
139 {
140 1 fnSetPos(uRow * 16, uCol);
141 1 }
142 //指针设置
143 void Text_Curser(uchar x3,uchar y3)
144 {fnPR1(0x21,x3,y3);
145 1
146 1 a=x3;
147 1 b=y3;}
148
149
150 // 清屏
151 void cls(void)
152 {
153 1 uint i;
154 1 fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针
155 1 fnPR12(LC_AUT_WR); // 自动写
156 1 for(i=0;i<240*128;i++)
157 1 {
158 2 fnST3();
159 2 fnPR13(0x00); // 写数据
160 2 }
161 1 fnPR12(LC_AUT_OVR); // 自动写结束
162 1 fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
163 1 gCurRow = 0; // 置地址指针存储变量
164 1 gCurCol = 0;
165 1 }
166
167
168 // LCM 初始化
169 void fnLCMInit(void)
170 {
171 1
172 1 fnPR1(LC_TXT_STP,0xDF,0x01) ; // 文本显示区首地址
173 1 fnPR1(0x41,0x1E,0x00); // 文本显示区宽度
174 1 fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
175 1 fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
176 1 fnPR12(0xA0); // 光标形状
177 1 fnPR12(0x80); // 显示方式设置
178 1 fnPR12(0x9F); // 显示开关设置
179 1 cls();
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 4
180 1
181 1 }
182 //延时
183 void shortdelay(uint tt)
184 { uchar i;
185 1 while(tt)
186 1 {i=100;
187 2 while(i)
188 2 i--;
189 2 tt--;};
190 1 }
191 //显示一个字符
192
193 void dchar(uchar x,uchar y,uchar a)
194 {uchar j,uRow,uCol;
195 1 for(j=0;j<16;j++)
196 1 {
197 2 uRow=y;
198 2 uCol=x;
199 2 fnSetPos(uRow*16+j,uCol);
200 2 uRow = fnGetRow();
201 2 uCol = fnGetCol();
202 2 fnPR12(LC_AUT_WR);
203 2 fnPR13(ASC_MSK[(a-0x20)*16+j]);
204 2 fnPR12(LC_AUT_OVR);
205 2 }
206 1 }
207 //显示字符串
208 void dstring(uchar x,uchar y,uchar *ptr)
209 {
210 1 char c1;
211 1 uchar i,j,uLen,uRow,uCol;
212 1 uLen=strlen(ptr);
213 1 for(i=0;i<uLen;i++)
214 1 {c1 =ptr[i];
215 2 for(j=0;j<16;j++)
216 2 {uRow=y;
217 3 uCol=x;
218 3 fnSetPos(uRow*16+j,uCol);
219 3 uRow = fnGetRow();
220 3 uCol = fnGetCol();
221 3 fnPR12(LC_AUT_WR);
222 3 fnPR13(ASC_MSK[(c1-0x20)*16+j]);
223 3 fnPR12(LC_AUT_OVR);}
224 2 if(x<29)
225 2 {x++;}
226 2 else
227 2 {y++;x=0;}}
228 1
229 1 }
230 //显示汉字
231 void dhz(uchar x,uchar y,uchar *shz)
232 {uint length=0,no,k;
233 1 uchar uRow,uCol;
234 1 while (*(shz+length)!='\0')
235 1 {length++;}
236 1 for(no=0;no<length/2;no++)
237 1 {uint j,find=0;
238 2 for(j=0;j<sizeof(hzinx)/2;j++)
239 2 {if(hzinx[j*2]==*(shz+no*2)&&hzinx[j*2+1]==*(shz+no*2+1))
240 3 {find=1;break;}}
241 2
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 5
242 2 for(k=0;k<16;k++)
243 2 {uRow=y;
244 3 uCol=x+no*2;
245 3 fnSetPos(uRow*16+k,uCol);
246 3 uRow = fnGetRow();
247 3 uCol = fnGetCol();
248 3 fnPR12(LC_AUT_WR);
249 3 fnPR13(zimo[j*32+2*k]);
250 3 fnPR12(LC_AUT_OVR);
251 3 x++;
252 3 fnPR12(LC_AUT_WR);
253 3 fnPR13(zimo[j*32+2*k+1]);
254 3 fnPR12(LC_AUT_OVR);
255 3 x--;}
256 2 }}
257
258 //串口数据接收
259
260 serial()interrupt 4 using 1
261 {
262 1
263 1 if(RI)
264 1 {
265 2 c=SBUF;
-
266 2 RI=0;
267 2 rbuf[r_in++]=c;
268 2 if((rbuf[r_in-3]=='*')&&(rbuf[r_in-2]=='*')&&(rbuf[r_in-1]=='*'))
269 2 { if(r_in<250)
270 3 r_in=250;
271 3 else if(r_in>250)
272 3 r_in=0;
273 3 }
274 2
275 2 }
276 1 }
277
278 //串口初始化
279 void nintser(void)
280 {r_in=0;
281 1 TMOD=0x20;
282 1 TL1=0xF3;TH1=0xF3; //在12MHz下,设串口波特率为4800,方式3
283 1 SCON=0xd8;PCON=0x80;
284 1 TR1=1;
285 1 IE=0x90; //串口开中断
286 1 IP=0x10;
287 1 }
288
289 //接收缓冲区分块
290 void part(void)
291 {
292 1
293 1 if(r_in<250)
294 1 {e=250; //当前显示缓冲区首地址
295 2 f=500;}
296 1 else if(r_in>250) //当前显示缓冲区末地址
297 1 {e=0;f=250;}
298 1 for(i=e;i<f;i++)
299 1 {if(rbuf[i]=='c'&&rbuf[i+1]=='o'&&rbuf[i+2]=='m')
300 2 {h=i;break;
301 3 }}
302 1
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 6
303 1 for(i=e;i<f;i++)
304 1 {if(rbuf[i]=='D'&&rbuf[i+1]=='V'&&rbuf[i+2]=='L')
305 2 {d=i;break;
306 3 }}
307 1 for(i=e;i<f;i++)
308 1 {if(rbuf[i]=='G'&&rbuf[i+1]=='P'&&rbuf[i+2]=='S')
309 2 {g=i;break;
310 3 }}
311 1 for(i=e;i<f;i++)
312 1 {if(rbuf[i]=='I'&&rbuf[i+1]=='N'&&rbuf[i+2]=='S')
313 2 {n=i;break;
314 3 }}}
315
316
317 //接收信息显示
318 void sebuf(void)
319 {uchar k,j;
320 1 for(k=0;k<10;k++)
321 1 {
322 2 for(j=0;j<16;j++)
323 2 {uRow=y;
324 3 uCol=x;
325 3 fnSetPos(uRow*16+j,uCol);
326 3 uRow = fnGetRow();
327 3 uCol = fnGetCol();
328 3 fnPR12(LC_AUT_WR);
329 3 fnPR13(ASC_MSK[(rbuf[2+k+q]-0x20)*16+j]);
330 3 fnPR12(LC_AUT_OVR);
331 3 }
332 2 x++;
333 2 }
334 1 }
335
336
337 //组合信息显示
338 void serh1(void)
339 {
340 1 uint i;
341 1 uchar find=0;
342 1 for(i=h;i<d;i++)
343 1 {if(rbuf[i]=='j'&&rbuf[i+1]=='d')
344 2 {find=1;
345 3 q=i;
346 3 break;}
347 2
348 2 }
349 1 if(find==1)
350 1 {
351 2 y=5;x=6;
352 2 sebuf();
353 2 }
354 1 }
355
356 void serh2(void)
357 {
358 1 uint i;
359 1 uchar find=0;
360 1 for(i=h;i<d;i++)
361 1 {if(rbuf[i]=='w'&&rbuf[i+1]=='d')
362 2 {
363 3 find=1;q=i;
364 3
C51 COMPILER V7.07 LCD3 09/07/2006 09:21:47 PAGE 7
365 3 break;}
366 2
367 2 }
368 1 if(find==1)
369 1 {
370 2 y=6;x=6;
371 2 sebuf();}
372 1 }
373
374 void serh3(void)
375 {
376 1 uint i;
377 1 uchar find=0;
378 1
379 1 for(i=h;i<d;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -