📄 lcd1602.lst
字号:
314 1 NOP();
315 1 LCD_EN=1;
316 1 NOP();
317 1 LCD_EN=0;
318 1 #endif
319 1 }
320 #endif
321
322
323 /*************************************************
324 * 函数说明:MCU向LCD16B20读取数据 *
325 * 输出参数: unsigned char DATA *
326 **************************************************/
327 #if LCD_EN_readData
unsigned char LCDreadData(void)
{
unsigned char redata;
#if LCD_DL<8
unsigned char temp;
#endif
LCDwaitForReady();
LCD_RS=1;//选择数据寄存器
NOP();
LCD_RW=1;//读取数据寄存器
NOP();
#if LCD_DL>4
LCD_Data_Port=0xff;
LCD_EN=1;
NOP();
redata=LCD_Data_Port;
LCD_EN=0;
#else
LCD_Data_Port=LCD_Data_Port | 0xf0;
LCD_EN=1;
NOP();
redata=LCD_Data_Port;
LCD_EN=0;
redata=redata & 0xf0;
NOP();
LCD_EN=1;
NOP();
temp=LCD_Data_Port;
LCD_EN=0;
temp=temp >>4;
temp=temp & 0xf;
redata=redata | temp;
#endif
return (redata);
}
#endif
C51 COMPILER V6.23a LCD1602 10/25/2008 20:27:53 PAGE 7
366
367
368 /**************************************
369 * 函数说明:背光灯控制 *
370 * 输入参数: bit onoff *
371 ***************************************/
372 #if LCD_EN_light
373 void LCDlight(bit onoff)
374 {
375 1 LCD_LED=!onoff;
376 1 }
377 #endif
378
379
380 /***********************************************
381 * 函数说明:设置显示坐标函数 *
382 ************************************************/
383 //控制器内部带有80个*8位RAM(即80字节RAM),对于关系:
384 //第一行:00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10......27(40个)
385 //第二行:40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50......67(40个)
386 //第一行首个地址为:0x80+00;
387 //第二行首个地址为:0x80+0x0x40+00,即:0xc0+00
388 #if LCD_EN_setXY
389 void LCDsetXY(unsigned char X,unsigned char Y)
390 {
391 1 unsigned char Address;
392 1 if(X>39)
393 1 X=39;
394 1 if (Y == 0)
395 1 {
396 2 Address = 0x80 + X;
397 2 }
398 1 else
399 1 {
400 2 Address = 0xc0 + X;
401 2 }
402 1 LCDSendCommand(Address);
403 1 }
404 #endif
405
406
407 /********************************************************
408 * 函数说明:LCD字符串显示函数 *
409 ********************************************************/
410 #if LCD_EN_displayStr
411 void LCDdisplayStr(char *String)
412 {
413 1 while(*String)
414 1 {
415 2 LCDwriteData(*String);
416 2 String++;
417 2 }
418 1 }
419 #endif
420
421
422 /********************************************************
423 * 函数说明:指定XY坐标显示一个字符 *
424 * 输入参数:unsigned char X: X坐标 *
425 * unsigned cahr Y: Y坐标 *
426 * char ch: 被显示的字符 *
427 ********************************************************/
C51 COMPILER V6.23a LCD1602 10/25/2008 20:27:53 PAGE 8
428 #if LCD_EN_putChar
void LCDputChar(unsigned char X,unsigned char Y,char ch)
{
LCDsetXY(X,Y);
LCDwriteData((unsigned char)ch);
}
#endif
435
436
437
438 /************************************************************
439 * 从指定位置开始显示字符串,如果是从第一行开始显示的,但是
440 * 无法显示完,自动从第二行开始显示,如果还没有显示完,就将余下的
441 *抛弃;如果是从第二行开始显示的,但是无法显示完,
442 *就抛弃没有显示的内容.
443 **************************************************************/
444 #if LCD_EN_printf
void LCDprintf(unsigned char X,unsigned char Y,char *String)
{
if(Y==0)
{
if(X<16)
{
LCDsetXY(X,Y);
for(;X<16 && *String!='\0';X++)
{
LCDwriteData((unsigned char)*String);
String++;
}
if(*String!='\0')
{
X=0;
Y=1;
}
}
}
if(Y==1)
{
LCDsetXY(X,Y);
for(;X<16 && *String!='\0';X++)
{
LCDwriteData((unsigned char)*String);
String++;
}
}
}
#endif
475
476
477 /*************************************************
478 * 函数说明:清除指定的一行显示,然后光标回到行首 *
479 * 输入参数:bit line: 如果line=0,表示是第一行 *
480 * 如果line=1,表示是第二行 *
481 **************************************************/
482 #if LCD_EN_clearLine
483 void LCDclearLine(bit line)
484 {
485 1 unsigned char i;
486 1 if(line) //第二行
487 1 LCDsetXY(0,1);
488 1 else //第一行
489 1 LCDsetXY(0,0);
C51 COMPILER V6.23a LCD1602 10/25/2008 20:27:53 PAGE 9
490 1 for(i=0;i<16;i++)
491 1 LCDwriteData(' '); //向LCD写入16个空格
492 1 if(line) //回到第二行的第一个位置
493 1 LCDsetXY(0,1);
494 1 else //回到第一行的第一个位置
495 1 LCDsetXY(0,0);
496 1 }
497 #endif
498 //--------------------------------------------------
499 //不需要指定位置显示字符
500 #if LCD_EN_displayChar
501 void LCDdisplayChar(unsigned char ch)
502 {
503 1 LCDwriteData(ch);
504 1 }
505 #endif
506 //--------------------------------------------------
507 //延时nms函数
508 #if LCD_EN_delaynms
509 void delaynms(unsigned char n)
510 {
511 1 unsigned char i,j,k;
512 1 i=1;
513 1 #if Fosc>6
514 1 i=2;
515 1 #endif
516 1
517 1 for(;i>0;i--)
518 1 {
519 2 for(j=0;j<n;j++)
520 2 {
521 3 for(k=0;k<166;k++);
522 3 for(k=0;k<166;k++);
523 3 }
524 2 }
525 1 }
526 #endif
527
528 //将自定义字符写进CGRAM中
529 #if CustomCharCount
530 void LCDloadUserChar(unsigned char code * p)
531 {
532 1 unsigned char i,j;
533 1
534 1 for(i=0;i<CustomCharCount;i++)
535 1 {
536 2 for(j=0;j<8;j++)
537 2 {
538 3 LCDsetCGRAMAddress(8*i+j);
539 3 LCDwriteData(*p);
540 3 p++;
541 3 }
542 2 }
543 1 }
544 #endif
545
546
547 /********************************************
548 * 函数说明:LCD复位 *
549 *********************************************/
550 /*
551 1.延时15ms
C51 COMPILER V6.23a LCD1602 10/25/2008 20:27:53 PAGE 10
552 2.写入指令:0x38(不检测忙信号)
553 3.延时5ms
554 4.写入指令:0x38(不检测忙信号)
555 5.延时5ms
556 6.写入指令:0x38(不检测忙信号)
557 以后读写都要检测忙信号
558 7.如果定义8位数据接口设置8位数据线,两行显示,字体格式:5*8
559 (7).如果定义是4为数据接口设置8位数据线,两行显示,字体格式:5*8
560 8.设置显示画面、光标、光标是否闪烁开关
561 9.设置输入模式,默认增量方式,画面不动,光标移动
562 10.清屏
563 */
564 #if LCD_EN_reset
565 void LCDreset(void)
566 {
567 1 delaynms(15); //延时15ms
568 1 LCD_EN=0;
569 1 LCD_RS=0;//选择指令寄存器
570 1 NOP();
571 1 LCD_RW=0;//MCU向LCD写入命令数据
572 1 NOP();
573 1 #if LCD_DL>4
LCD_Data_Port=0x38;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCDsetFunction(1,1,1); //设置8位数据线,两行显示,字体格式:5*8
#else
592 1 LCD_Data_Port=LCD_Data_Port & 0x3f;
593 1 LCD_Data_Port=LCD_Data_Port | 0x30;
594 1 NOP();
595 1 LCD_EN=1;
596 1 NOP();
597 1 LCD_EN=0;
598 1 delaynms(5);
599 1
600 1 LCD_EN=1;
601 1 NOP();
602 1 LCD_EN=0;
603 1 delaynms(5);
604 1
605 1 LCD_EN=1;
606 1 NOP();
607 1 LCD_EN=0;
608 1 delaynms(5);
609 1 LCDsetFunction(0,1,1); //设置4位数据线,两行显示,字体格式:5*7
610 1 #endif
611 1
612 1 LCDsetDisplayModel(1,0,0);//设置显示画面、光标、光标是否闪烁开
613 1 LCDsetInputModel(1,0);//设置输入模式,默认增量方式,画面不动,光标向右边移动
C51 COMPILER V6.23a LCD1602 10/25/2008 20:27:53 PAGE 11
614 1 LCDclear();
615 1 #if CustomCharCount
616 1 LCDloadUserChar(CustomChar[0]);
617 1 #endif
618 1
619 1 }
620 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 570 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- 10
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -