📄 lcd.lst
字号:
239 };
240 /********************************************************************************************
241 //软件延时 Delay()
C51 COMPILER V7.50 LCD 08/25/2007 20:35:38 PAGE 5
242 //
243 *********************************************************************************************/
244 void Delay(unsigned int count){
245 1 unsigned char i;
246 1 while(--count != 0){
247 2 for(i = 0; i < 125; i++); // ";" 表示空语句,CPU空转。
248 2 } // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
249 1 }
250 /*********************************************************************************************
251 //LCM12864测忙函数 LCM12864_TestBusy()
252 //
253 **********************************************************************************************/
254 void LCM12864_TestBusy(void){
255 1 LCM12864_RW = 1;
256 1 LCM12864_RS = 0;
257 1 LCM12864_E = 0;
258 1 LCM12864_E = 1;
259 1 while(LCM12864_DB7_DB0 & LCM12864_STATUS_BUSY);
260 1 }
261 /*********************************************************************************************
262 //写指令到LCM12864 LCM12864_WriteCMD()
263 //
264 **********************************************************************************************/
265 void LCM12864_WriteCMD(unsigned char LCM12864_command){ //LCM12864_command 欲写入指令
266 1 LCM12864_TestBusy();
267 1 LCM12864_RW = 0; LCM12864_RS = 0;
268 1 LCM12864_DB7_DB0 = LCM12864_command;
269 1 LCM12864_E = 0;
270 1 LCM12864_E = 1;
271 1 LCM12864_TestBusy();
272 1 }
273 /*********************************************************************************************
274 //写数据到LCM12864 LCM12864_WriteData()
275 //
276 **********************************************************************************************/
277 void LCM12864_WriteData(unsigned char LCM12864_data){ //LCM12864_command 欲写入数据
278 1 LCM12864_RW = 0; LCM12864_RS = 1;
279 1 LCM12864_DB7_DB0 = LCM12864_data;
280 1 LCM12864_E = 0;
281 1 LCM12864_E = 1;
282 1 LCM12864_TestBusy(); //读LCM忙
283 1 }
284 /********************************************************************************************
285 //从LCM12864读数据 LCM12864_ReadData()
286 //
287 *********************************************************************************************/
288 unsigned char LCM12864_ReadData(void){
289 1 unsigned char LCM12864_data;
290 1 LCM12864_E = 0;
291 1 LCM12864_RW = 1; LCM12864_RS = 1;
292 1 LCM12864_E = 1;
293 1 LCM12864_data = LCM12864_DB7_DB0; //送入8位数据
294 1 LCM12864_TestBusy(); //读LCM忙
295 1 return LCM12864_data;
296 1 }
297 /********************************************************************************************
298 //向LCM12864指定点写一字节数据 LCM12864_Write1Byte_X_Y()
299 //
300 /********************************************************************************************/
301 void LCM12864_Write1Byte_X_Y( unsigned char x, //x坐标值(0-127)
302 unsigned char y, //y坐标值(0-63)
303 unsigned char LCM12864_data){ //LCM12864_data 所要写的数据
C51 COMPILER V7.50 LCD 08/25/2007 20:35:38 PAGE 6
304 1 x = x&0x7f; y = y&0x3f; //参数过滤
305 1 LCM12864_CS1 = 1; LCM12864_CS2 = 1; //不选中左半屏及右半屏
306 1 if(x<64){ // 判断选择左、右半屏
307 2 LCM12864_CS1 = 0; // 选中左半屏
308 2 }
309 1 else{
310 2 LCM12864_CS2 = 0; // 选中右半屏
311 2 x = x-64;
312 2 }
313 1 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x); // 设置当前列地址,即x坐标
314 1 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
315 1 LCM12864_WriteData(LCM12864_data); // 向LCM12864写数据
316 1 }
317 /********************************************************************************************
318 //从LCM12864指定点读取一字数据 LCM12864_Read1Byte_X_Y()
319 //
320 /********************************************************************************************/
321 unsigned char LCM12864_Read1Byte_X_Y( unsigned char x, //x坐标值(0-127)
322 unsigned char y){ //y坐标值(0-63)
323 1 unsigned char LCM12864_data;
324 1 x = x&0x7f; y = y&0x3f; //参数过滤
325 1 LCM12864_CS1 = 1; LCM12864_CS2 = 1; //不选中左半屏及右半屏
326 1 if(x<64){ // 判断选择左、右半屏
327 2 LCM12864_CS1 = 0; // 选中左半屏
328 2 }
329 1 else{
330 2 LCM12864_CS2 = 0; // 选中右半屏
331 2 x = x-64;
332 2 }
333 1 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x); // 设置当前列地址,即x坐标
334 1 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
335 1 LCM12864_data = LCM12864_ReadData(); // 向LCM12864写数据
336 1 return LCM12864_data;
337 1 }
338 /********************************************************************************************
339 //向LCM12864填充数据 LCM12864_Fill_Screen()
340 //
341 *********************************************************************************************/
342 void LCM12864_Fill_Screen( unsigned char t, //设置涮屏速度(为1不涮屏,默认为60)
343 unsigned char LCM12864_FillData){ //欲写入的数据
344 1 unsigned char x,y;
345 1 LCM12864_CS1 = 0;LCM12864_CS2 = 0; // 选中左半屏及右半屏
346 1 LCM12864_WriteCMD(LCM12864_START_ROW+0); // 设置显示起始行为0
347 1 for(x=0;x<8;x++){
348 2 Delay(t); // 涮屏速度延时
349 2 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+x); // 设置页地址
350 2 // // 设置列地址
351 2 for(y=0;y<64;y++){
352 3 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+y);
353 3 LCM12864_WriteData(LCM12864_FillData);
354 3 }
355 2 }
356 1 LCM12864_CS1 = 1; // 不选中右半屏
357 1 LCM12864_CS2 = 1; // 不选中右半屏
358 1 }
359 /********************************************************************************************
360 //LCM12864清屏 LCM12864_Clear_Screen()
361 //
362 *********************************************************************************************/
363 void LCM12864_Clear_Screen(void){
364 1 LCM12864_Fill_Screen(60,0x00); //写入0到每个显示区
365 1 }
C51 COMPILER V7.50 LCD 08/25/2007 20:35:38 PAGE 7
366 /********************************************************************************************
367 //LCM12864黑屏 LCM12864_Clear_black()
368 //
369 *********************************************************************************************/
370 void LCM12864_Clear_black(void){
371 1 LCM12864_Fill_Screen(0xff); //可写入其它数值以填满LCD屏
*** WARNING C209 IN LINE 371 OF LCD.C: '_LCM12864_Fill_Screen': too few actual parameters
372 1 }
373 /********************************************************************************************
374 17/20
375 PG12864LRS-JNN-H 技术手册(完整版)
376 DoYoung.net 原创技术资料
377 www.doyoung.net
378 //显示128*64图片 LCM12864_Disp_Bitmap_12864()
379 //
380 *********************************************************************************************/
381 void LCM12864_Disp_Bitmap_12864( unsigned char t, //设置涮屏速度(为1不涮屏,默认为60)
382 unsigned char code *bitmap_12864){ //128*64点阵图像所在数组表
383 1 unsigned char j,k;
384 1 for(k=0;k<8;k++){ //设置8页的显示
385 2 Delay(t);
386 2 LCM12864_CS1 = 0;LCM12864_CS2 = 1; //半屏选中
387 2 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+k); //选中页
388 2 //选中列
389 2 for(j=0;j<64;j++){
390 3 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+j);
391 3 LCM12864_WriteData(bitmap_12864[k*128+j]); //开始写入数据
392 3 }
393 2 LCM12864_CS1 = 1;LCM12864_CS2 = 0;
394 2 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+k);
395 2 for(j=64;j<128;j++){
396 3 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+j);
397 3 LCM12864_WriteData(bitmap_12864[k*128+j]);
398 3 }
399 2 }
400 1 }
401 /********************************************************************************************
402 //在LCM12864的指定点显示16*16点阵汉字 LCM12864_Disp_Chinese_16_16()
403 //
404 *********************************************************************************************/
405 void LCM12864_Disp_Char_x_16( unsigned char t, //设置书写速度(为1直接显示,默认为12)
406 unsigned char b, //输入8:8*16字符,16:16*16字符
407 unsigned char LCM12864_page, //LCM12864的页地址(0~7)
408 unsigned char LCM12864_col, //LCM12864的列地址(0~128)注意:右半屏起始是64
409 unsigned char code *Char_x_16){ //16*16点阵汉字字模(纵向取模,字节倒序)
410 1 unsigned char j=0,i=0;
411 1 if(LCM12864_col < 64 ){
412 2 LCM12864_CS1 = 0; LCM12864_CS2 = 1; //判断屏幕使能
413 2 }
414 1 else{
415 2 LCM12864_CS1 = 1; LCM12864_CS2 = 0;
416 2 LCM12864_col = LCM12864_col - 64;
417 2 }
418 1 for(j=0;j<2;j++){
419 2 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+LCM12864_page+j);
420 2 for(i=0;i<b;i++){
421 3 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+LCM12864_col+i);
422 3 LCM12864_WriteData(Char_x_16[b*j+i]);
423 3 Delay(t);
424 3 }
425 2 }
426 1 }
C51 COMPILER V7.50 LCD 08/25/2007 20:35:38 PAGE 8
427 /********************************************************************************************
428 //LCM12864初始化 LCM12864_Init()
429 //
430 *********************************************************************************************/
431 void LCM12864_Init(void){
432 1 LCM12864_RESET = 0; //复位
433 1 Delay(300);
434 1 LCM12864_RESET = 1;
435 1 Delay(300);
436 1 LCM12864_Clear_Screen(); //清除屏幕
437 1 LCM12864_CS1 = 0; LCM12864_CS2 = 0; //选中双屏
438 1 LCM12864_WriteCMD(LCM12864_DISP_OFF); //关显示
439 1 LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+0); //第0页位置
440 1 LCM12864_WriteCMD(LCM12864_START_ROW+0); //第0行
441 1 LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0); //第0列
442 1 LCM12864_WriteCMD(LCM12864_DISP_ON); //开显示
443 1 }
444 /*********************************************************************************************/
445 // 以上是 LCM12864液晶模块驱动程序
446 /*********************************************************************************************/
447 /********************************************************************************************
448 //LCM12864液晶模块驱动演示 main()
449 //
450 *********************************************************************************************/
451 void main (void){
452 1 unsigned char lx = 32,i;
453 1 LCM12864_Init(); // LCM12864初始化
454 1 while(1){
455 2 LCM12864_Disp_Bitmap_12864(60,doyleee); //显示LOGO图像
456 2 Delay(1000); //延时1秒
457 2 LCM12864_Clear_Screen(); //清除屏幕
458 2 LCM12864_Disp_Char_x_16(12,16,1,46,feng); //显示“欢”,在第4页第46列
459 2 Delay(1000);
460 2 LCM12864_Disp_Char_x_16(12,16,1,66,yun); //显示“迎”,在第4页第66列
461 2 Delay(1000);
462 2 for(i=0;i<4;i++){ //显示字符串“Dy12864”
463 3 LCM12864_Disp_Char_x_16(8,16,4,lx+16*i,nAsciiDot+32*i); //显示“Dy12864”,从第1页第32列
464 3 Delay(1000);
465 3 }
466 2 }
467 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 581 ----
CONSTANT SIZE = 1216 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 9
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -