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

📄 lcm-1602a.lst

📁 LCD1602.rar
💻 LST
字号:
C51 COMPILER V8.08   LCM_1602A                                                             11/24/2009 12:52:21 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE LCM_1602A
OBJECT MODULE PLACED IN LCM-1602A.OBJ
COMPILER INVOKED BY: f:\Keil3\C51\BIN\C51.EXE LCM-1602A.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /**********************************************************************************************
   2              作者:   李雪川
   3              时间:   2009-7-29
   4              说明:   YJD1602A-1液晶显示程序
   5              地址设置:地址为后7位,第8位为1
   6                  N=0 一行显示 地址0x00-0x4f
   7                  N= 1 两行显示 首行 0x00-0x2f, 次行0x40-0x67
   8              版本:   V1
   9              注意:u = LCM_BYTE;  ***********特别注意:往往一时大意容易出小错,结果出不来*******
  10                   while (u & 0x80);  BF=1:忙 BF = 0: 空闲 
  11                   return(u);
  12          **------------------------------------------------------------------------------------
  13          **  修改信息:
  14          **  修改  人:       李雪川
  15          **  修改日期:       2009-10-25
  16          **  修改内容:       添加液晶测试宏定义,方便测试
  17          ***********************************************************************************************/
  18          
  19          /* LCM-1602A.C */
  20          
  21          #include "LCM-1602A.H"
  22          
  23          
  24          /******************************************************************************************* 
  25          **  函数名称:delay_ms 
  26          **  函数功能:延时ms 
  27          *******************************************************************************************/ 
  28          
  29          
  30          /******************************************************************************************* 
  31          **  函数名称: uchar lcm_rdbyte(void)
  32          **  函数功能:向1602a-1读一个数据
  33          *******************************************************************************************/
  34          uchar lcm_rdbyte(void)
  35          {
  36   1          LCM_RS = 1; /* 读数据 */
  37   1          LCM_R_W = 1; 
  38   1          LCM_E = 1; /* 高电平有效 */
  39   1          return(LCM_BYTE);
  40   1      }
  41          
  42          /******************************************************************************************* 
  43          **  函数名称: uchar lcm_rdint(void)
  44          **  函数功能:向1602a-1读BF , AC
  45          *******************************************************************************************/
  46          uchar lcm_rdint(void)
  47          {
  48   1          LCM_BYTE = 0xff;
  49   1          LCM_RS = 0; /* 读寄存器 */
  50   1          LCM_R_W = 1; 
  51   1          LCM_E = 1; /* 高电平有效 */
  52   1      /***u = LCM_BYTE;  //***********特别注意:往往一时大意容易出小错,结果出不来*************/
  53   1          while (LCM_BYTE & 0x80); /* BF=1:忙 BF = 0: 空闲 */
  54   1          return(LCM_BYTE);
  55   1      }
