📄 lcddrv.lst
字号:
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCDDRV
OBJECT MODULE PLACED IN LCDdrv.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE LCDdrv.c ROM(COMPACT) OPTIMIZE(4,SIZE) BROWSE DEBUG OBJECTEXTEND
line level source
1 /* LCD128x64显示接口函数
2 魏东 2004-11-22 10:08'
3 */
4 #include "def_port.h"
5 #define __SRC
6 #include "lcddrv.h"
7 #undef __SRC
8 #if lcd_put_en8x8_en
9 #include "en8x8.h"
10 #endif
11 #if lcd_put_ch12x12_en
12 #include "ch12x12.h" /* 12x12点阵汉字库,如果不使用,至少保留1个作空显示 */
13 #endif
14 #if lcd_put_ch16x16_en
15 #include "ch16x16.h" /* 16x16点阵汉字库,如果不使用,至少保留1个作空显示 */
16 #endif
17 #if lcd_put_ch24x24_en
18 #include "ch24x24.h" /* 24x24点阵汉字库,如果不使用,至少保留1个作空显示 */
19 #endif
20 /***********************************************************************************/
21
22 /* LCD复位 */
23 #if lcd_reset_en
24 void lcd_reset(void)
25 { unsigned int ui;
26 1
27 1 L_RST = 0; /* 复位 */
28 1 for(ui=0;ui<LCD_RST_DELAY;ui++) ; /* 等待25mS */
29 1 L_RST = 1; /* 工作 */
30 1 for(ui=0;ui<LCD_RST_DELAY;ui++) ; /* 等待25mS */
31 1 lcd_fill(0); /* 清除显示数据 */
32 1 lcd_x=0;
33 1 lcd_y=0;
34 1 _ch_id=0;
35 1 }
36 #endif
37
38 /* LCD开显示 */
39 #if lcd_on_en
40 void lcd_on(void)
41 {
42 1 LCD_STA_SET2CS12;
43 1 *LCD_STA=0x3f;
44 1 }
45 #endif
46
47 /* LCD关显示 */
48 #if lcd_off_en
49 void lcd_off(void)
50 {
51 1 LCD_STA_SET2CS12;
52 1 *LCD_STA=0x3e;
53 1 }
54 #endif
55
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 2
56 /* LCD显示滚卷 */
57 #if lcd_roll_en
58 void lcd_roll(unsigned char uc)
59 {
60 1 LCD_STA_SET2CS12;
61 1 *LCD_STA=(uc&0x3f)|0xc0;
62 1 }
63 #endif
64
65 /* 填充全屏LCD数据 */
66 #if lcd_fill_en
67 void lcd_fill(unsigned char cdt)
68 { unsigned char ccy,cci;
69 1
70 1 LCD_STA_SET2CS12;
71 1 LCD_DAT_SET2CS12;
72 1 for(ccy=0;ccy<8;ccy++)
73 1 { *LCD_STA=ccy|0xb8; /* Y坐标(x地址) */
74 2 *LCD_STA=0x40; /* X坐标(y地址) */
75 2 for(cci=0;cci<64;cci++)
76 2 { *LCD_DAT=cdt; /* 数据 */
77 3 }
78 2 }
79 1 lcd_on(); /* LCD开显示 */
80 1 lcd_x=0;
81 1 lcd_y&=0xe0;
82 1 _ch_id=0;
83 1 return;
84 1 }
85 #endif
86
87 /* 填充LCD数据(x坐标列,y低4位是坐标行(4点为1行)|高4位是填充数据,i填充列数) */
88 #if lcd_fill_xy_en
89 void lcd_fill_xy(unsigned char ccx,unsigned char ccy,unsigned char cci)
90 { unsigned char ccc;
91 1
92 1 if((ccx+cci)>128) cci=128-ccx;
93 1 cci=ccx+cci;
94 1 for(;ccx<cci;ccx++)
95 1 { if(ccx&0x40) /* 根据X地址bit6选择左右半 */
96 2 { LCD_STA_SET2CS2;
97 3 LCD_DAT_SET2CS2;
98 3 }
99 2 else
100 2 { LCD_STA_SET2CS1;
101 3 LCD_DAT_SET2CS1;
102 3 }
103 2 /* 将原屏幕数据读出 */
104 2 LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址) */
105 2 LCD_STA = ((ccy>>1)&0x07)|0xb8; /* Y坐标(x地址) */
106 2 ccc = * LCD_DAT; /* 读数据 */
107 2 LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址)(读完了y地址要自动加因此将y地址设回原来的值) */
108 2 if(ccy&1) LCD_DAT = (ccc&0x0f)|(ccy&0xf0); /* 奇数行(下半整行) */
109 2 else LCD_DAT = (ccc&0xf0)|((ccy>>4)&0x0f); /* 偶数行(上半整行) */
110 2 }
111 1 }
112 #endif
113
114 /* 选择LCD显示行高(最高位设置是否翻黑显示,其他位0:8;1:12;2:16;3:24) */
115 #if lcd_set_chlib_en
116 void lcd_set_chlib(unsigned char cch)
117 {
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 3
118 1 lcd_y = (lcd_y&0x0f)|((cch<<5)&0x60)|(cch&0x80);
119 1 }
120 #endif
121
122 /* 设置当前LCD显示位置 */
123 #if lcd_moveto_en
124 void lcd_moveto(unsigned char ccx,unsigned char ccy)
125 {
126 1 lcd_x = ccx;
127 1 lcd_y = (lcd_y&0xe0) | (ccy&0x1f);
128 1 _ch_id=0;
129 1 }
130 #endif
131
132 /* LCD显示/清除一个点 */
133 #if lcd_dot_en
134 void lcd_dot(unsigned char ccx,unsigned char ccy,unsigned char dot)
135 { unsigned char ccc;
136 1
137 1 if(ccx&0x40) /* 根据X地址bit6选择左右半 */
138 1 { LCD_STA_SET2CS2;
139 2 LCD_DAT_SET2CS2;
140 2 }
141 1 else
142 1 { LCD_STA_SET2CS1;
143 2 LCD_DAT_SET2CS1;
144 2 }
145 1 /* 将原屏幕数据读出 */
146 1 *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址) */
147 1 *LCD_STA = ((ccy>>3)&0x07)|0xb8; /* Y坐标(x地址) */
148 1 ccc = *LCD_DAT; /* 读数据 */
149 1 ccc = *LCD_DAT; /* 读数据 */
150 1 *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址)(读完了y地址要自动加因此将y地址设回原来的值) */
151 1 if(dot) *LCD_DAT = ccc|(1<<(ccy&7)); /* 数据(显示) */
152 1 else *LCD_DAT = ccc&((1<<(ccy&7))^0xff); /* 数据(清除) */
153 1 }
154 #endif
155
156 /* LCD显示发送一字符 */
157 #if lcd_putchar_en
158 char lcd_putchar (unsigned char c)
159 { unsigned char uc;
160 1
161 1 lcd_y &= 0xef; /* lcd_y最大0f(4*16=64点) */
162 1 if(_ch_code) /* 已有汉字第1字节,加第2字节后显示 */
163 1 { _ch_id=1;
164 2 _ch_code = _ch_code + c;
165 2 if((lcd_y&0x60)==0x60) /* 24点阵汉字 */
166 2 { if(lcd_x > 104)
167 3 { lcd_x = 0;
168 4 lcd_y +=6 ;
169 4 }
170 3 #if lcd_put_ch24x24_en
171 3 lcd_put_ch24x24(lcd_x,lcd_y,_ch_code);
172 3 #endif
173 3 lcd_x += 24;
174 3 }
175 2 else if((lcd_y&0x60)==0x40) /* 16点阵汉字 */
176 2 { if(lcd_x > 112)
177 3 { lcd_x = 0;
178 4 lcd_y += 4;
179 4 }
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 4
180 3 #if lcd_put_ch16x16_en
181 3 lcd_put_ch16x16(lcd_x,lcd_y,_ch_code);
182 3 #endif
183 3 lcd_x += 16;
184 3 }
185 2 else /* 12点阵汉字 */
186 2 { if(lcd_x > 116)
187 3 { lcd_x = 0;
188 4 lcd_y += 3;
189 4 }
190 3 #if lcd_put_ch12x12_en
191 3 lcd_put_ch12x12(lcd_x,lcd_y,_ch_code);
192 3 #endif
193 3 lcd_x += 12;
194 3 }
195 2 _ch_code=0;
196 2 return 2;
197 2 }
198 1 else /* 这是第1字节 */
199 1 { if(c&0x80)
200 2 { _ch_code = c*256; /* 汉字第1字节 */
201 3 return 0;
202 3 }
203 2 else /* 8点阵字母 */
204 2 { if((lcd_x>120)||(c=='\n'))
205 3 { if((lcd_y&0x60)==0x60) lcd_y += 6; /* 24点一行 */
206 4 else if((lcd_y&0x60)==0x40) lcd_y += 4; /* 16点一行 */
207 4 else if((lcd_y&0x60)==0x20) lcd_y += 3; /* 12点一行 */
208 4 else if(_ch_id) lcd_y += 3; /* 本来是8点一行显了汉字按12点一行 */
209 4 else lcd_y += 2; /* 8点一行 */
210 4 lcd_x = 0;
211 4 _ch_id=0; /* 换行后清有汉字标志 */
212 4 if(c=='\n') return 1;
213 4 }
214 3 if(c=='\r')
215 3 { lcd_x=0;
216 4 return 1;
217 4 }
218 3 #if lcd_put_en8x8_en
219 3 if(lcd_y&0x80) uc=0xf0; /* 空的填黑 */
220 3 else uc=0x00; /* 空的填白 */
221 3 if((lcd_y&0x60)==0x60)
222 3 { lcd_fill_xy(lcd_x,(lcd_y&0x0f)|uc,8); /* 空的填充 */
223 4 lcd_fill_xy(lcd_x,((lcd_y+1)&0x0f)|uc,8); /* 空的填充 */
224 4 lcd_put_en8x8(lcd_x,lcd_y+2,c); /* 24点阵中下移2行(8点) */
225 4 lcd_fill_xy(lcd_x,((lcd_y+4)&0x0f)|uc,8); /* 空的填充 */
226 4 lcd_fill_xy(lcd_x,((lcd_y+5)&0x0f)|uc,8); /* 空的填充 */
227 4 }
228 3 else if(lcd_y&0x60)
229 3 { lcd_fill_xy(lcd_x,(lcd_y&0x0f)|uc,8); /* 空的填充 */
230 4 lcd_put_en8x8(lcd_x,lcd_y+1,c); /* 16/12点阵中下移1行(4点) */
231 4 if((lcd_y&0x60)==0x40) lcd_fill_xy(lcd_x,((lcd_y+3)&0x0f)|uc,8); /* 空的填充 */
232 4 }
233 3 else lcd_put_en8x8(lcd_x,lcd_y,c); /* 8点阵 */
234 3 #endif
235 3 lcd_x+=8;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -