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

📄 lcm1602.lst

📁 温度jyt7it软问题个人托人Greg尔过热
💻 LST
字号:
C51 COMPILER V8.02   LCM1602                                                               05/15/2009 20:51:21 PAGE 1   


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

line level    source

   1          #include <reg52.h>
   2          
   3          /*
   4          定义Lcm1602的接线方式
   5          RS:             P2.0
   6          RW:             P2.1
   7          E:              P2.2
   8          D0:             P0.0
   9          D1:             P0.1
  10          D2:             P0.2
  11          D3:             P0.3
  12          D4:             P0.4
  13          D5:             P0.5
  14          D6:             P0.6
  15          D7:             P0.7
  16          */
  17          
  18          sbit LCM1602RS  = P2^0;  
  19          sbit LCM1602RW  = P2^1;  
  20          sbit LCM1602E   = P2^2;  
  21                                             
  22          /*定义1602的数据模式*/
  23          #define LCM1602_8BIT_MODE
  24          
  25          /*在lpc2106下移植成功*/
  26          /*1602 IO定义*/
  27          //1602 RS脚 PA12
  28          #define LCM1602_PIN_RS                  (0)
  29          //1602 RW脚 PA13
  30          #define LCM1602_PIN_RW                  (1)
  31          //1602 E脚  PA14
  32          #define LCM1602_PIN_E                   (2)
  33          //1602 D0
  34          #define LCM1602_PIN_D0                  (0)
  35          //1602 D1
  36          #define LCM1602_PIN_D1                  (1)
  37          //1602 D2
  38          #define LCM1602_PIN_D2                  (2)
  39          //1602 D3
  40          #define LCM1602_PIN_D3                  (3)
  41          //1602 D4
  42          #define LCM1602_PIN_D4                  (4)
  43          //1602 D5
  44          #define LCM1602_PIN_D5                  (5)
  45          //1602 D6
  46          #define LCM1602_PIN_D6                  (6)
  47          //1602 D7
  48          #define LCM1602_PIN_D7                  (7)
  49          
  50          /*设置RS为输出*/
  51          #define LCM1602_RS_OUT                  
  52          /*设置RS低*/
  53          #define LCM1602_RS_LOW                  (LCM1602RS = 0)
  54          /*设置RS高*/
  55          #define LCM1602_RS_HIGH                 (LCM1602RS = 1)
C51 COMPILER V8.02   LCM1602                                                               05/15/2009 20:51:21 PAGE 2   

  56          /*设置RW为输出*/
  57          #define LCM1602_RW_OUT                  
  58          /*设置RW低*/
  59          #define LCM1602_RW_LOW                  (LCM1602RW = 0)
  60          /*设置RW高*/
  61          #define LCM1602_RW_HIGH                 (LCM1602RW = 1)
  62          /*设置E为输出*/
  63          #define LCM1602_E_OUT                   
  64          /*设置E低*/
  65          #define LCM1602_E_LOW                   (LCM1602E = 0)
  66          /*设置E高*/
  67          #define LCM1602_E_HIGH                  (LCM1602E = 1)
  68          
  69          //8Bit模式操作
  70          #ifdef LCM1602_8BIT_MODE
  71          //设置DATA为输出
  72          #define LCM1602_DATA_OUT                
  73          //设置DATA为输入
  74          #define LCM1602_DATA_IN                 
  75          //获得DATA
  76          #define LCM1602_GET_DATA                (P1)
  77          //清除数据
  78          #define LCM1602_CLEAR_DATA              (LCM1602_GET_DATA = 0x00)
  79          //设置DATA
  80          #define LCM1602_SET_DATA(x)             (LCM1602_GET_DATA = (x))
  81          #endif
  82          
  83          //4Bit模式操作
  84          #ifdef LCM1602_4BIT_MODE
              #endif
  86          
  87          /***********************LCD1602地址相关******************************/
  88          // 第一行DDRAM起始地址 
  89          #define LCM1602_LINE1_ADDR              (0x80 + 0x00)
  90          // 第二行DDRAM起始地址
  91          #define LCM1602_LINE2_ADDR              (0x80 + 0x40)
  92          // 第一行
  93          #define LCM1602_LINE1                   (0)
  94          // 第二行
  95          #define LCM1602_LINE2                   (1)
  96          // 每行的最大字符长度
  97          #define LCM1602_LINE_LENGTH             (16)
  98          //用于检测LCM状态字中的Busy标识
  99          #define LCM1602_BUSY                    (1 << 7)
 100          //显示清屏。数据指针清零;所有显示清零
 101          //#define LCM1602_              (0x01)
 102          //显示回车。数据指针清零
 103          //#define LCM1602_              (0x02)
 104          
 105          /*设置Lcm1602 RS脚状态,0设置低电平;非0设置高电平*/
 106          static void Lcm1602Rs(unsigned char uchStatus);
 107          /*设置Lcm1602 RW脚状态,0设置低电平;非0设置高电平*/
 108          static void Lcm1602Rw(unsigned char uchStatus);
 109          /*设置Lcm1602 E脚状态,0设置低电平;非0设置高电平*/
 110          static void Lcm1602E(unsigned char uchStatus);
 111          /*获得Lcm1602返回的数据*/
 112          static unsigned int Lcm1602GetData(void);
 113          /*向Lcm1602发送数据*/
 114          static void Lcm1602SetData(unsigned char uchData);
 115          /*检查Lcm1602是否读写使能*/
 116          static unsigned char Lcm1602CheckBusy(void);
 117          /*向Lcm1602发送指令*/
C51 COMPILER V8.02   LCM1602                                                               05/15/2009 20:51:21 PAGE 3   

 118          static void Lcm1602Command(unsigned char uchInstruction, unsigned char uchBusy);
 119          /*向Lcm1602发送数据*/
 120          static void Lcm1602Data(unsigned char uchData);
 121          
 122          extern void delay_ms(unsigned int uiTime);
 123          
 124          /*设置1602 RS脚状态*/
 125          void Lcm1602Rs(unsigned char uchStatus)
 126          {
 127   1              if (0 == uchStatus)
 128   1              {
 129   2                      LCM1602_RS_LOW;
 130   2              }
 131   1              else
 132   1              {
 133   2                      LCM1602_RS_HIGH;
 134   2              }
 135   1      }
 136          
 137          /*设置1602 RW脚状态*/
 138          void Lcm1602Rw(unsigned char uchStatus)
 139          {
 140   1              if (0 == uchStatus)
 141   1              {
 142   2                      LCM1602_RW_LOW;
 143   2              }
 144   1              else
 145   1              {
 146   2                      LCM1602_RW_HIGH;
 147   2              }
 148   1      }
 149          
 150          /*设置1602 E脚状态*/
 151          void Lcm1602E(unsigned char uchStatus)
 152          {
 153   1              if (0 == uchStatus)
 154   1              {
 155   2                      LCM1602_E_LOW;
 156   2              }
 157   1              else
 158   1              {
 159   2                      LCM1602_E_HIGH;
 160   2              }
 161   1      }
 162          
 163          /*获得1602数据*/
 164          unsigned int Lcm1602GetData(void)
 165          {
 166   1              unsigned int uiData;
 167   1              LCM1602_DATA_IN;
 168   1              uiData = LCM1602_GET_DATA;
 169   1              return uiData;
 170   1      }
 171          
 172          /*将数据写到1602*/
 173          void Lcm1602SetData(unsigned char uchData)
 174          {
 175   1              /*将IO设置为输出*/
 176   1              LCM1602_DATA_OUT;
 177   1              LCM1602_CLEAR_DATA;
 178   1              LCM1602_SET_DATA(uchData);
 179   1      }
C51 COMPILER V8.02   LCM1602                                                               05/15/2009 20:51:21 PAGE 4   

 180          
 181          /*检查1602读写操作使能*/
 182          unsigned char Lcm1602CheckBusy(void)
 183          {
 184   1              unsigned int uiData;
 185   1              
 186   1              while (1)
 187   1              {
 188   2                      Lcm1602Rs(0);
 189   2                      Lcm1602Rw(1);
 190   2                      Lcm1602E(1);
 191   2                      /*判断STA7是否为0*/
 192   2                      uiData = Lcm1602GetData();
 193   2                      if (0 == (uiData & LCM1602_BUSY))
 194   2                      {
 195   3                              break;
 196   3                      }
 197   2                      Lcm1602E(0);
 198   2              }
 199   1              
 200   1              return uiData;
 201   1      }
 202          
 203          /*写1602指令*/
 204          void Lcm1602Command(unsigned char uchInstruction, unsigned char uchBusy)
 205          {
 206   1              if (0 != uchBusy)
 207   1              {
 208   2                      Lcm1602CheckBusy();
 209   2              }
 210   1              
 211   1              Lcm1602Rs(0);
 212   1              Lcm1602Rw(0);
 213   1              Lcm1602SetData(uchInstruction);
 214   1              Lcm1602E(1);
 215   1              delay_ms(1);
 216   1              Lcm1602E(0);
 217   1      }
 218          
 219          /*写1602数据*/
 220          void Lcm1602Data(unsigned char uchData)
 221          {
 222   1              Lcm1602CheckBusy();
 223   1              Lcm1602Rs(1);
 224   1              Lcm1602Rw(0);
 225   1              Lcm1602SetData(uchData);
 226   1              Lcm1602E(1);
 227   1              delay_ms(1);
 228   1              Lcm1602E(0);
 229   1      }
 230          
 231          /*初始化1602*/
 232          void Lcm1602Init(void)
 233          {
 234   1              LCM1602_RS_OUT;
 235   1              LCM1602_RW_OUT;
 236   1              LCM1602_E_OUT;
 237   1      
 238   1              delay_ms(15);
 239   1              //三次显示模式设置,不检测忙信号
 240   1              Lcm1602Command(0x38, 0);
 241   1              delay_ms(5);
C51 COMPILER V8.02   LCM1602                                                               05/15/2009 20:51:21 PAGE 5   

 242   1              Lcm1602Command(0x38, 0);
 243   1              delay_ms(5);
 244   1              Lcm1602Command(0x38, 0);
 245   1              delay_ms(5);
 246   1              //显示模式设置,开始要求每次检测忙信号
 247   1              Lcm1602Command(0x38, 1);
 248   1              //关闭显示
 249   1              Lcm1602Command(0x08, 1);
 250   1              //显示清屏
 251   1              Lcm1602Command(0x01, 1);
 252   1              //显示光标移动设置
 253   1              Lcm1602Command(0x06, 1);
 254   1              //显示开及光标设置
 255   1              Lcm1602Command(0x0c, 1);        
 256   1      }
 257          
 258          #if 0
              void Lcm1602Clear(void)
              {
                      Lcm1602Command(0x01, 1);
              }
              
              /***************************************************** 
              函 数 名:void DisplayChar(unsigned char x, unsigned char y, unsigned char uchData)
              功   能:按指定坐标中写入数据
              说   明:X-横坐标,Y-纵坐标,DData为ASCII值
              入口参数:x, y, uchData
              返 回 值:无 
              *****************************************************/
              void DisplayChar(unsigned char x, unsigned char y, unsigned char uchData)
              {
                      y &= 0x01;
                      x &= 0x0F;         // 限制X不能大于15,Y不能大于1
                      if (y)
                      {
                              x |=LCM1602_LINE2_ADDR; // 当要显示第二行时地址码:0xc0
                      }
                      x |= LCM1602_LINE1_ADDR;     // 第一行的地址码:0x80
                      Lcm1602Command(x, 1);
                      Lcm1602Data(uchData);
              }
              #endif
 284          
 285          /***************************************************** 
 286          函 数 名:void DisplayString(unsigned char x,unsigned char y,unsigned char *puszData)
 287          功   能:向指定坐标中写入字符串(在LCD1602中使用此函数)
 288          说   明:X-横坐标,Y-纵坐标
 289          入口参数:x, y, *puszData 
 290          返 回 值:无 
 291          *****************************************************/
 292          void DisplayString(unsigned char x,unsigned char y,unsigned char *puszData)
 293          {
 294   1              if (LCM1602_LINE1 == y)                       // 判断是否写入第1行
 295   1              {
 296   2                      if (x < LCM1602_LINE_LENGTH)                 // 写入位数
 297   2                      {
 298   3                              Lcm1602Command(LCM1602_LINE1_ADDR + x, 1);       // 写入第1行地址
 299   3                              for (; x < LCM1602_LINE_LENGTH && *puszData != '\0'; x++)
 300   3                              {
 301   4                                      Lcm1602Data(*(puszData++));         // 写入数据
 302   4                              }
 303   3                              if(*puszData!='\0')                 // 判断数据是否写完
C51 COMPILER V8.02   LCM1602                                                               05/15/2009 20:51:21 PAGE 6   

 304   3                              {
 305   4                                      x=0;                       // 没写完写入第2行
 306   4                                      y=LCM1602_LINE2; 
 307   4                              }
 308   3                      }
 309   2              }
 310   1        
 311   1              if (LCM1602_LINE2 == y)                       // 判断是否写入第2行
 312   1              {
 313   2                      Lcm1602Command(LCM1602_LINE2_ADDR + x, 1);         // 写入第2行地址
 314   2                      for (; x < LCM1602_LINE_LENGTH && *puszData != '\0'; x++)     // 判断数据是否写完
 315   2                      {
 316   3                              Lcm1602Data(*(puszData++));           // 写入数据
 317   3                      }
 318   2              }
 319   1      }
 320          


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