C51 COMPILER V8.08   LCM_1602A                                                             11/24/2009 12:52:21 PAGE 2   

  56          
  57          
  58          /******************************************************************************************* 
  59          **  函数名称: void lcm_wrint(uchar byte, uchar busyc)
  60          **  函数功能:向1602a-1写寄存器. 包括些控制字和地址
  61          **  地址设置:地址为后7位,第8位为1
  62                  N=0 一行显示 地址0x00-0x4f
  63                  N= 1 两行显示 首行 0x00-0x2f, 次行0x40-0x67
  64          *******************************************************************************************/
  65          void lcm_wrint(uchar byte, uchar busyc)
  66          {
  67   1          if (busyc) lcm_rdint(); /* busyc 为0 忽略遇忙检测 */
  68   1      //    LCM_BYTE = byte;
  69   1          LCM_RS = 0; /* 写寄存器 */
  70   1          LCM_R_W = 0; 
  71   1          LCM_BYTE = byte;
  72   1          LCM_E = 0; /*下降沿有效 */
  73   1          _nop_();
  74   1          LCM_E = 1;//////////////////////////////////////////////////////////////////
  75   1      }
  76          
  77          
  78          /******************************************************************************************* 
  79          **  函数名称: void lcm_wrbyte(uchar byte)
  80          **  函数功能:向1602a-1写一个数据,(写完后ac可设置自动加一)
  81          *******************************************************************************************/
  82          void lcm_wrbyte(uchar byte)
  83          {
  84   1          lcm_rdint(); /* 遇忙检测 */
  85   1          LCM_RS = 1; /* 写数据 */
  86   1          LCM_R_W = 0; 
  87   1          LCM_BYTE = byte;
  88   1          LCM_E = 0; /*下降沿有效 */
  89   1          _nop_();
  90   1          LCM_E = 1;    
  91   1      }
  92          
  93          
  94          /******************************************************************************************* 
  95          **  函数名称: void lcm_ac(uchar x, uchar y) 
  96          **  函数功能:  将AC光标移动到指定位置
  97          *******************************************************************************************/
  98          void lcm_ac(uchar x, uchar y) 
  99          { 
 100   1          y &= 0x01;  /* 算地址 */
 101   1          x &= 0x0F; //限制X不能大于15,Y不能大于1 
 102   1          if (y) x |= 0x40; //当要显示第二行时地址码+0x40; 
 103   1          x |= 0x80; // 算出指令码 
 104   1          lcm_wrint(x, 0); //这里不检测忙信号,发送地址码 
 105   1      } 
 106          
 107          
 108          /******************************************************************************************* 
 109          **  函数名称: void lcm_displist(uchar x, uchar y, uchar *ddata) 
 110          **  函数功能:向1602a-1任意地址显示一串字符
 111          *******************************************************************************************/
 112          void lcm_displist(uchar x, uchar y, uchar *ddata)
 113          {
 114   1          uchar line = x; /* 字符串首列地址 */
 115   1          uchar listlength = 0;
 116   1          y &= 0x01; 
 117   1          x &= 0x0F; //限制X不能大于15,Y不能大于1 
C51 COMPILER V8.08   LCM_1602A                                                             11/24/2009 12:52:21 PAGE 3   

 118   1          
 119   1          if (y) line |= 0x40; //当要显示第二行时地址码+0x40; 
 120   1          line |= 0x80; // 算出指令码 
 121   1          lcm_wrint(line, 1); //检测忙信号,发送地址码 
 122   1          
 123   1          while(ddata[listlength] != '\0') //若到达字串尾则退出
 124   1          {
 125   2              if (x <= 0x0F) //X坐标应小于0xF 
 126   2              {
 127   3                 // lcm_diapchar(x, y, ddata[listlength]);
 128   3                  lcm_wrbyte(ddata[listlength]);
 129   3                  x++;
 130   3                  listlength++;
 131   3              }
 132   2              else
 133   2              {
 134   3                  break;
 135   3              }
 136   2          }
 137   1      }
 138          
 139          /******************************************************************************************* 
 140          **  函数名称: void lcm_init() 
 141          **  函数功能:1602a-1初始设置
 142          *******************************************************************************************/
 143          void lcm_init()
 144          {
 145   1      
 146   1          lcm_wrint(0x38,1); /* D4= 1:8位数据接口,0:4位数据接口,D3=1:两行显示 0:一行显示 
 147   1                                  D2 = 1: 5*10点阵 0 :5*7点阵*/
 148   1          lcm_wrint(0x08,1); /* 显示开关控制D3=1, D2显示开关,D1光标开关,D0闪烁开关. 1:开,0:关 */
 149   1      
 150   1          lcm_wrint(0x0e,1);
 151   1          lcm_wrint(0x01,1); /* 清零 */
 152   1          lcm_wrint(0x02,1); /* 光标归为到HOME */  
 153   1          lcm_wrint(0x06,1); /* 输入方式设置,D2=1, D1=1:AC自加,0:自减, D0=1:画面平移,0:不动\
 154   1                              这里画面设置为不动*/
 155   1          //lcm_wrint(0x1c,1); /* 光标画面移位,D3=1:画面移 0:光标移动,D2=1:右移0:左移 */  
 156   1      }
 157          
 158          
 159          
 160          
 161          
 162          
 163          
 164          /*--------------------------------宏编译---------------------------------------------------*/
 165          #if LCM_1602A_TEST > 0
 166          
 167          
 168          void main()
 169          {
 170   1          uint i = 500000;
 171   1          uchar code tab1[] = {"zhu yao xing fu!!!!"};
 172   1          uchar code tab2[] = {"   yong yuan!   "};
 173   1          while(i--);
 174   1          lcm_init();
 175   1      
 176   1          lcm_wrbyte('a');
 177   1          lcm_wrbyte('a');
 178   1          lcm_wrbyte('a');
 179   1          lcm_wrbyte('a');
C51 COMPILER V8.08   LCM_1602A                                                             11/24/2009 12:52:21 PAGE 4   

 180   1      
 181   1      
 182   1          lcm_displist(0,1,tab2);
 183   1          lcm_displist(0,0,tab1);
 184   1          lcm_rdbyte(); //测试可不要
 185   1          while(1);
 186   1      }
 187          
 188          #endif
 189          /*----------------------------宏编译结束------------------------------------------------------*/
 190          
 191          
 192          
 193          


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