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

📄 lcd1602func.lst

📁 液晶显示的完整程序
💻 LST
字号:
C51 COMPILER V8.08   LCD1602FUNC                                                           06/02/2007 17:59:29 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE LCD1602FUNC
OBJECT MODULE PLACED IN lcd1602func.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd1602func.c DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************
   2          **函数功能:LCD的驱动函数                                                                                 **
   3          **创建人:xingyuegu                                                                                               **
   4          **创建日期:2006-7-12                                                                                     **
   5          **版本:1.0                                                                                                               **
   6          **修改日期:2006-10-30                                                                                    **
   7          **版本:2.0                                                                                                               **
   8           1602液晶仿真的一些发现
   9          
  10          
  11          看了JJJ的例子:字符液晶1602仿真测试
  12          按自己习惯也写了个,发现些问题
  13          一、
  14          JJJ说仿真时要屏蔽掉检查LCD忙的代码,否则会死循环
  15          while(DBPort&0x80);    //这句要屏蔽
  16          
  17          我写的程序总是无法正确仿真,因为不检查LCD忙,就不能保证LCD已经空闲
  18          查资料LCD清屏命令要1.64ms才完成,一般命令也要40us,最后加上足够的延时后才仿真通过
  19          
  20          后来又试了下其它LCD资料上的例程,仿真发现检查LCD忙标志也不会死循环
  21          分析了下,区别是:它不是一直在使能的情况下读忙信号,而是每次都有EN=0,再EN=1重新读取忙标志
  22          我还没做好实际实验电路板,没试过实际电路
  23          根据JJJ的描述和我的仿真实验,我猜仿真和实际硬件的区别是:
  24          实际硬件在EN=1的情况下,LCD执行完指令会更新LCD忙标志为0;
  25          而仿真需要EN=0,EN=1来重新读取忙信号,否则就不会更新,而一直以为是忙
  26          
  27          在JJJ的LCD1602.h加了几句,变成
  28          while(DBPort&0x80)
  29              {    LcdEn=0;        _nop_();
  30                   LcdEn=1;        _nop_();
  31              }
  32          仿真就可以检查忙标志了
  33          
  34          自己的代码也做相应改动,都可以成功检查忙标志,也无需多加延时了
  35          
  36          *******************************************************************/
  37          
  38          #include <lcd1602.h>
  39          #include <reg52.h>
  40          
  41          sbit LcdRs =P2^0;
  42          sbit LcdRw =P2^1;
  43          sbit LcdEn =P2^2;
  44          sfr DBPort =0x80;
  45          
  46          /*************************************************************
  47          **功能:延时1.64ms                                                                                      **
  48          **参数:无                                                                                                      **
  49          *************************************************************/
  50          
  51          void delay1_64ms(void)
  52          {
  53   1              uchar i;
  54   1              for(i = 0;i < 250;i++)
  55   1              {
C51 COMPILER V8.08   LCD1602FUNC                                                           06/02/2007 17:59:29 PAGE 2   

  56   2                      _nop_();
  57   2                      _nop_();
  58   2                      _nop_();
  59   2                      _nop_();
  60   2              }
  61   1      }
  62          /*************************************************************
  63          **功能:延时40us                                                                                        **
  64          **参数:无                                                                                                      **
  65          *************************************************************/
  66          
  67          void delay40us(void)
  68          {
  69   1              uchar i;
  70   1              for(i = 0;i < 20;i++)
  71   1              {
  72   2                      ;
  73   2              }
  74   1      }
  75          /*************************************************************
  76          **功能:判断LCD忙                                                                                       **
  77          **参数:无                                                                                              **
  78          *************************************************************/
  79          
  80          unsigned char Lcd_Wait(void)
  81          {
  82   1              
  83   1              while(1)
  84   1              {
  85   2              DBPort=0xff;
  86   2              LcdEn=0;
  87   2              _nop_();
  88   2              LcdRs=0;
  89   2              _nop_();
  90   2              _nop_();
  91   2              LcdRw=1;
  92   2              _nop_();
  93   2              _nop_();
  94   2              LcdEn=1;
  95   2              _nop_();
  96   2              _nop_();
  97   2              
  98   2              _nop_();
  99   2              _nop_();
 100   2              if((DBPort&0x80)==0)
 101   2              {
 102   3                      break;
 103   3                      
 104   3              }
 105   2              LcdEn=0;
 106   2              }
 107   1              //delay40us();
 108   1              return DBPort;
 109   1      }
 110          /**************************************************************
 111          **功能:写LCD函数                                                                                        **
 112          **参数:style为写命令/数据,0-命令,1-数据;input为写入的8位 **
 113          **              命令/数据                                                                                        **
 114          **************************************************************/
 115          
 116          
 117          void Lcd_Write(bit style,unsigned char input)
