📄 lcddrv.lst
字号:
236 3 return 1;
237 3 }
238 2 }
239 1 }
240 #endif
241
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 5
242 /* 显示一个8x8英文字符 */
243 #if lcd_put_en8x8_en
244 void lcd_put_en8x8(unsigned char x,unsigned char y,unsigned char en)
245 {
246 1 en&=0x7f;
247 1 if(en<0x20) en=0x20;
248 1 en -= 0x20;
249 1 if(y&0x01) /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
250 1 { lcd_put(x,(y/2)|(y&0x80),&enlib_dat[en][0],8|0xa0); /* 使用数据的低半作高半显示 */
251 2 lcd_put(x,(y/2+1)|(y&0x80),&enlib_dat[en][0],8|0xc0); /* 使用数据的高半作低半显示 */
252 2 }
253 1 else lcd_put(x,(y/2)|(y&0x80),&enlib_dat[en][0],8);
254 1 }
255 #endif
256
257 /* 显示一个12x12点阵汉字 */
258 #if lcd_put_ch12x12_en
259 void lcd_put_ch12x12(unsigned char x,unsigned char y,unsigned int ch)
260 { unsigned char ci;
261 1 /* 在字库中查找汉字 */
262 1 for(ci=0;ci<ch12x12_num;ci++) if(ch12x12_code[ci]==ch) break;
263 1 if(ci>=ch12x12_num) ci=0; /* 没有找到0总是全空 */
264 1 if(y&0x01) /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
265 1 { lcd_put(x,(y/2)|(y&0x80),&ch12x12_dat[ci][0],12|0xa0); /* 使用数据的低半作高半显示 */
266 2 lcd_put(x,(y/2+1)|(y&0x80),&ch12x12_dat[ci][0],12|0xc0); /* 使用数据的高半作低半显示 */
267 2 lcd_put(x,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0xa0); /* 使用数据的低半作高半显示 */
268 2 lcd_put(x+6,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0xe0); /* 使用数据的高半作高半显示 */
269 2 }
270 1 else
271 1 { lcd_put(x,(y/2)|(y&0x80),&ch12x12_dat[ci][0],12);
272 2 lcd_put(x,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0x80); /* 使用数据的低半作低半显示 */
273 2 lcd_put(x+6,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0xc0); /* 使用数据的高半作低半显示 */
274 2 }
275 1 }
276 #endif
277
278 /* 显示一个24x24点阵汉字 */
279 #if lcd_put_ch24x24_en
280 void lcd_put_ch24x24(unsigned char x,unsigned char y,unsigned int ch)
281 { unsigned char ci;
282 1 /* 在字库中查找汉字 */
283 1 for(ci=0;ci<ch24x24_num;ci++) if(ch24x24_code[ci]==ch) break;
284 1 if(ci>=ch24x24_num) ci=0; /* 没有找到0总是全空 */
285 1 if(y&0x01) /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
286 1 { lcd_put(x,(y/2)|(y&0x80),&ch24x24_dat[ci][0],24|0xa0); /* 使用数据的低半作高半显示 */
287 2 lcd_put(x,(y/2+1)|(y&0x80),&ch24x24_dat[ci][0],24|0xc0); /* 使用数据的高半作低半显示 */
288 2 lcd_put(x,(y/2+1)|(y&0x80),&ch24x24_dat[ci][24],24|0xa0); /* 使用数据的低半作高半显示 */
289 2 lcd_put(x,(y/2+2)|(y&0x80),&ch24x24_dat[ci][24],24|0xc0); /* 使用数据的高半作低半显示 */
290 2 lcd_put(x,(y/2+2)|(y&0x80),&ch24x24_dat[ci][48],24|0xa0); /* 使用数据的低半作高半显示 */
291 2 lcd_put(x,(y/2+3)|(y&0x80),&ch24x24_dat[ci][48],24|0xc0); /* 使用数据的高半作低半显示 */
292 2 }
293 1 else
294 1 { lcd_put(x,(y/2)|(y&0x80),&ch24x24_dat[ci][0],24);
295 2 lcd_put(x,(y/2+1)|(y&0x80),&ch24x24_dat[ci][24],24);
296 2 lcd_put(x,(y/2+2)|(y&0x80),&ch24x24_dat[ci][48],24);
297 2 }
298 1 }
299 #endif
300
301 /* 显示一个16x16点阵汉字 */
302 #if lcd_put_ch16x16_en
303 void lcd_put_ch16x16(unsigned char x,unsigned char y,unsigned int ch)
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 6
304 { unsigned char ci;
305 1 /* 在字库中查找汉字 */
306 1 for(ci=0;ci<ch16x16_num;ci++) if(ch16x16_code[ci]==ch) break;
307 1 if(ci>=ch16x16_num) ci=0; /* 没有找到0总是全空 */
308 1 else /* 16点阵汉字 */
309 1 { if(y&0x01) /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
310 2 { lcd_put(x,(y/2)|(y&0x80),&ch16x16_dat[ci][0],16|0xa0); /* 使用数据的低半作高半显示 */
311 3 lcd_put(x,(y/2+1)|(y&0x80),&ch16x16_dat[ci][0],16|0xc0); /* 使用数据的高半作低半显示 */
312 3 lcd_put(x,(y/2+1)|(y&0x80),&ch16x16_dat[ci][16],16|0xa0); /* 使用数据的低半作高半显示 */
313 3 lcd_put(x,(y/2+2)|(y&0x80),&ch16x16_dat[ci][16],16|0xc0); /* 使用数据的高半作低半显示 */
314 3 }
315 2 else
316 2 { lcd_put(x,(y/2)|(y&0x80),&ch16x16_dat[ci][0],16);
317 3 lcd_put(x,(y/2+1)|(y&0x80),&ch16x16_dat[ci][16],16);
318 3 }
319 2 }
320 1 }
321 #endif
322
323 /* 写LCD显示 */
324 #if lcd_put_en
325 void lcd_put(unsigned char ccx,unsigned char ccy,unsigned char *cdt,unsigned char cclen)
326 { unsigned char cci,ccc;
327 1
328 1 if(ccx&0x40) /* 根据X地址bit6选择左右半 */
329 1 { LCD_STA_SET2CS2;
330 2 LCD_DAT_SET2CS2;
331 2 }
332 1 else
333 1 { LCD_STA_SET2CS1;
334 2 LCD_DAT_SET2CS1;
335 2 }
336 1 *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址) */
337 1 *LCD_STA = (ccy&0x07)|0xb8; /* Y坐标(x地址) */
338 1 for(cci=0;cci<(cclen&0x1f);cci++)
339 1 { if(cclen&0x80) /* 只使用数据的半字节,需要将原屏幕数据读出 */
340 2 { *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址) */
341 3 ccc = *LCD_DAT; /* 读数据 */
342 3 ccc = *LCD_DAT; /* 读数据 */
343 3 *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址)(读完了y地址要自动加因此将y地址设回原来的值) */
344 3 if(ccy&0x80) ccc=ccc^0xff; /* 要反显,读出数据先非 */
345 3 if((cclen&0xe0)==0x80) /* 100低半作低半 */
346 3 ccc = (ccc&0xf0)|(cdt[cci]&0x0f);
347 3 else if((cclen&0xe0)==0xa0) /* 101低半作高半 */
348 3 ccc = (ccc&0x0f)|((cdt[cci]&0x0f)<<4);
349 3 else if((cclen&0xe0)==0xc0) /* 110高半作低半 */
350 3 ccc = (ccc&0xf0)|((cdt[cci]&0xf0)>>4);
351 3 else /* 111高半作高半 */
352 3 ccc = (ccc&0x0f)|(cdt[cci]&0xf0);
353 3 }
354 2 else ccc=cdt[cci];
355 2 if(ccy&0x80) *LCD_DAT = ccc^0xff; /* P0口发数据 */
356 2 else *LCD_DAT = ccc;
357 2 ccx++;
358 2 if((ccx&0x3f)==0) /* 换左右半 */
359 2 { if((ccx&0x7f)==0) ccx=0x7f; /* 超过不换行 */
360 3 if(ccx&0x40) /* 根据X地址bit6选择左右半 */
361 3 { LCD_STA_SET2CS2;
362 4 LCD_DAT_SET2CS2;
363 4 }
364 3 else
365 3 { LCD_STA_SET2CS1;
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 7
366 4 LCD_DAT_SET2CS1;
367 4 }
368 3 *LCD_STA = (ccx&0x3f)|0x40; /* x地址 */
369 3 *LCD_STA = (ccy&0x07)|0xb8; /* y地址 */
370 3 }
371 2 }
372 1 }
373 #endif
374
375 /* 写LCD数据 */
376 #if lcd_write_en
void lcd_write(unsigned char ccx,unsigned char ccy,unsigned char *cdt,unsigned char cclen)
{ unsigned char cci;
if(ccx&0x40) /* 根据X地址bit6选择左右半 */
{ LCD_STA_SET2CS2;
LCD_DAT_SET2CS2;
}
else
{ LCD_STA_SET2CS1;
LCD_DAT_SET2CS1;
}
if(ccy&0x80) /* 根据Y坐标bit7决定是写数据还是状态 */
{ if(cdt[0]&0x80)
*LCD_STA = (cdt[0]&0x01)|0x3e; /* 开关显示 */
else
*LCD_STA = cdt[0]|0xc0; /* 数据卷滚 */
}
else
{ *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址) */
*LCD_STA = (ccy&0x07)|0xb8; /* Y坐标(x地址) */
for(cci=0;cci<cclen;cci++)
{ *LCD_DAT = cdt[cci]; /* P0口发数据 */
ccx++;
if((ccx&0x3f)==0) /* 换左右半 */
{ if((ccx&0x7f)==0) /* 换行 */
{ ccy++; /* Y坐标加1 */
ccx=0; /* X坐标回0 */
}
if(ccx&0x40) /* 根据X地址bit6选择左右半 */
{ LCD_STA_SET2CS2;
LCD_DAT_SET2CS2;
}
else
{ LCD_STA_SET2CS1;
LCD_DAT_SET2CS1;
}
*LCD_STA = 0x40; /* X坐标(y地址) */
*LCD_STA = (ccy&0x07)|0xb8; /* Y坐标(x地址) */
}
}
}
}
#endif
420
421 /* 读LCD数据 */
422 #if lcd_read_en
void lcd_read(unsigned char ccx,unsigned char ccy,unsigned char *cdt,unsigned char cclen)
{ unsigned char cci;
if(ccx&0x40) /* 根据X地址bit6选择左右半 */
{ LCD_STA_SET2CS2;
C51 COMPILER V7.50 LCDDRV 09/25/2005 15:49:03 PAGE 8
LCD_DAT_SET2CS2;
}
else
{ LCD_STA_SET2CS1;
LCD_DAT_SET2CS1;
}
if(ccy&0x80) /* 根据Y坐标bit7决定是写数据还是状态 */
{ cdt[0] = *LCD_STA; /* 状态数据 */
}
else
{ *LCD_STA = (ccx&0x3f)|0x40; /* X坐标(y地址) */
*LCD_STA = (ccy&0x07)|0xb8; /* Y坐标(x地址) */
for(cci=0;cci<cclen;cci++)
{ cdt[cci] = *LCD_DAT; /* 数据 */
ccx++;
if((ccx&0x3f)==0) /* 换左右半 */
{ if((ccx&0x7f)==0) /* 换行 */
{ ccy++; /* Y坐标加1 */
ccx=0; /* X坐标回0 */
}
if(ccx&0x40) /* 根据X地址bit6选择左右半 */
{ LCD_STA_SET2CS2;
LCD_DAT_SET2CS2;
}
else
{ LCD_STA_SET2CS1;
LCD_DAT_SET2CS1;
}
*LCD_DAT = 0x40; /* X坐标(y地址) */
*LCD_DAT = (ccy&0x07)|0xb8; /* Y坐标(x地址) */
}
}
}
}
#endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2424 ----
CONSTANT SIZE = 2028 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 24
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -