📄 lcd_12864.lst
字号:
C51 COMPILER V8.08 LCD_12864 08/19/2008 10:59:11 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE LCD_12864
OBJECT MODULE PLACED IN .\obj\LCD_12864.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE driver\lcd\LCD_12864.C LARGE OBJECTADVANCED BROWSE DEBUG PRINT(.\lst\LCD_12
-864.lst) OBJECT(.\obj\LCD_12864.obj)
line level source
1 #define ASCII_LIB_GLOBLE
2 #include <stdarg.h>
3 #include <string.h>
4 #include <stdlib.h>
5
6 #include "ascii.h"
7 #include "..\..\Source\includes.h"
8 #include "..\c51.h"
9 sbit P1_7 = P1^7;
10 sbit P1_6 = P1^6;
11 sbit P1_5 = P1^5;
12 sbit P1_4 = P1^4;
13 sbit P1_3 = P1^3;
14 sbit P1_2 = P1^2;
15 sbit P1_1 = P1^1;
16 sbit P1_0 = P1^0;
17
18 sbit P3_7 = P3^7;
19 sbit P3_6 = P3^6;
20 sbit P3_5 = P3^5;
21 sbit P3_4 = P3^4;
22 sbit P3_3 = P3^3;
23 sbit P3_2 = P3^2;
24 sbit P3_1 = P3^1;
25 sbit P3_0 = P3^0;
26
27 #define Selcom (P3_2=1)
28 #define Seldata (P3_2=0)
29 #define WR_H (P3_4=1)
30 #define WR_L (P3_4=0)
31
32 #define RD_H (P3_3=1)
33 #define RD_L (P3_3=0)
34
35
36
37 #define LCD_CUR_POS 0x21 /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
38 #define LCD_CGR_POS 0x22 /* CGRAM偏置地址设置(可以增加自已的符号) */
39 #define LCD_ADR_POS 0x24 /* 地址指针位置(设置读写操作指针) */
40
41 #define LCD_TXT_STP 0x40 /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
42 #define LCD_TXT_WID 0x41 /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
43 #define LCD_GRH_STP 0x42 /* 图形区首址(从此地址开始向屏幕左上角显示点) */
44 #define LCD_GRH_WID 0x43 /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
45
46 #define LCD_MOD_OR 0x80 /* 显示方式:逻辑或 */
47 #define LCD_MOD_XOR 0x81 /* 显示方式:逻辑异或 */
48 #define LCD_MOD_AND 0x82 /* 显示方式:逻辑与 */
49 #define LCD_MOD_TCH 0x83 /* 显示方式:文本特征 */
50
51 #define LCD_DIS_SW 0x90 /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
52 /* D1=1/0,光标显示启用/禁用 */
53 /* D2=1/0,文本显示启用/禁用(打开后再使用) */
54 /* D3=1/0,图形显示启用/禁用(打开后再使用) */
C51 COMPILER V8.08 LCD_12864 08/19/2008 10:59:11 PAGE 2
55
56 #define LCD_CUR_SHP 0xA0 /* 光标形状选择:0xA0-0xA7表示光标占的行数 */
57
58 #define LCD_AUT_WR 0xB0 /* 自动写设置 */
59 #define LCD_AUT_RD 0xB1 /* 自动读设置 */
60 #define LCD_AUT_OVR 0xB2 /* 自动读/写结束 */
61
62 #define LCD_INC_WR 0xC0 /* 数据一次写,地址加1 */
63 #define LCD_INC_RD 0xC1 /* 数据一次读,地址加1 */
64 #define LCD_DEC_WR 0xC2 /* 数据一次写,地址减1 */
65 #define LCD_DEC_RD 0xC3 /* 数据一次读,地址减1 */
66 #define LCD_NOC_WR 0xC4 /* 数据一次写,地址不变 */
67 #define LCD_NOC_RD 0xC5 /* 数据一次读,地址不变 */
68
69 #define LCD_SCN_RD 0xE0 /* 屏读 */
70
71 #define LCD_SCN_CP 0xE8 /* 屏拷贝 */
72
73 #define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
74
75
76
77 #define LCD_WIDTH 128
78 #define LCD_HEIGH 64
79
80 #define status_busy 0x80; //忙状态.
81 #define disp_start_set 0xc0 //显示起始行设置.
82 #define page_addr_set 0xb0 //页面地址设置.
83 #define col_up_addr_set 0x10 //高位列地址设置.
84 #define col_down_addr_set 0x00 //低位列地址设置.
85 #define disp_on 0xaf //打开显示.
86
87 sfr iodata=0x90;
88
89
90
91
92 extern OS_EVENT *pPrintSem;
93 extern OS_EVENT *pPutSem;
94
95 /********************分别为读忙信号写指令写数据.******************************************/
96
97
98 /********************分别为读忙信号写指令写数据.******************************************/
99 void chkbusy(void) //检查忙信号.等待LCD内部操作完成.
100 {
101 1
102 1
103 1
104 1
105 1
106 1 }
107
108 void send_comm(unsigned char command)
109 {
110 1 RD_H;
111 1 Selcom;
112 1 iodata=command;
113 1 WR_L;
114 1 WR_H;
115 1
116 1 }
C51 COMPILER V8.08 LCD_12864 08/19/2008 10:59:11 PAGE 3
117
118 void send_data(unsigned char dat)
119 {
120 1 RD_H;
121 1 Seldata;
122 1 iodata=dat;
123 1 WR_L;
124 1 WR_H;
125 1 }
126 /********************LCD初始化******************************************/
127 void lcd_init(void) //LCD初始化.
128 {
129 1 send_data(0x00);
130 1 send_data(0x14);
131 1 send_comm(LCD_TXT_STP);
132 1
133 1 send_data(30);
134 1 send_data(0x0);
135 1 send_comm(LCD_TXT_WID);
136 1
137 1 send_data(0x0);
138 1 send_data(0x0);
139 1 send_comm(LCD_GRH_STP);
140 1
141 1 send_data(30);
142 1 send_data(0x0);
143 1 send_comm(LCD_GRH_WID);
144 1
145 1 send_comm(LCD_MOD_XOR);
146 1
147 1 send_comm(LCD_DIS_SW|0x0c);
148 1
149 1
150 1
151 1
152 1 }
153
154
155 /********************LCD清屏******************************************/
156 void lcd_clr(unsigned char disp) //LCD清屏.
157 {
158 1 unsigned char i,j;
159 1 int addr;
160 1
161 1 OS_ENTER_CRITICAL();
162 1 send_data(0);
163 1 send_data(0x0);
164 1 send_comm(LCD_ADR_POS);
165 1 for(j=0;j<128;j++)
166 1 {
167 2 for(i=0;i<30;i+=1)
168 2 {
169 3 addr = j*30 + i;
170 3 send_data(disp);
171 3 send_comm(LCD_INC_WR);
172 3
173 3 }
174 2 }
175 1 send_data(0);
176 1 send_data(0x14);
177 1 send_comm(LCD_ADR_POS);
178 1 for(j=0;j<16;j++)
C51 COMPILER V8.08 LCD_12864 08/19/2008 10:59:11 PAGE 4
179 1 {
180 2 for(i=0;i<30;i+=1)
181 2 {
182 3 addr = j*30 + i;
183 3 send_data(' '-0x20);
184 3 send_comm(LCD_INC_WR);
185 3 }
186 2 }
187 1 OS_EXIT_CRITICAL();
188 1 }
189
190
191 void putchar5x8(unsigned char x8,unsigned char y8,unsigned char mod,unsigned char Ascii) reentrant
192 {
193 1 int addr;
194 1 UBYTE err;
195 1 if(Ascii<0x20) return; //p表示宽度的索引,即它的值为0到width之间.
196 1
197 1 addr = 30*y8 + x8 + 0x1400;
198 1 OSSemPend(pPutSem, 0, &err); //禁止中断,以防止2个任务同时调用显示函数
199 1 send_data(addr&0xff);
200 1 send_data(addr>>8);
201 1 send_comm(LCD_ADR_POS);
202 1 send_data((Ascii-0x20));
203 1 send_comm(LCD_INC_WR);
204 1 OSSemPost(pPutSem);
205 1
206 1 }
*** WARNING C280 IN LINE 191 OF DRIVER\LCD\LCD_12864.C: 'mod': unreferenced local variable
207
208 void LCD_PutStr(unsigned char x8,unsigned char y8,unsigned char mode, unsigned char *pstr) reentrant {
209 1
210 1 unsigned char p;
211 1 unsigned char CursorX=x8,CursorY=y8;
212 1 for(p=0;(*(pstr+p)!=0);p++) {
213 2
214 2 if (CursorX>=30||'\n'==*(pstr+p)) {
215 3 CursorX=0;
216 3 CursorY++;
217 3 if(CursorY>=16) CursorY=0;
218 3 }
219 2
220 2 if('\n'!=*(pstr+p)) putchar5x8(CursorX,CursorY,mode,*(pstr+p));
221 2
222 2 CursorX+=1;
223 2
224 2
225 2 }
226 1
227 1 }
228
229
230
231 void LCD_Print(unsigned char x8,unsigned char y8,unsigned char mode,char *fmt,...) reentrant {
232 1 va_list ap;
233 1 UBYTE err;
234 1 char string[40];
235 1
236 1 OSSemPend(pPrintSem, 0, &err);
237 1 va_start(ap,fmt);
238 1 vsprintf(string,fmt,ap);
239 1 va_end(ap);
C51 COMPILER V8.08 LCD_12864 08/19/2008 10:59:11 PAGE 5
240 1 OSSemPost(pPrintSem);
241 1 LCD_PutStr(x8,y8,mode,string);
242 1
243 1
244 1
245 1
246 1
247 1 }
248
249 void LCD_ClrLine(unsigned char x8_Start,unsigned char x8_end,unsigned char y) reentrant
250 {
251 1 INT16U addr;
252 1 INT8U i;
253 1 if(x8_Start>x8_end||x8_end>=30||y>=128) return;
254 1
255 1 addr = y*30 + x8_Start;
256 1 OS_ENTER_CRITICAL();
257 1 send_data(addr&0xff);
258 1 send_data(addr>>8);
259 1 send_comm(LCD_ADR_POS);
260 1
261 1 for(i=x8_Start;i<=x8_end;i++)
262 1 {
263 2 send_data(0xff);
264 2 send_comm(LCD_INC_WR);
265 2
266 2 }
267 1 OS_EXIT_CRITICAL();
268 1
269 1 }
270
271
272 void LCD_draw(unsigned char x8_Start,unsigned char x8_end,unsigned char y_start,unsigned char y_end,unsign
-ed char *pBmp) reentrant
273 {
274 1 INT16U addr,p;
275 1 INT8U i,j;
276 1 if(x8_Start>x8_end||y_start>y_end||x8_end>=30||y_end>=128) return;
277 1
278 1
279 1 OS_ENTER_CRITICAL();
280 1 p=0;
281 1 for(j=y_start;j<=y_end;j++) {
282 2 addr = j*30 + x8_Start;
283 2 send_data(addr&0xff);
284 2 send_data(addr>>8);
285 2 send_comm(LCD_ADR_POS);
286 2 for(i=x8_Start;i<=x8_end;i++) {
287 3 send_data(*(pBmp+p));
288 3 send_comm(LCD_INC_WR);
289 3 p++;
290 3 }
291 2 }
292 1 OS_EXIT_CRITICAL();
293 1
294 1 }
295
296
297
298
299
300
C51 COMPILER V8.08 LCD_12864 08/19/2008 10:59:11 PAGE 6
301
302
303
304
305
306
307
308
309
310
311
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1483 ----
CONSTANT SIZE = 480 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -