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

📄 lcd1602.lst

📁 基于89S52的电子时钟
💻 LST
字号:
C51 COMPILER V7.06   LCD1602                                                               06/08/2006 23:56:17 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD1602.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          #include "main.h"
   3          sbit LCM_RW = P2^1 ;//定义引脚 
   4          sbit LCM_RS = P2^0 ;
   5          sbit  LCM_E  = P2^2 ;
   6          #define LCM_Data  P0 //定义液晶数据口
   7          #define Busy    0x80 //用于检测LCM状态字中的Busy标识 
   8          #include "1602.h"
   9          
  10          
  11          void WriteDataLCM(unsigned char WDLCM); 
  12          void WriteCommandLCM(unsigned char WCLCM,BuysC); 
  13          unsigned char ReadDataLCM(void); 
  14          unsigned char ReadStatusLCM(void); 
  15          void LCMInit(void); 
  16          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); 
  17          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); 
  18          void Delay5Ms(void); 
  19          void Delay400Ms(void); 
  20          
  21          //写数据 
  22          void WriteDataLCM(unsigned char WDLCM) 
  23          { 
  24   1       ReadStatusLCM(); //检测忙 
  25   1       LCM_Data = WDLCM; 
  26   1       LCM_RS = 1; 
  27   1       LCM_RW = 0; 
  28   1       LCM_E = 0; //若晶振速度太高可以在这后加小的延时 
  29   1       LCM_E = 0; //延时 
  30   1       LCM_E = 1; 
  31   1      } 
  32          
  33          //写指令 
  34          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测 
  35          { 
  36   1       if (BuysC) ReadStatusLCM(); //根据需要检测忙 
  37   1       LCM_Data = WCLCM; 
  38   1       LCM_RS = 0; 
  39   1       LCM_RW = 0;  
  40   1       LCM_E = 0; 
  41   1       LCM_E = 0; 
  42   1       LCM_E = 1;  
  43   1      } 
  44          
  45          //读数据 
  46          /*
  47          unsigned char ReadDataLCM(void) 
  48          { 
  49           LCM_RS = 1;  
  50           LCM_RW = 1; 
  51           LCM_E = 0; 
  52           LCM_E = 0; 
  53           LCM_E = 1; 
  54           return(LCM_Data); 
  55          } 
C51 COMPILER V7.06   LCD1602                                                               06/08/2006 23:56:17 PAGE 2   

  56          */
  57          //读状态 
  58          unsigned char ReadStatusLCM(void) 
  59          { 
  60   1       LCM_Data = 0xFF;  
  61   1       LCM_RS = 0; 
  62   1       LCM_RW = 1; 
  63   1       LCM_E = 0; 
  64   1       LCM_E = 0; 
  65   1       LCM_E = 1; 
  66   1       while (LCM_Data & Busy); //检测忙信号 
  67   1       return(LCM_Data); 
  68   1      } 
  69          
  70          void LCMInit(void) //LCM初始化 
  71          { 
  72   1       LCM_Data = 0; 
  73   1       WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 
  74   1       Delay5Ms();  
  75   1       WriteCommandLCM(0x38,0); 
  76   1       Delay5Ms();  
  77   1       WriteCommandLCM(0x38,0); 
  78   1       Delay5Ms();  
  79   1      
  80   1       WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 
  81   1       WriteCommandLCM(0x08,1); //关闭显示 
  82   1       WriteCommandLCM(0x01,1); //显示清屏 
  83   1       WriteCommandLCM(0x06,1); // 显示光标移动设置 
  84   1       WriteCommandLCM(0x0C,1); // 显示开及光标设置 
  85   1      } 
  86          
  87          //按指定位置显示一个字符 
  88          /*
  89          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) 
  90          { 
  91           Y &= 0x1; 
  92           X &= 0xF; //限制X不能大于15,Y不能大于1 
  93           if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; 
  94           X |= 0x80; // 算出指令码 
  95           WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码 
  96           WriteDataLCM(DData); 
  97          } */
  98          
  99          //按指定位置显示一串字符 
 100          /*
 101          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) 
 102          { 
 103           unsigned char ListLength; 
 104          
 105            ListLength = 0; 
 106           Y &= 0x1; 
 107           X &= 0xF; //限制X不能大于15,Y不能大于1 
 108           while (DData[ListLength]>0x20) //若到达字串尾则退出 
 109            { 
 110             if (X <= 0xF) //X坐标应小于0xF 
 111              { 
 112               DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 
 113               ListLength++; 
 114               X++; 
 115              } 
 116            } 
 117          } 
C51 COMPILER V7.06   LCD1602                                                               06/08/2006 23:56:17 PAGE 3   

 118          */
 119          //5ms延时 
 120          void Delay5Ms(void) 
 121          { 
 122   1       unsigned int TempCyc = 5552; 
 123   1       while(TempCyc--); 
 124   1      } 
 125          
 126          //400ms延时 
 127          /*
 128          void Delay400Ms(void) 
 129          { 
 130           unsigned char TempCycA = 5; 
 131           unsigned int TempCycB; 
 132           while(TempCycA--) 
 133           { 
 134            TempCycB=7269; 
 135            while(TempCycB--); 
 136           }; 
 137          } 
 138          */
 139          
 140          
 141          void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
 142          {
 143   1       WriteDataLCM(lcd_data);
 144   1      }
 145          
 146          void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD
 147          {
 148   1       unsigned char i=0;
 149   1       while(lcd_string[i]!=0x00)
 150   1        {
 151   2         WriteDataLCM(lcd_string[i]);
 152   2         i++;
 153   2        } 
 154   1      }
 155          
 156          
 157          
 158          
 159          
 160          
 161          /*
 162          如果上述代码不能初始化1602液晶,则尝试以下代码,我发现目前1602至少有两种驱动,以下代码基于SED1520驱动
 163          #include "main.h"
 164          #define LCD_DATA  P0        //LCD的数据口
 165          
 166          sbit LCD_BUSY=LCD_DATA^7;  //LCD忙信号位
 167          
 168          sbit LCD_RW=P1^2;          //LCD读写控制
 169          sbit LCD_RS=P1^3;          //LCD寄存器选择
 170          sbit LCD_EN=P1^1;          //LCD使能信号
 171          
 172          #include "1602.h"
 173          
 174          void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
 175          {
 176           while(1)
 177            {
 178             LCD_EN=0;
 179             LCD_RS=0;
C51 COMPILER V7.06   LCD1602                                                               06/08/2006 23:56:17 PAGE 4   

 180             LCD_RW=1;
 181             LCD_DATA=0xff;
 182             LCD_EN=1;
 183             if(!LCD_BUSY)break;
 184            }
 185           LCD_EN=0;
 186          }
 187          
 188          void LCD_cls(void)          //LCD清屏
 189          {
 190           ET2=0;
 191           LCD_check_busy();
 192           LCD_RS=0;
 193           LCD_RW=0;
 194           LCD_EN=1;
 195           LCD_DATA=1;
 196           LCD_EN=0;
 197           ET2=1;
 198          }
 199          
 200          void LCD_write_instruction(unsigned char LCD_instruction)   //写指令到LCD
 201          {
 202           ET2=0;
 203           LCD_check_busy();
 204           LCD_RS=0;
 205           LCD_RW=0;
 206           LCD_EN=1;
 207           LCD_DATA=LCD_instruction;
 208           LCD_EN=0;
 209           ET2=1;
 210          }
 211          
 212          void LCD_write_data(unsigned char LCD_data)      //输出一个字节数据到LCD
 213          {
 214           ET2=0;
 215           LCD_check_busy();
 216           LCD_RS=1;
 217           LCD_RW=0;
 218           LCD_EN=1;
 219           LCD_DATA=LCD_data;
 220           LCD_EN=0;
 221           ET2=1;
 222          }
 223           
 224          void LCD_set_position(unsigned char x)            //LCD光标定位到x处
 225          {
 226           LCD_write_instruction(0x80+x);
 227          }
 228          
 229          /*
 230          void LCD_go_home(void)                         //LCD光标归位
 231          {
 232           LCD_write_instruction(LCD_GO_HOME);
 233          }
 234          */
 235          /*
 236          void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
 237          {
 238           LCD_write_data(lcd_data);
 239          }
 240          
 241          void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD
C51 COMPILER V7.06   LCD1602                                                               06/08/2006 23:56:17 PAGE 5   

 242          {
 243           unsigned char i=0;
 244           while(lcd_string[i]!=0x00)
 245            {
 246             LCD_write_data(lcd_string[i]);
 247             i++;
 248            } 
 249          }
 250          
 251          void LCD_initial(void)                        //初始化LCD
 252          { 
 253          LCD_write_instruction(0x38);delayXms(100); 
 254          LCD_write_instruction(0x38);delayXms(100); 
 255          LCD_write_instruction(0x38);delayXms(100); 
 256          LCD_write_instruction(0x08);delayXms(100); 
 257          LCD_write_instruction(0x01);delayXms(100); 
 258          LCD_write_instruction(0x06);delayXms(100); 
 259          LCD_write_instruction(0x0c);delayXms(100); 
 260           //LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
 261           //LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
 262          
 263           LCD_cls();
 264          LCD_write_instruction(0x90);
 265           LCD_prints("our timer");
 266          }*/


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