?? charlcd.lst
字號:
C51 COMPILER V7.20 CHARLCD 08/13/2007 10:29:16 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE CHARLCD
OBJECT MODULE PLACED IN CharLCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CharLCD.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*------------------------------------------------------------------
3
4 CharLCD.C (v1.00) 16x2 字符液晶屏驅(qū)動程序
5
6 ------------------------------------------------------------------*/
7
8
9 #include "CharLCD.h"
10
11
12
13 //Change the following section accroding to you hardware
14 #ifdef _LCDXADDR
#define Lcd1602WCmdPort (*(volatile uchar *)0x2000) //E=1 RS=0 RW=0
#define Lcd1602RStatusPort (*(volatile uchar *)0x2001) //E=1 RS=0 RW=1
#define Lcd1602WdataPort (*(volatile uchar *)0x2002) //E =1 RS=1 RW=0
#define Lcd1602RDataPort (*(volatile uchar *)0x2003) //E=1 RS=1 RW=1
#else
20 #ifdef _51
21 sbit lcd_cs = P2^0; //控制位
22 sbit lcd_rw = P2^1;
23 sbit lcd_rs = P2^2;
24 #define DataPort P0
25 #define DataDirPort P0
26 #define StatePort P0
27 #endif
28
29 #ifdef _AVR
#define lcd_cs PORTC.0 //控制位以及其方向控制位
#define lcd_cs_dir_bit DDRC.0
#define lcd_rw PORTC.1
#define lcd_rw_dir_bit DDRC.1
#define lcd_rs PORTC.2
#define lcd_rs_dir_bit DDRC.2
#define DataPort PORTA
#define StatePort PINA
#define DataDirPort DDRA
#endif
40
41 #endif
42
43
44 // ------ Private constants ----------------------------------------
45
46 #define Busy 0x80 // 忙判別位
47
48
49 // ------ Private variables-----------------------------------------
50 #ifdef _51
51 code uchar* WrtieLcdErr = "Display char outof range.";
52 #endif
53
54 #ifdef _AVR
flash uchar* WrtieLcdErr = "Display char outof range.";
C51 COMPILER V7.20 CHARLCD 08/13/2007 10:29:16 PAGE 2
#endif
57
58
59 // ------ Private function prototypes ------------------------------
60 static BOOL WaitTillNotBusy();
61 static BOOL LocateXY(uchar posx,uchar posy);
62 static BOOL LcdWData(uchar dataW);
63 static BOOL LcdWCMD(uchar CMD);
64
65
66
67
68
69
70 /*------------------------------------------------------------------
71
72 WaitTillNotBusy()
73 檢測忙
74
75 ------------------------------------------------------------------*/
76 BOOL WaitTillNotBusy()
77 {
78 1 uint delay = 0xffff;
79 1
80 1 #ifdef _LCDXADDR
while( (Lcd1602RStatusPort & Busy) && delay )
delay--;
if (!delay)
return FALSE;
#else
88 1 #ifdef _AVR
DataDirPort = 0x00;
#endif
91 1
92 1 #ifdef _51
93 1 DataDirPort = 0xff;
94 1 #endif
95 1
96 1 lcd_cs = 1;
97 1 lcd_rs = 0;
98 1 lcd_rw = 1;
99 1 while( (StatePort & Busy) && delay)
100 1 delay--;
101 1 lcd_cs = 0;
102 1 if (!delay)
103 1 return FALSE ;
104 1 #endif
105 1
106 1 return TRUE;
107 1 }
108
109
110
111
112 /*------------------------------------------------------------------
113
114 LocateXY()
115 顯示光標定位
116
117 ------------------------------------------------------------------*/
C51 COMPILER V7.20 CHARLCD 08/13/2007 10:29:16 PAGE 3
118 BOOL LocateXY( uchar posx,uchar posy)
119 {
120 1 posy &= 0x01;
121 1 if (posy == 1)
122 1 posx |= 0x40;
123 1 posx |= 0x80;
124 1
125 1
126 1 return LcdWCMD(posx);
127 1 }
128
129
130
131
132
133 /*------------------------------------------------------------------
134
135 LcdWCMD()
136 寫控制字符子程序: E=1 RS=0 RW=0
137
138 ------------------------------------------------------------------*/
139 BOOL LcdWCMD(uchar CMD)
140 {
141 1 #ifdef _LCDXADDR
if (!WaitTillNotBusy()) // 檢測忙信號?
return FALSE;
Lcd1602WCmdPort = CMD;
#else
147 1 uchar i=1;
148 1
149 1 if (!WaitTillNotBusy()) // 檢測忙信號?
150 1 return FALSE;
151 1
152 1 #ifdef _AVR
DataDirPort = 0xff;
#endif
155 1
156 1 DataPort = CMD;
157 1 lcd_rs = 0;
158 1 lcd_rw = 0;
159 1 lcd_cs = 1;
160 1 while(i++);
161 1 lcd_cs = 0;
162 1
163 1 #endif
164 1
165 1 return TRUE;
166 1 }
167
168
169
170
171 /*------------------------------------------------------------------
172
173 LcdWData()
174 當前位置寫字符子程序: E =1 RS=1 RW=0
175
176 ------------------------------------------------------------------*/
177 BOOL LcdWData( uchar dataW )
178 {
179 1 #ifdef _LCDXADDR
C51 COMPILER V7.20 CHARLCD 08/13/2007 10:29:16 PAGE 4
if (!WaitTillNotBusy()) // 檢測忙信號?
return FALSE;
Lcd1602WdataPort = dataW;
#else
185 1 uchar i = 1;
186 1
187 1 if (!WaitTillNotBusy()) // 檢測忙信號?
188 1 return FALSE;
189 1
190 1 #ifdef _AVR
DataDirPort = 0xff;
#endif
193 1
194 1 DataPort = dataW;
195 1 lcd_rs = 1;
196 1 lcd_rw = 0;
197 1 lcd_cs = 1;
198 1 while(i++);
199 1 lcd_cs = 0;
200 1
201 1 #endif
202 1
203 1 return TRUE;
204 1 }
205
206
207
208
209 /*------------------------------------------------------------------
210
211 LCDInit()
212 初始化程序, 必須按照產(chǎn)品資料介紹的初始化過程進行
213
214 ------------------------------------------------------------------*/
215 BOOL LCDInit()
216 {
217 1 #ifdef _AVR
#ifndef _LCDXADDR
lcd_cs_dir_bit = 1;
lcd_rw_dir_bit = 1;
lcd_rs_dir_bit = 1;
#endif
#endif
224 1
225 1 // 顯示模式設置,光標移動設置,顯示開及光標設置,顯示清屏
226 1 return (LcdWCMD( 0x38) && LcdWCMD( 0x06) && LcdWCMD( 0x0c) && LcdWCMD( 0x01));
227 1
228 1 }
229
230
231
232
233 /*------------------------------------------------------------------
234
235 DisplayOneChar()
236 按指定位置顯示數(shù)出一個字符
237
238 ------------------------------------------------------------------*/
239 BOOL DisplayOneChar(uchar x ,uchar y ,uchar Wdata)
240 {
241 1
C51 COMPILER V7.20 CHARLCD 08/13/2007 10:29:16 PAGE 5
242 1 if( (x >= 0 && x < 16) && (y >= 0 && y < 2) )
243 1 return (LocateXY( x, y ) && LcdWData( Wdata )) ;// 定位顯示地址,寫字符
244 1 else
245 1 return ( LCDInit() && DisplayString(0, 0, WrtieLcdErr)); //顯示越界消息
246 1 }
247
248
249
250
251 /*------------------------------------------------------------------
252
253 DisplayString()
254 從指定位置開始顯示一串字符
255
256 ------------------------------------------------------------------*/
257 BOOL DisplayString(uchar posx, uchar posy, flash uchar* str)
258 {
259 1 while ( (*str) != '\0' )
260 1 {
261 2 if (!DisplayOneChar(posx, posy, (*str)))
262 2 return FALSE;
263 2 str++;
264 2 posx++;
265 2 if( posx == 16 )
266 2 {
267 3 posx = 0;
268 3 posy++;
269 3
270 3 }
271 2 }
272 1
273 1 return TRUE;
274 1 }
275
276
277 /*------------------------------------------------------------------
278 ---- END OF FILE -------------------------------------------------
279 ------------------------------------------------------------------*/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 271 ----
CONSTANT SIZE = 29 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
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 + -