📄 lcd.lst
字号:
175 4 line = y1 & 7; page = y1 >> 3;
176 4 disp_ram[page][x1] |= (0x01 << line);
177 4 temp_step += add_step;
178 4 if(i) y1--; else y1++;
179 4
180 4 }while(y1 != y2);
181 3 line = y2 & 0x07; page = y2 >> 3;
182 3 disp_ram[page][x2] |= (0x01 << line);
183 3 }
184 2 else
185 2 {
186 3 temp_step = y1;
187 3 add_step = ((float)y2-(float)y1)/abs((float)x2-(float)x1);
188 3
189 3 if(x1 > x2) i = 1; else i = 0;
190 3 do
191 3 {
192 4 y1 = temp_step;
193 4 line = y1 & 0x07;
194 4 page = y1 >> 3;
195 4
196 4 disp_ram[page][x1] |= (0x01 << line);
197 4 temp_step += add_step;
198 4 if(i) x1 -- ; else x1 ++;
199 4
200 4 }while(x1 != x2);
201 3 line = y2 & 0x07; page = y2 >> 3;
202 3 disp_ram[page][x2] |= (0x01 << line);
203 3 }
204 2 }
205 1 }
206 //********************************************************************************************************
-******************
207 //入口为井名字符代码串指针,显示行值,列值,间隔
208 void LCD_DispStr(unsigned char *addr_da, char disp_x, char disp_y)
209 {
210 1 xdata unsigned char ia;
211 1 xdata unsigned char StrLong;
212 1
213 1 ia = *addr_da++;
214 1 //StrLong=lenth;
215 1 StrLong=strlen(addr_da)+1;
216 1
217 1 while((ia)&&(StrLong))
218 1 {
219 2 if(ia >= 97 && ia <= 122)//"a-z"
220 2 {
221 3 display_asc8x8((ia - 0x2A - 32), disp_x , disp_y, 1,1);//换成大写的字母
222 3 }
223 2 else if(ia == 0x20)
224 2 {
225 3 display_asc8x8(49, disp_x , disp_y, 1,1);//空格
226 3 }
227 2 else if (ia > 125 || ia < 27)
228 2 {
229 3 display_asc8x8(0 , disp_x , disp_y, 1,1);
230 3 }//如果不是asc2码,用*表示
231 2 else
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 5
232 2 {
233 3 display_asc8x8((ia - 0x2A), disp_x, disp_y, 1,1);
234 3 }
235 2 disp_y += 6;
236 2 ia = *addr_da++;
237 2 StrLong --;
238 2 }
239 1 }
240 //********************************************************************************************************
-******************
241 //显示一个字符程序,asc_position为在ASC8X8的一维次序,
242 void display_asc8x8(char asc_position,unsigned char page, unsigned char column, char val,unsigned char fx)
243 {
244 1 xdata unsigned char *ptr;
245 1
246 1 ptr = ASC8X8[asc_position];
247 1 display_asc8x6(ptr, page, column, val,fx);
248 1
249 1 }
250 //********************************************************************************************************
-******************
251 //显示8*6asc字符,将要显示的字符放在显示缓冲区中。asc字符可以选择是否覆盖原有显示,当val = 1时清除原有内容,
252 void display_asc8x6(unsigned char *data_ptr,unsigned char page, unsigned char column, char val,unsigned ch
-ar fx)
253 {
254 1 xdata unsigned char i,j,k,st_data,page1,column1;
255 1 xdata unsigned char ii,ij;
256 1 xdata unsigned char hzdata[8];
257 1 xdata unsigned char hz_temp[8];
258 1
259 1 unsigned char code *ptr;
260 1
261 1 ptr = data_ptr;
262 1 page1 = page;
263 1 column1 = column;
264 1 if(column1 > 122) column1 = 0;//列数到尾
265 1 for (i=0;i<8;i++)
266 1 {
267 2 if(fx == 0)
268 2 {hz_temp[i] =~(*(ptr + i));}
269 2 if(fx == 1)
270 2 {hz_temp[i] =*(ptr + i);}
271 2 k = hz_temp[i];
272 2 }
273 1
274 1 for (i = 0; i < 8;i++)
275 1 {
276 2 hzdata[i] = 0;
277 2 j = i;
278 2 hzdata[i] = (((hz_temp[0] << j) & 0x80) >>7) | (((hz_temp[1] << j) & 0x80) >> 6);
279 2 hzdata[i] |= (((hz_temp[2] << j) & 0x80) >> 5) | (((hz_temp[3] << j) & 0x80) >> 4);
280 2 hzdata[i] |= (((hz_temp[4] << j) & 0x80) >> 3) | (((hz_temp[5] << j) & 0x80) >> 2);
281 2 hzdata[i] |= (((hz_temp[6] << j) & 0x80) >> 1) | ((hz_temp[7] << j) & 0x80) ;
282 2 }
283 1 k = page1 >> 3;
284 1
285 1 if(k > 7) k &= 0x07 ;
286 1 j = page1 & 0x07;
287 1 if(j == 0) {ii = 0; ij = 0xf0;}
288 1 else if(j == 1) {ii = 1; ij = 0xe1;}
289 1 else if(j == 2) {ii = 0x03; ij = 0xc3;}
290 1 else if(j == 3) {ii = 0x07; ij = 0x87;}
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 6
291 1 else if(j == 4) {ii = 0x0f; ij = 0x0f;}
292 1 else if(j == 5) {ii = 0x1f; ij = 0xf7;}
293 1 else if(j == 6) {ii = 0x3f; ij = 0xfc;}
294 1 else if(j == 7) {ii = 0x7f; ij = 0xf8;}
295 1 if(val)// 清除原位置内容
296 1 {
297 2 for(i = 0; i < 8; i++)
298 2 {
299 3
300 3 st_data = disp_ram[k][column1 + i-2 ];
301 3 disp_ram[k][column1 + i - 2] = (st_data & ii) | (hzdata[i] << j) ;
302 3 if(k < 7)
303 3 {
304 4 st_data = disp_ram[k+1][column1+i-2];
305 4 disp_ram[k+1][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
306 4 }
307 3 else
308 3 {
309 4 st_data = disp_ram[0][column1+i-2];
310 4 disp_ram[0][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
311 4 }
312 3 }
313 2 }
314 1
315 1 else//保留原位置内容
316 1 {
317 2 for(i = 0; i < 8; i++)
318 2 {
319 3 st_data = disp_ram[k][column1 + i-2 ];
320 3 disp_ram[k][column1 + i - 2] = st_data | (hzdata[i] << j) ;
321 3
322 3 if(k < 7)
323 3 {
324 4 st_data = disp_ram[k+1][column1+i-2];
325 4 disp_ram[k+1][column1+i-2] = st_data | (hzdata[i] >> (8-j));
326 4 }
327 3 else
328 3 {
329 4 st_data = disp_ram[0][column1+i-2];
330 4 disp_ram[0][column1+i-2] = st_data | (hzdata[i] >> (8-j));
331 4 }
332 3 }
333 2 }
334 1
335 1 }
336 //********************************************************************************************************
-******************
337 //显示12*12汉字,思路是先放前面的12个字符,这将会分两页来完成,写每页的时候先把要显示的区域清空,
338 //再写上要写的内容。再写后面的12个字符,这将会出现在第二和第三页上,也是先把要显示的区域清空?
339 //写第二页的的时候要注意保留写前12个字符时的内容,所以清空第二页的时候有可能是保留上下两头的数据,
340 void display_hz1212(unsigned char* hz_idptr,unsigned char page,unsigned char column)
341 {
342 1 unsigned char xdata i,j,k,st_data;
343 1 unsigned char xdata ii,ij,jj;
344 1 unsigned char xdata hzdata[24];
345 1 unsigned char xdata page1,column1;
346 1
347 1 page1 = page;
348 1 column1 = column;
349 1 if(column1 > 117) column1 = 2;
350 1
351 1 for(i = 0;i < 24;i ++)
C51 COMPILER V7.06 LCD 06/25/2008 15:44:08 PAGE 7
352 1 {
353 2 hzdata[i] = *hz_idptr ++;
354 2
355 2 }
356 1 k = page1/8;//传入的page1是行地址,k为实际的页地址
357 1 if(k > 7) k = (k % 8);
358 1 j = page1%8;//j为除以8后的数,表示离标准的页地址中的第一行的距离
359 1 if(j == 0) {ii = 0; ij = 0xf0;jj = 0xFF;}
360 1 else if(j == 1) {ii = 1; ij = 0xe1;jj = 0xFF;}//当要显示的输出现在页的第1行(之前是第0行),需要把之后的7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -