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