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

📄 lcd1602.lst

📁 该程序是基于c8051f020的平台
💻 LST
字号:
C51 COMPILER V8.02   LCD1602                                                               06/29/2007 20:03:16 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN Lcd1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Lcd1602.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <c8051f020.h>
   2          #include "lcd1602.h"
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          
   6          
   7          //-----------------------------------------------------------------------------
   8          // Adress Set
   9          //-----------------------------------------------------------------------------
  10          #define Data_Port P5      // P5作为数据通信口
  11          #define Contro_Port P4    // P4作为控制端口时,只取0-2,P4.0-RS  P4.1-R/W  P4.2-E
  12          
  13          
  14          //-----------------------------------------------------------------------------
  15          // Mode Set
  16          //-----------------------------------------------------------------------------
  17          
  18          
  19          uchar column=1,row=1; 
  20          
  21          //-----------------------------------------------------------------------------
  22          // Function PROTOTYPES
  23          //-----------------------------------------------------------------------------
  24          //void Dis_decode_data(uint decode_data );
  25          
  26          void Lcd1602_Ini(void);
  27          void Lcd1602_Check_Busy(void);
  28          
  29          void Lcd1602_Write_Command(unsigned char Command_Code) reentrant;  //  为了解决可重入函数,需加上reentrant
  30          void Lcd1602_Write_Data(unsigned char Data) reentrant ;
  31          void Lcd1602_Write_char(unsigned char i);
  32          void Lcd1602_Write_String(unsigned char row,unsigned char column,unsigned char *dis_buffer)reentrant;
  33          
  34          //void Lcd1602_Clear_Char(unsigned char row,unsigned char column);
  35          void Lcd1602_Clear_Line(unsigned char line);
  36          //void Lcd1602_Clear_All(void);
  37          
  38          void delay1(uchar t1,t2);
  39          
  40          
  41          void Lcd1602_Ini(void)
  42          { 
  43   1         
  44   1         Lcd1602_Write_Command(0x38);
  45   1         Lcd1602_Write_Command(0x0c);//开显示,不显示光标
  46   1         Lcd1602_Write_Command(0x01);//显示清屏。
  47   1         Lcd1602_Write_Command(0x06);//显示光标自动右移,整屏不移动。
  48   1         Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
  49   1         Lcd1602_Write_Command(0x02);
  50   1         Lcd1602_Write_Command(0x0c);//开显示,不显示光标
  51   1         Lcd1602_Write_Command(0x80);
  52   1      }    
  53          
  54          //===========================
  55          //LCD状态检测                  该函数有改动?????
C51 COMPILER V8.02   LCD1602                                                               06/29/2007 20:03:16 PAGE 2   

  56          //===========================
  57          void Lcd1602_Check_Busy(void)
  58          {
  59   1          unsigned char bf,temp;
  60   1      
  61   1          Contro_Port=0x02;                       //RS=0,RW=1
  62   1          delay1(1,10);
  63   1      
  64   1          temp=Data_Port;                       // 是否要打开LCD使能信号E????
  65   1          bf = temp&0x80 ;               //筛选最高位的标志位
  66   1      
  67   1          while(bf==1);
  68   1      }
  69          
  70          
  71          //*********************************************
  72          //以下几个函数为支持LCD数据传送和控制的底层函数
  73          //*********************************************
  74          
  75          //===========================
  76          //写一个命令字节
  77          //===========================
  78          void Lcd1602_Write_Command(unsigned char Command_Code)  reentrant  //  为了解决可重入函数,需加上reentrant
  79          {
  80   1      
  81   1          Lcd1602_Check_Busy();
  82   1      
  83   1          Contro_Port=0x00;                       //RS=0,RW=0
  84   1          Data_Port=Command_Code;
  85   1      
  86   1          delay1(10,10);
  87   1          Contro_Port |=0x04;                    //EN=1   把Contro_Port.2 置1
  88   1          delay1(10,10);                 // 延时产生一个脉冲
  89   1          Contro_Port &=~0x04;                  //EN=0    把Contro_Port.2 置0
  90   1          Contro_Port =0xef;
  91   1      }
  92          
  93          
  94          //===========================
  95          //写一个字节数据                  该函数中 Contro_Port |=0x04; 有改动?????
  96          //===========================
  97          void Lcd1602_Write_Data(unsigned char Data) reentrant
  98          {
  99   1      
 100   1          Lcd1602_Check_Busy();
 101   1      
 102   1          Contro_Port=0x01;                     //RS=1,RW=0
 103   1          Data_Port=Data;
 104   1              
 105   1          delay1(10,10);
 106   1          Contro_Port |=0x04;                    //EN=1   把Contro_Port.2 置1
 107   1          delay1(10,10);                 // 延时产生一个脉冲
 108   1          Contro_Port &=~0x04;                  //EN=0    把Contro_Port.2 置0
 109   1          Contro_Port =0xef;
 110   1      }
 111          
 112          
 113          
 114          //===========================================
 115          //写字符串到LCD,如果一行写不下,则写到下一行,
 116          //如果一屏写不下,则只写一屏
 117          //row的值从1-2,column的值从1-16,不进行值的
C51 COMPILER V8.02   LCD1602                                                               06/29/2007 20:03:16 PAGE 3   

 118          //有效性检查,有调用者自己保证
 119          //===========================================
 120          
 121          void Lcd1602_Write_String(unsigned char row_str,unsigned char column_str,unsigned char *dis_buffer)  reent
             -rant
 122          {   
 123   1          unsigned char i=0;
 124   1          row=row_str; column=column_str;
 125   1      
 126   1              switch(row)//这种结构保持以后升级到多行显示液晶
 127   1              {
 128   2                  case 1:Lcd1602_Write_Command(0x80+column-1);break;      //将数据地址指针定位到第一行
 129   2                  case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //将数据地址指针定位到第二行
 130   2                  default: break;
 131   2              }
 132   1          while(dis_buffer[i]!='\0')
 133   1              {
 134   2                  Lcd1602_Write_Data(dis_buffer[i]);
 135   2                  i++;
 136   2                  if(++column==17)
 137   2                  {                
 138   3                      column=1;
 139   3                      if(++row==3)
 140   3                       return;
 141   3                      else
 142   3                      {
 143   4                    switch(row)//这种结构保持以后升级到多行显示液晶
 144   4                        {
 145   5                          case 1:Lcd1602_Write_Command(0x80);break;
 146   5                          case 2:Lcd1602_Write_Command(0x80+0x40);break;//重新调整数据地址指针
 147   5                          default:break;
 148   5                        }
 149   4                      }
 150   3                  }
 151   2              } 
 152   1      }
 153          
 154          
 155          
 156          
 157          
 158          
 159          
 160          
 161          
 162          void Lcd1602_Write_char(unsigned char i)
 163          {
 164   1         
 165   1        if(i==0)return;
 166   1        switch(row)                                            //这种结构保持以后升级到多行显示液晶
 167   1            {
 168   2             case 1:Lcd1602_Write_Command(0x80+column-1);break;      //将数据地址指针定位到第一行
 169   2             case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //将数据地址指针定位到第二行
 170   2             default:break;
 171   2            }
 172   1      
 173   1        Lcd1602_Write_Data(i);
 174   1      
 175   1        if(++column==17)
 176   1         {            
 177   2          column=1;
 178   2          if(++row==3)
C51 COMPILER V8.02   LCD1602                                                               06/29/2007 20:03:16 PAGE 4   

 179   2          row=1;
 180   2        }
 181   1      }
 182          
 183          
 184          
 185          
 186          void delay1(uchar t1,t2)
 187          { 
 188   1        uchar i,j;
 189   1        for(i=0;i<t1;i++)
 190   1          for(j=0;j<t2;j++);
 191   1      
 192   1          }
 193          
 194          //==========================================
 195          //清除指定的行,光标返回最左边第一个字符位置
 196          //==========================================
 197          void Lcd1602_Clear_Line(unsigned char line)
 198          {
 199   1          Lcd1602_Write_String(line,1,"                ");
 200   1      
 201   1          switch(line)// 将数据地址指针返回到起始位置    这种结构保持以后升级到多行显示液晶
 202   1              {
 203   2          case 1:Lcd1602_Write_Command(0x80);break;       //将数据地址指针定位到第一行
 204   2          case 2:Lcd1602_Write_Command(0x80+0x40);break;  //将数据地址指针定位到第二行
 205   2          default: break;
 206   2              }    
 207   1      }   
 208          /*
 209          void Dis_decode_data(uint decode_data )
 210          {      
 211                 uchar k[5],i;
 212          
 213                   k[0]=(uchar)(decode_data/10000);
 214                   k[1]=(uchar)((decode_data-k[0]*10000)/1000);
 215                   k[2]=(uchar)((decode_data-k[0]*10000-k[1]*1000)/100);
 216                   k[3]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)/10);
 217                   k[4]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)-k[3]*10/1);
 218          
 219                 for(i=0;i<5;i++)
 220                    { Lcd1602_Write_char(k[i]+'0');} 
 221          }    */
 222          
 223          /*
 224          void Lcd1602_Clear_All(void)
 225          {
 226             Lcd1602_Write_Command(0x01);//显示清屏。
 227             Lcd1602_Write_Command(0x80);//将数据指针设置到第一行的第一个字符。
 228          }
 229          
 230          
 231          //==================================================
 232          //清除指定的位置的字符,光标返回最左边第一个字符位置
 233          //==================================================
 234          void Lcd1602_Clear_Char(unsigned char row,unsigned char column)
 235          {
 236              Lcd1602_Write_String(row,column,"");
 237          }    */


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.02   LCD1602                                                               06/29/2007 20:03:16 PAGE 5   

   CODE SIZE        =    393    ----
   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -