⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.lst

📁 12887+1602drive goode luck!!
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -