📄 lcd.lst
字号:
C51 COMPILER V7.06 LCD 10/25/2006 10:30:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************************
2 程序名称:LCD驱动程序
3 显示功能:显示ASCII码
4 硬件接法:D/I---------A0
5 R/W---------A1
6 E-----------读写0xA000~0xA003时,选中
7 CSA---------(前半屏选通,低电平有效)
8 CSB---------(后半屏选通,低电平有效)
9 DB0~DB7----D0~D7
10 *******************************************************************************/
11
12
13 #include "Lcd.h"
14 #include "ASCII.h"
15 #include "HanZi.h"
16 #include "uniondef.h"
17
18
19 //定义I/O接口
20 unsigned char bdata XIO = 0;
21 #define LCD_SET_CSA() {XIO|=0x10;XBYTE[0x8000]=XIO;}
22 #define LCD_CLR_CSA() {XIO&=0xEF;XBYTE[0x8000]=XIO;}
23 #define LCD_SET_CSB() {XIO|=0x20;XBYTE[0x8000]=XIO;}
24 #define LCD_CLR_CSB() {XIO&=0xDF;XBYTE[0x8000]=XIO;}
25
26
27 /*******************************************************************************
28 函数:LcdWaitBusy()
29 功能:读取LCD的Busy标志,如果LCD忙则等待,如果空闲则返回
30 说明:每次操作之前都应当确认LCD处于空闲状态
31 *******************************************************************************/
32 void LcdWaitBusy()
33 {
34 1 while ( (XBYTE[0xA002] & 0x80) != 0 );
35 1 }
36
37
38 /*******************************************************************************
39 函数:LcdOn()
40 功能:打开LCD显示
41 *******************************************************************************/
42 void LcdOn()
43 {
44 1 LcdWaitBusy();
45 1 XBYTE[0xA000] = 0x3F;
46 1 }
47
48
49 /*******************************************************************************
50 函数:LcdOff()
51 功能:关闭LCD显示
52 *******************************************************************************/
53 void LcdOff()
54 {
55 1 LcdWaitBusy();
C51 COMPILER V7.06 LCD 10/25/2006 10:30:16 PAGE 2
56 1 XBYTE[0xA000] = 0x3E;
57 1 }
58
59
60 /*******************************************************************************
61 函数:LcdStartLine()
62 功能:设置显示起始行
63 参数:line是行号,取值0~63
64 *******************************************************************************/
65 void LcdStartLine(unsigned char line)
66 {
67 1 LcdWaitBusy();
68 1 XBYTE[0xA000] = line | 0xC0;
69 1 }
70
71
72 /*******************************************************************************
73 函数:LcdSetP()
74 功能:设置页地址
75 参数:page取值0~7
76 *******************************************************************************/
77 void LcdSetP(unsigned char page)
78 {
79 1 LcdWaitBusy();
80 1 XBYTE[0xA000] = (page & 0x07) | 0xB8;
81 1 }
82
83
84 /*******************************************************************************
85 函数:LcdSetY()
86 功能:设置Y地址
87 参数:y取值0~63
88 *******************************************************************************/
89 void LcdSetY(unsigned char y)
90 {
91 1 LcdWaitBusy();
92 1 XBYTE[0xA000] = (y & 0x3F) | 0x40;
93 1 }
94
95
96 /*******************************************************************************
97 函数:LcdWriteDat()
98 功能:写显示数据
99 参数:dat为显示数据
100 说明:写完后,Y地址自动加1
101 *******************************************************************************/
102 void LcdWriteDat(unsigned char dat)
103 {
104 1 LcdWaitBusy();
105 1 XBYTE[0xA001] = dat;
106 1 }
107
108
109 /*******************************************************************************
110 函数:LcdReadDat()
111 功能:读显示数据
112 返回:读到的数据
113 *******************************************************************************/
114 /*
115 unsigned char LcdReadDat()
116 {
117 LcdWaitBusy();
C51 COMPILER V7.06 LCD 10/25/2006 10:30:16 PAGE 3
118 return XBYTE[0xA003];
119 }
120 */
121
122
123 void _LcdClear_()
124 {
125 1 unsigned char p,y;
126 1 for ( p=0; p<8; p++ )
127 1 {
128 2 LcdSetP(p);
129 2 LcdSetY(0);
130 2 for ( y=0; y<64; y++ )
131 2 {
132 3 LcdWriteDat(0x00);
133 3 }
134 2 }
135 1 }
136
137
138 //定义光标的横纵坐标
139 unsigned char LcdCursorX;
140 unsigned char LcdCursorY;
141
142
143 /*******************************************************************************
144 函数:LcdGotoXY()
145 功能:把光标移到(x,y)处
146 参数:(x,y)为屏幕坐标,x=0~15,y=0~4
147 *******************************************************************************/
148 void LcdGotoXY(unsigned char x, unsigned char y)
149 {
150 1 LcdCursorX = x & 0x0F;
151 1 LcdCursorY = y & 0x03;
152 1 }
153
154
155 /*******************************************************************************
156 函数:LcdClear()
157 功能:LCD清屏
158 *******************************************************************************/
159 void LcdClear()
160 {
161 1 LCD_CLR_CSA();
162 1 _LcdClear_();
163 1 LCD_SET_CSA();
164 1 LCD_CLR_CSB();
165 1 _LcdClear_();
166 1 LCD_SET_CSB();
167 1 LcdCursorX = 0;
168 1 LcdCursorY = 0;
169 1 }
170
171
172 /*******************************************************************************
173 函数:LcdInit()
174 功能:LCD初始化
175 *******************************************************************************/
176 void LcdInit()
177 {
178 1 LCD_SET_CSA();
179 1 LCD_SET_CSB();
C51 COMPILER V7.06 LCD 10/25/2006 10:30:16 PAGE 4
180 1 LcdStartLine(0);
181 1 LcdClear();
182 1 LcdOn();
183 1 }
184
185
186 /*******************************************************************************
187 函数:LcdPutchar()
188 功能:在LCD上显示ASCII码
189 *******************************************************************************/
190 void LcdPutchar(unsigned char c)
191 {
192 1 unsigned char i;
193 1 unsigned char n;
194 1 unsigned char code *p;
195 1 //检查是否为可显示字符
196 1 if ( c < ' ' ) //如果是控制字符
197 1 {
198 2 if ( c == '\r' ) //如果是回车符
199 2 {
200 3 LcdCursorX = 0;
201 3 }
202 2 else if ( c == '\n' ) //如果是换行符
203 2 {
204 3 LcdCursorY++;
205 3 if ( LcdCursorY >= 4 )
206 3 {
207 4 LcdCursorY = 0;
208 4 }
209 3 }
210 2 return;
211 2 }
212 1 //计算字符点阵位置
213 1 p = ASCII_TAB + (c - ' ') * 16;
214 1 //确定显示位置在左半屏还是右半屏
215 1 if ( LcdCursorX < 8 )
216 1 {
217 2 LCD_CLR_CSB();
218 2 // x = 0;
219 2 }
220 1 else
221 1 {
222 2 LCD_CLR_CSA();
223 2 // x = 64;
224 2 }
225 1 //显示ASCII码
226 1 for ( i=0; i<2; i++ )
227 1 {
228 2 LcdSetP(LcdCursorY*2+i); //设置页地址
229 2 LcdSetY(LcdCursorX*8); //设置Y地址
230 2 n = 8;
231 2 do
232 2 {
233 3 LcdWriteDat(*p++); //写入显示数据
234 3 } while ( --n != 0 );
235 2 }
236 1 //取消选中
237 1 if ( LcdCursorX < 8 )
238 1 {
239 2 LCD_SET_CSB();
240 2 }
241 1 else
C51 COMPILER V7.06 LCD 10/25/2006 10:30:16 PAGE 5
242 1 {
243 2 LCD_SET_CSA();
244 2 }
245 1 //光标移到下个位置
246 1 LcdCursorX++;
247 1 if ( LcdCursorX >= 16 )
248 1 {
249 2 LcdCursorX = 0;
250 2 LcdCursorY++;
251 2 if ( LcdCursorY >= 4 )
252 2 {
253 3 LcdCursorY = 0;
254 3 }
255 2 }
256 1 }
257
258
259 //显示汉字(小汉字库汉字编码:0x8000~0x80FF)
260 void LcdPutHZ(unsigned char ch, unsigned char cl)
261 {
262 1 unsigned char i;
263 1 unsigned char n;
264 1 unsigned char code *p;
265 1 UnionInt hz;
266 1 hz.CharPart.H = ch;
267 1 hz.CharPart.L = cl;
268 1 hz.i -= 0x8000;
269 1 //计算字符点阵位置
270 1 p = HanZi_TAB + hz.i * 32;
271 1 //确定显示位置在左半屏还是右半屏
272 1 if ( LcdCursorX < 8 )
273 1 {
274 2 LCD_CLR_CSB();
275 2 }
276 1 else
277 1 {
278 2 LCD_CLR_CSA();
279 2 }
280 1 //显示汉字
281 1 for ( i=0; i<2; i++ )
282 1 {
283 2 LcdSetP(LcdCursorY*2+i); //设置页地址
284 2 LcdSetY(LcdCursorX*8); //设置Y地址
285 2 n = 16;
286 2 do
287 2 {
288 3 LcdWriteDat(*p++); //写入显示数据
289 3 } while ( --n != 0 );
290 2 }
291 1 //取消选中
292 1 if ( LcdCursorX < 8 )
293 1 {
294 2 LCD_SET_CSB();
295 2 }
296 1 else
297 1 {
298 2 LCD_SET_CSA();
299 2 }
300 1 //光标移到下个位置
301 1 LcdCursorX += 2;
302 1 if ( LcdCursorX >= 16 )
303 1 {
C51 COMPILER V7.06 LCD 10/25/2006 10:30:16 PAGE 6
304 2 LcdCursorX = 0;
305 2 LcdCursorY++;
306 2 if ( LcdCursorY >= 4 )
307 2 {
308 3 LcdCursorY = 0;
309 3 }
310 2 }
311 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 469 ----
CONSTANT SIZE = 2208 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 2
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 + -