📄 lcddev.lst
字号:
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCDDEV
OBJECT MODULE PLACED IN lcddev.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcddev.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "lcddev.h"
2 #include "ctypedef.h"
3
4 //初始化8051
5 void Port_IO_Init()
6 {
7 1 XBR0 = 0x00;
8 1 XBR1 = 0x00;
9 1 XBR2 = 0x40; //io交叉配置允许
10 1 P0MDOUT = 0xff;
11 1 P3MDOUT = 0xff;
12 1 }
13
14 void Oscillator_Init() //选用内部振荡器
15 {
16 1 OSCICN = 0x05;
17 1 }
18
19 void Reset_Sources_Init()
20 {
21 1 WDTCN = 0xDE; //关闭看门狗
22 1 WDTCN = 0xAD;
23 1 }
24
25
26 void SYSCLK_Init (void)
27 {
28 1 int i;
29 1 OSCXCN = 0x67; // 外部晶振,大于6.7MHz
30 1 for (i=0; i < 2000; i++) ; // 等待起振
31 1 while (!(OSCXCN & 0x80)) ; // 检测是否起振
32 1 OSCICN = 0x88; // 设置为系统时钟为外部晶振,且开启时钟丢失检测
33 1 }
34
35 // Initialization function for device,
36 // Call Init_Device() from your main program
37 void Init_Device(void)
38 {
39 1 Reset_Sources_Init();
40 1 SYSCLK_Init ();
41 1 //Oscillator_Init();
42 1 Port_IO_Init();
43 1 }
44
45 /*
46
47 */
48 void Delay(uchar t)
49 {
50 1 while(t--);
51 1 }
52
53
54 /*--------------------------------
55 函数名:void LCD_ChkBusy(void);
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 2
56 函数功能:检查LCD是否忙
57 使用说明:
58 使用说明:
59 状态字格式:bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
60 状态字说明:
61 bit7: 存储器读写状态 0 准备好 1 忙
62 bit6: 扫描状态 0 准备好 1 忙
63 bit5: 睡眠模式 0 正常 1 睡眠
64 bit4 bit3: 不用
65 bit2: 唤醒状态位
66 bit1: KS状态
67 bit0: TP状态
68
69
70 -----------------------------------*/
71
72 void Lcd_ChkBusy(void)
73 {
74 1 uchar temp;
75 1 do{
76 2 //LcdDataPort_InPut();
77 2 RS = 0;
78 2 CS = 1;
79 2 WR = 1;
80 2 RD = 1;
81 2 Delay(2);
82 2 RS = 1;
83 2 Delay(2);
84 2 CS = 0;
85 2 Delay(5);
86 2 RD = 0;//开始读状态
87 2 temp = Lcd_DataPort;
88 2 Delay(10);
89 2 RD = 1;
90 2 Delay(2);
91 2 CS = 1;
92 2 RS = 0;
93 2 }while(temp & 0xC0);
94 1 }
95
96
97 /*void Lcd_writedatatocmd(uchar CmdReg,uchar udata) ///写数据到到寄存器
98 {
99 CS = 0;
100 RS = 1;
101 Delay(2);//
102 WR = 0;
103 Lcd_DataPort = CmdReg;
104 Delay(10);// 最小20ns
105 WR = 1;// 完成写寄存器
106 Delay(2);
107 CS = 1;
108 RS = 0;
109 Delay(20);
110 CS = 0;
111 Delay(10);//
112 WR = 0;
113 Lcd_DataPort = udata;
114 Delay(30);//最小50ns
115 WR = 1;
116 CS = 1;
117 RS = 1;
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 3
118 }*/
119
120
121 void Lcd_writecmd(uchar CmdReg) //写命令
122 {
123 1 CS = 0;
124 1 RS = 1;
125 1 WR = 0;
126 1 Lcd_DataPort = CmdReg;
127 1 Delay(10);// 最小20ns
128 1 WR = 1;// 完成写寄存器
129 1 Delay(2);
130 1 CS = 1;
131 1 RS = 0;
132 1 }
133 void Lcd_writedata(uchar DatValue)//写数据
134 {
135 1 CS = 0;
136 1 RS = 0;
137 1 Delay(10);//
138 1 WR = 0;
139 1 Lcd_DataPort = DatValue;
140 1 Delay(30);//最小50ns
141 1 WR = 1;
142 1 CS = 1;
143 1 RS = 1;
144 1 }
145 void Lcd_writedatatocmd(uchar CmdReg,uchar udata) ///写数据到到寄存器
146 {
147 1 Lcd_writecmd(CmdReg);
148 1 Lcd_writedata(udata);
149 1 }
150
151 /*
152 函数名:
153 */
154 /*uchar Lcd_readcmd(void)
155 {
156 uchar CmdReg;
157 LcdDataPort_InPut();
158 CS = 0;
159 RS = 0;
160 WR = 1;
161 RD = 0;
162 CmdReg = Lcd_DataPort;
163 Delay(4);
164 RD = 1;
165 CS = 1;
166 return CmdReg;
167 }
168 */
169
170
171 uchar Lcd_readdatafromcmd(uchar CmdReg)
172 {
173 1 uchar udata;
174 1 Lcd_writecmd(CmdReg);
175 1 udata = Lcd_readdata();
176 1 return udata;
177 1 }
178
179
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 4
180
181 uchar Lcd_readdata(void)
182 {
183 1 uchar udata;
184 1 CS = 0;
185 1 RS = 0;
186 1 WR = 1;
187 1 Delay(10);//
188 1 RD = 0;
189 1 udata = Lcd_DataPort;
190 1 Delay(30);//最小50ns
191 1 RD = 1;
192 1 CS = 1;
193 1 RS = 1;
194 1 return udata;
195 1 }
196
197 //开显示
198 void LCD_ON(void)
199 {
200 1 uchar temp;
201 1 temp = Lcd_readdatafromcmd(WLCR);
202 1 temp |= 0x04;
203 1 Lcd_writedatatocmd(WLCR,temp);
204 1 }
205 /*
206 函数名:void LCD_OFF(void)
207
208 */
209 //关显示
210 void LCD_OFF(void)
211 {
212 1 uchar temp;
213 1 temp = Lcd_readdatafromcmd(WLCR );
214 1 temp &= 0xFB;
215 1 Lcd_writedatatocmd(WLCR ,temp);
216 1 }
217
218 //设置光标位置
219 void LCD_GotoXY(uchar X1,uchar Y1)
220 {
221 1 Lcd_writedatatocmd(CURX,X1 & 0x3f);
222 1 Delay(2);
223 1 Lcd_writedatatocmd(CURY,Y1 & 0xff);
224 1 Delay(2);
225 1 }
226
227 //文字模式
228 void LCD_TEXT(void)
229 {
230 1 uchar temp;
231 1 temp = Lcd_readdatafromcmd(WLCR);
232 1 temp |= 0x08; //WLCR寄存器第3位
233 1 Lcd_writedatatocmd(WLCR,temp);
234 1 }
235
236
237 //绘图模式
238 void LCD_Graphic(void)
239 {
240 1 uchar temp;
241 1 temp = Lcd_readdatafromcmd(WLCR);
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 5
242 1 temp &= 0xf7; //改变WLCR第三位
243 1 Lcd_writedatatocmd(WLCR,temp);
244 1 }
245
246 //显示
247 void Access_2Page(void)
248 {
249 1 uchar temp;
250 1 temp = Lcd_readdatafromcmd(MAMR);
251 1 temp |= 0x03;//置位第 1 2 位,完成选择同时存取DDRAM1和DDRAM2
252 1 Lcd_writedatatocmd(MAMR,temp);
253 1 }
254
255 void Onlyshowpage1(void)
256 {
257 1 uchar temp;
258 1 temp = Lcd_readdatafromcmd(MAMR);
259 1 temp &= 0x9f;//清零第6 ,5位
260 1 temp |= 0x10;//置位第4位;完成在屏幕上只显示DDRAM1
261 1 Lcd_writedatatocmd(MAMR,temp);
262 1 }
263
264 void Lcd_stringwrite(uchar *pstr,uchar strlen,uchar DispMode)
265 {
266 1 uint i;
267 1 Lcd_ChkBusy();
268 1 //LcdDataPort_OutPut();
269 1 RS = 1;
270 1 RD = 1;
271 1 CS = 0;
272 1 Lcd_DataPort = MWCR; //从光标处写入内存指令
273 1 WR = 0; //写寄存器
274 1 Delay(5);
275 1 WR = 1;
276 1 CS = 1;
277 1 RS = 0;
278 1 CS = 0;
279 1 for(i=0; i<strlen; i++)
280 1 {
281 2 if(DispMode == 1)
282 2 Lcd_DataPort = ((*pstr++)); // 准备预写入显示内存的数据
283 2 else
284 2 Lcd_DataPort = (~(*pstr++)); // 准备预写入显示内存的数据
285 2 WR = 0; // "写"信号使能 开始写
286 2 Delay(2);
287 2 WR = 1; // "写"信号禁能
288 2 }
289 1
290 1 CS = 1;
291 1 RS = 1;
292 1 }
293
294
295 void ClearRam(void)
296 {
297 1 uchar temp0,temp1;
298 1
299 1 //LCD_Graphic();
300 1 //Access_2Page();
301 1 temp0 = Lcd_readdatafromcmd(FNCR);
302 1 temp0 |= 0x80; //
303 1 Lcd_writedatatocmd(FNCR,temp0); //开始清除内存
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 6
304 1
305 1 do //检测是否已经清除完
306 1 {
307 2 Delay(5);
308 2 temp1 =Lcd_readdatafromcmd(FNCR);
309 2 temp1 &= 0x80;
310 2 } while(temp1 );
311 1
312 1 }
313
314
315 void Lcd_clearscreen(void)
316 {
317 1 //LCD_TEXT();
318 1 Onlyshowpage1();
319 1 Lcd_writedatatocmd(FNCR,0x00);
320 1 ClearRam();
321 1 }
322
323 //初始化液晶寄存器
324 void IniLcd(void)
325 {
326 1 Lcd_writedatatocmd(WLCR,0X00);
327 1 Lcd_writedatatocmd(MISC,0x00);
328 1 Lcd_writedatatocmd(ADSR,0x00);
329 1 Lcd_writedatatocmd(INTR,0x00);
330 1 Lcd_writedatatocmd(WCCR,0x00);
331 1 Lcd_writedatatocmd(CHWI,0x00);
332 1 Lcd_writedatatocmd(MAMR,0x11);
333 1 Lcd_writedatatocmd(AWRR,0x27);
334 1 Lcd_writedatatocmd(DWWR,0x27);
335 1 Lcd_writedatatocmd(AWBR,0xEF);
336 1 Lcd_writedatatocmd(DWHR,0xEF);
337 1 Lcd_writedatatocmd(AWLR,0x00);
338 1 Lcd_writedatatocmd(AWTR,0x00);
339 1 Lcd_writedatatocmd(CURX,0x00);
340 1 Lcd_writedatatocmd(BGSG,0x00);
341 1 Lcd_writedatatocmd(EDSG,0x00);
342 1 Lcd_writedatatocmd(CURY,0x00);
343 1 Lcd_writedatatocmd(BGCM,0x00);
344 1 Lcd_writedatatocmd(EDCM,0x00);
345 1 Lcd_writedatatocmd(BTMR,0x00);
346 1 Lcd_writedatatocmd(ITCR,0x00);
347 1 Lcd_writedatatocmd(KSCR1,0x00);
348 1 Lcd_writedatatocmd(KSCR2,0x00);
349 1 Lcd_writedatatocmd(KSDR0,0x00);
350 1 Lcd_writedatatocmd(KSDR1,0x00);
351 1 Lcd_writedatatocmd(KSDR2,0x00);
352 1 Lcd_writedatatocmd(TPCR1,0x00);
353 1 Lcd_writedatatocmd(TPXR,0x00);
354 1 Lcd_writedatatocmd(TPYR,0x00);
355 1 Lcd_writedatatocmd(TPZR,0x00);
356 1 Lcd_writedatatocmd(TPCR2,0x00);
357 1 Lcd_writedatatocmd(PCR,0x00);
358 1 Lcd_writedatatocmd(PDCR,0x00);
359 1 Lcd_writedatatocmd(PNTR,0x00);
360 1 Lcd_writedatatocmd(FNCR,0X00);
361 1 Lcd_writedatatocmd(FVHT,0x00);
362 1 // Lcd_clearscreen();//初始化LCD,选择只显示TXT格式,DDRAM1,自动清除DDRAM
363 1 //LCD_GotoXY(0x00,0x00);
364 1 }
C51 COMPILER V8.02 LCDDEV 04/15/2009 14:22:20 PAGE 7
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 748 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
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 + -