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

📄 1602.lst

📁 用AT89S51单片机控制的1602液晶屏程序
💻 LST
字号:
C51 COMPILER V7.06   1602                                                                  08/14/2008 10:10:41 PAGE 1   


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

stmt level    source

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

  56          {
  57   1       ReadStatusLCM(); //检测忙
  58   1       LCM_RS = 1;
  59   1       LCM_RW = 0;
  60   1       LCM_E = 0;     //若晶振速度太高可以在这后加小的延时
  61   1       LCM_E = 0;     //延时
  62   1       LCM_Data = WDLCM;
  63   1       LCM_E = 1;
  64   1       delay();       
  65   1       LCM_E = 0;       
  66   1      }
  67          
  68          //写指令
  69          void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测
  70          {
  71   1       if (BuysC) ReadStatusLCM(); //根据需要检测忙
  72   1       LCM_RS = 0;
  73   1       LCM_RW = 0; 
  74   1       LCM_E = 0;
  75   1       LCM_E = 0;
  76   1       LCM_Data = WCLCM;
  77   1       LCM_E = 1;
  78   1       delay();
  79   1       LCM_E = 0; 
  80   1      }
  81          
  82          //读数据
  83          uchar ReadDataLCM(void)
  84          {
  85   1       uchar DATA;
  86   1       LCM_RS = 1; 
  87   1       LCM_RW = 1;
  88   1       LCM_E = 0;
  89   1       LCM_E = 0;
  90   1       LCM_E = 1;
  91   1       DATA = LCM_Data;
  92   1       delay();
  93   1       LCM_E = 0;
  94   1       return(DATA);
  95   1      }
  96          
  97          //读状态
  98          uchar ReadStatusLCM(void)
  99          {
 100   1       LCM_Data = 0xFF; 
 101   1       LCM_RS = 0;
 102   1       LCM_RW = 1;
 103   1       LCM_E = 0;
 104   1       LCM_E = 1;
 105   1       while (LCM_Data & Busy); //检测忙信号
 106   1       LCM_E = 0;
 107   1       return(LCM_Data);
 108   1      }
 109          
 110          void LCMInit(void) //LCM初始化
 111          {
 112   1       LCM_Data = 0;
 113   1       WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 114   1       Delay5Ms(); 
 115   1       WriteCommandLCM(0x38,0);
 116   1       Delay5Ms(); 
 117   1       WriteCommandLCM(0x38,0);
C51 COMPILER V7.06   1602                                                                  08/14/2008 10:10:41 PAGE 3   

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

 180   1       unsigned int TempCycB;
 181   1       while(TempCycA--)
 182   1       {
 183   2        TempCycB=7269;
 184   2        while(TempCycB--);
 185   2       };
 186   1      }
 187          


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