lcd demo.lst

来自「基于89s51的OLCM1602测试程序」· LST 代码 · 共 224 行

LST
224
字号
C51 COMPILER V7.50   LCD_DEMO                                                              04/13/2003 17:04:22 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LCD_DEMO
OBJECT MODULE PLACED IN lcd demo.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd demo.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*============================================================
   2                  使用1602液晶显示的实验例子     明浩  2004/2/27
   3          ==============================================================
   4          
   5          
   6          SMC1602A(16*2)模拟口线接线方式
   7          连接线图: 
   8                 ---------------------------------------------------
   9                 |LCM-----51   | LCM-----51   | LCM------51      |
  10                 --------------------------------------------------|
  11                 |DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0    |
  12                 |DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1    |
  13                 |DB2-----P1.2 | DB6-----P1.6 | E--------P2.2    |
  14                 |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
  15                 ---------------------------------------------------
  16          
  17          
  18          
  19          
  20          [注:AT89S51使用12M晶振]
  21          =============================================================*/
  22          
  23          
  24          #define LCM_RW  P1_1 //定义引脚
  25          #define LCM_RS  P1_0
  26          #define LCM_E   P1_2
  27          #define LCM_Data  P3
  28          #define Busy    0x80 //用于检测LCM状态字中的Busy标识
  29          
  30          
  31          #include <regx52.h>
  32          
  33          
  34          void WriteDataLCM(unsigned char WDLCM);
  35          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  36          unsigned char ReadDataLCM(void);
  37          unsigned char ReadStatusLCM(void);
  38          void LCMInit(void);
  39          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  40          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  41          void Delay5Ms(void);
  42          void Delay400Ms(void);
  43          
  44          
  45          unsigned char code cdle_net[] = {"www.cdle.net"};
  46          unsigned char code email[] = {"pnzwzw@cdle.net"};
  47          
  48          
  49          void main(void)
  50          {
  51   1       P1=0xff;
  52   1       P3=0xff;
  53   1       Delay400Ms(); //启动等待,等LCM讲入工作状态
  54   1       LCMInit(); //LCM初始化
  55   1       Delay5Ms(); //延时片刻(可不要)
C51 COMPILER V7.50   LCD_DEMO                                                              04/13/2003 17:04:22 PAGE 2   

  56   1      
  57   1      
  58   1       DisplayListChar(0, 0, cdle_net);
  59   1       DisplayListChar(0, 1, email);
  60   1       ReadDataLCM();//测试用句无意义
  61   1       while(1);
  62   1      }
  63          
  64          
  65          //写数据
  66          void WriteDataLCM(unsigned char WDLCM)
  67          {
  68   1       ReadStatusLCM(); //检测忙
  69   1       LCM_Data = WDLCM;
  70   1       LCM_RS = 1;
  71   1       LCM_RW = 0;
  72   1       LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  73   1       LCM_E = 0;
  74   1       LCM_E = 0; //延时
  75   1       LCM_E = 1;
  76   1       LCM_E = 1;
  77   1       LCM_E = 0;
  78   1      }
  79          
  80          
  81          //写指令
  82          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  83          {
  84   1       if (BuysC) ReadStatusLCM(); //根据需要检测忙
  85   1       LCM_Data = WCLCM;
  86   1       LCM_RS = 0;
  87   1       LCM_RW = 0; 
  88   1       LCM_E = 0;
  89   1       LCM_E = 0;
  90   1       LCM_E = 1;
  91   1       LCM_E = 1;
  92   1       LCM_E = 0; 
  93   1      }
  94          
  95          
  96          //读数据
  97          unsigned char ReadDataLCM(void)
  98          {
  99   1       LCM_RS = 1; 
 100   1       LCM_RW = 1;
 101   1       LCM_E = 0;
 102   1       LCM_E = 0;
 103   1       LCM_E = 1;
 104   1       return(LCM_Data);
 105   1      }
 106          
 107          
 108          //读状态
 109          unsigned char ReadStatusLCM(void)
 110          {
 111   1       LCM_Data = 0xFF; 
 112   1       LCM_RS = 0;
 113   1       LCM_RW = 1;
 114   1       LCM_E = 0;
 115   1       LCM_E = 0;
 116   1       LCM_E = 1;
 117   1      
C51 COMPILER V7.50   LCD_DEMO                                                              04/13/2003 17:04:22 PAGE 3   

 118   1       while (LCM_Data & Busy); //检测忙信号
 119   1       //Delay5Ms();
 120   1       return(LCM_Data);
 121   1      }
 122          
 123          
 124          void LCMInit(void) //LCM初始化
 125          {
 126   1       LCM_Data = 0;
 127   1       WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 128   1       Delay5Ms(); 
 129   1       WriteCommandLCM(0x38,0);
 130   1       Delay5Ms(); 
 131   1       WriteCommandLCM(0x38,0);
 132   1       Delay5Ms(); 
 133   1      
 134   1      
 135   1       WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 136   1       WriteCommandLCM(0x08,1); //关闭显示
 137   1       WriteCommandLCM(0x01,1); //显示清屏
 138   1       WriteCommandLCM(0x06,1); // 显示光标移动设置
 139   1       WriteCommandLCM(0x0f,1); // 显示开及光标设置
 140   1      }
 141          
 142          
 143          //按指定位置显示一个字符
 144          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 145          {
 146   1       Y &= 0x1;
 147   1       X &= 0xF; //限制X不能大于15,Y不能大于1
 148   1       if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 149   1       X |= 0x80; //算出指令码
 150   1       WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 151   1       WriteDataLCM(DData);
 152   1      }
 153          
 154          
 155          //按指定位置显示一串字符
 156          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 157          {
 158   1       unsigned char ListLength;
 159   1      
 160   1      
 161   1        ListLength = 0;
 162   1       Y &= 0x1;
 163   1       X &= 0xF; //限制X不能大于15,Y不能大于1
 164   1       while (DData[ListLength]>0x20) //若到达字串尾则退出
 165   1        {
 166   2         if (X <= 0xF) //X坐标应小于0xF
 167   2          {
 168   3           DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 169   3           ListLength++;
 170   3           X++;
 171   3          }
 172   2        }
 173   1      }
 174          
 175          
 176          //5ms延时
 177          void Delay5Ms(void)
 178          {
 179   1       unsigned int TempCyc = 5552;
C51 COMPILER V7.50   LCD_DEMO                                                              04/13/2003 17:04:22 PAGE 4   

 180   1       while(TempCyc--);
 181   1      }
 182          
 183          
 184          //400ms延时
 185          void Delay400Ms(void)
 186          {
 187   1       unsigned char TempCycA = 5;
 188   1       unsigned int TempCycB;
 189   1       while(TempCycA--)
 190   1       {
 191   2        TempCycB=7269;
 192   2        while(TempCycB--);
 193   2       };
 194   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    328    ----
   CONSTANT SIZE    =     29    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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