C51 COMPILER V8.08   LCD1602FUNC                                                           06/02/2007 17:59:29 PAGE 3   

 118          {
 119   1              LcdEn=0;
 120   1              _nop_();
 121   1              _nop_();
 122   1              LcdRs=style;
 123   1              _nop_();
 124   1              _nop_();
 125   1              LcdRw=0;
 126   1              DBPort=input;
 127   1              _nop_();
 128   1              _nop_();
 129   1              LcdEn=1;
 130   1              _nop_();
 131   1              _nop_(); 
 132   1              LcdEn=0;
 133   1              _nop_();
 134   1              Lcd_Wait();
 135   1              
 136   1      }
 137          /****************************************************************
 138          **功能:LCD清屏函数                                                                                    **
 139          **参数:无                                                                                             **
 140          ****************************************************************/
 141          void ClrScreen(void)
 142          {       
 143   1              Lcd_Write(Lcd_Command,Lcd_Clear_Screen);
 144   1              delay1_64ms();
 145   1      }
 146          
 147          /****************************************************************
 148          **功能:LCD归位函数                                                                                    **
 149          **参数:无                                                                                             **
 150          ****************************************************************/
 151          void Screen_home(void)
 152          {
 153   1              
 154   1              Lcd_Write(Lcd_Command,Lcd_Home);
 155   1              delay1_64ms();
 156   1      
 157   1      }
 158          /***************************************************************
 159          **功能:设置显示模式                                                                              **
 160          **参数:                                                                                                          **
 161          ***************************************************************/
 162          
 163          void  Lcd_SetDisplay(unsigned char DisplayMode)
 164          {
 165   1              Lcd_Write(Lcd_Command,0x08|DisplayMode);
 166   1      
 167   1      }
 168          /***************************************************************
 169          **功能:LCD移动设置                                                                                       **
 170          **参数:取值如下                                                                                          **
 171          ***************************************************************/
 172          
 173          
 174          void Lcd_Move(unsigned char MoveMode)
 175          {
 176   1              Lcd_Write(Lcd_Command,0x10|MoveMode);
 177   1      
 178   1      }
 179          
C51 COMPILER V8.08   LCD1602FUNC                                                           06/02/2007 17:59:29 PAGE 4   

 180          /****************************************************************
 181          **功能:LCD输入设置                                                                                        **
 182          **参数:取值如下                                                                                           **
 183          ****************************************************************/
 184          //
 185          void Lcd_SetInput(unsigned char InputMode)
 186          {
 187   1              Lcd_Write(Lcd_Command,0x04|InputMode);
 188   1      
 189   1      }
 190          /****************************************************************
 191          **功能:LCD初始化                                                                                      **
 192          **参数:取值如下                                                                                           **
 193          ****************************************************************/
 194          void Lcd_Init(void)
 195          {
 196   1              delay1_64ms();
 197   1              Lcd_Write(Lcd_Command,0x38);           //8位数据端口,2行显示,5*7点阵
 198   1              
 199   1              Lcd_Write(Lcd_Command,0x38);
 200   1              Lcd_Write(Lcd_Command,0x38);
 201   1              Lcd_SetDisplay(Lcd_Display_On);    //开启显示, 无光标    |Lcd_Cursor|Lcd_Flash
 202   1              //Lcd_Move(Lcd_CursorMove|Lcd_Left);
 203   1                                                                                                       
 204   1              Lcd_SetInput(Lcd_Ac_Up|Lcd_No_Move);       //AC递增, 画面不动_To        
 205   1      
 206   1              
 207   1      }
 208          
 209          /****************************************************************
 210          **功能:显示位置设置                                                                               **
 211          **参数:x-行;y-列                                                                                         **
 212          ****************************************************************/
 213          void GotoXY(unsigned char x,unsigned char y)
 214          {
 215   1              if(y==0)
 216   1                      {Lcd_Write(Lcd_Command,0x80|x);
 217   2                      }
 218   1              if(y==1)
 219   1                      {Lcd_Write(Lcd_Command,0x80|(x+0x40));
 220   2                       }
 221   1                                                                       
 222   1      }
 223          
 224          /****************************************************************
 225          **功能:LCD显示函数                                                                                        **
 226          **参数:str-要显示的字符串指针                                                             **
 227          ****************************************************************/
 228          void Print(unsigned char *str)
 229          {       
 230   1              while(*str!='\0')
 231   1              {
 232   2      
 233   2                      Lcd_Write(Lcd_Data,*str);
 234   2      
 235   2                      str++;
 236   2      
 237   2              }
 238   1      }
 239          
 240          void print_char(uchar a)
 241          {
C51 COMPILER V8.08   LCD1602FUNC                                                           06/02/2007 17:59:29 PAGE 5   

 242   1              Lcd_Write(Lcd_Data,a);
 243   1              //Lcd_Wait();
 244   1      }               
 245          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    217    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       1
   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 + -