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

📄 1602.lst

📁 CY7C68013A 控制LCD1602的源程序
💻 LST
字号:
C51 COMPILER V7.06   1602                                                                  07/15/2007 14:28:26 PAGE 1   


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

stmt level    source

   1          //**************************************************************************************
   2          //硬件连接:1602VDD接5V,VO接地,BL1接5V,BL2接地,8根数据线接IOA口,RS RW E分别接IOB4-6口
   3          //**************************************************************************************
   4          sfr OEA     = 0xB2;
   5          sfr IOA     = 0x80;
   6          sfr IOD     = 0xB0;
   7          sfr IOB     = 0x90;
   8          sfr OED     = 0xB5;
   9          sfr OEB     = 0xB3;
  10          #include <string.h>
  11          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  12          #define LCM_Data IOA
  13          sbit LCM_RS=IOB^4;              //寄存器选择
  14          sbit LCM_RW=IOB^5;                      //读/写控制
  15          sbit LCM_E=IOB^6;               //读/写使能
  16          int i,j;
  17          
  18          //自定义字符列表
  19          //=====================================================================================
  20          unsigned char   character0[8] = {0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},              //年
  21                                          character1[8] = {0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11},              //月
  22                                          character2[8] = {0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f},              //日
  23                  
  24                                          characterN[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};              //日
  25          //=====================================================================================
  26          
  27          
  28          //=====================================================================================
  29          //延时程序
  30          //=====================================================================================
  31          void Delay5Ms(void)
  32          {
  33   1       unsigned long int TempCyc = 5552;
  34   1       while(TempCyc--);
  35   1      }
  36          
  37          void Delay400Ms(void)
  38          {
  39   1       unsigned char TempCycA = 5;
  40   1       unsigned int TempCycB;
  41   1       while(TempCycA--)
  42   1      {
  43   2      TempCycB=7269;
  44   2      while(TempCycB--);
  45   2      };
  46   1      }
  47          
  48          
  49          //=====================================================================================
  50          //读写子程序
  51          //=====================================================================================
  52          
  53          //读数据
  54          unsigned char ReadDataLCM(void)
  55          {
C51 COMPILER V7.06   1602                                                                  07/15/2007 14:28:26 PAGE 2   

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

 118   1      Delay5Ms();
 119   1      WriteCommandLCM(0x08,1); // 关闭显示
 120   1      Delay5Ms();
 121   1      WriteCommandLCM(0x01,1); // 清屏
 122   1      Delay5Ms();
 123   1      WriteCommandLCM(0x06,1); // 显示光标移动设置
 124   1      Delay5Ms();
 125   1      WriteCommandLCM(0x0c,1); // 显示开及光标设置
 126   1      Delay5Ms();
 127   1      }
 128          
 129          
 130          //=====================================================================================
 131          //按指定位置显示一个字符
 132          //=====================================================================================
 133          
 134          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 135          {
 136   1      Y &= 0x1;
 137   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 138   1      if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 139   1      X |= 0x80; //算出指令码
 140   1      WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 141   1      WriteDataLCM(DData);
 142   1      }
 143          
 144          //=====================================================================================
 145          //按指定位置显示一串字符
 146          //void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 147          //说明:  x(0-15):x参数 y(0-1):y参数 DData(字符串):要显示的内容(英文、数字、符号)
 148          //=====================================================================================
 149           
 150          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 151          {
 152   1        unsigned char ListLength,j;
 153   1        ListLength = strlen(DData);
 154   1        Y &= 0x1;
 155   1        X &= 0xF; //限制X不能大于15,Y不能大于1
 156   1            if (X <= 0xF) //X坐标应小于0xF
 157   1              { 
 158   2                          for(j=0;j<ListLength;j++)
 159   2                            {
 160   3                   DisplayOneChar(X, Y, DData[j]); //显示单个字符
 161   3                   X++;
 162   3                  }
 163   2              }
 164   1      }
 165          
 166          //=====================================================================================
 167          //显示自定义字符
 168          //void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)
 169          //说明:xx(0-15):为x参数.yy(0-1):y参数.character:要显示的字符的列表地址,在程序前面有定义
 170          //saveto(1-7)为字符保存的RAM,每屏最多显示7个自定义字符
 171          //(0x00-0x0h是自定义字符)
 172          //=====================================================================================
 173          
 174          void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)
 175          {
 176   1              unsigned char add = (saveto<<3) | 0x40;
 177   1              unsigned char t;                                                //临时变量,每一行的值
 178   1      
 179   1              t=*(character+0);
C51 COMPILER V7.06   1602                                                                  07/15/2007 14:28:26 PAGE 4   

 180   1              WriteCommandLCM(add, 0);                                //第1行
 181   1              WriteDataLCM(t);
 182   1              t=*(character+1);
 183   1              WriteCommandLCM(add+1, 0);                              //第2行
 184   1              WriteDataLCM(t);
 185   1              t=*(character+2);
 186   1              WriteCommandLCM(add+2, 0);                              //第3行
 187   1              WriteDataLCM(t);
 188   1              t=*(character+3);
 189   1              WriteCommandLCM(add+3, 0);                              //第4行
 190   1              WriteDataLCM(t);
 191   1              t=*(character+4);
 192   1              WriteCommandLCM(add+4, 0);                              //第5行
 193   1              WriteDataLCM(t);
 194   1              t=*(character+5);
 195   1              WriteCommandLCM(add+5, 0);                              //第6行
 196   1              WriteDataLCM(t);
 197   1              t=*(character+6);
 198   1              WriteCommandLCM(add+6, 0);                              //第7行
 199   1              WriteDataLCM(t);
 200   1              t=*(character+7);
 201   1              WriteCommandLCM(add+7, 0);                              //第8行
 202   1              WriteDataLCM(t);
 203   1      
 204   1              DisplayOneChar(xx,yy,saveto);                           //显示字符
 205   1      }
 206          //=====================================================================================
 207          //主函数
 208          //=====================================================================================
 209          
 210          main()
 211          {
 212   1              OEA=0xff;
 213   1              OEB=0xff;
 214   1              OED=0xff;                                                       //68013IO口初始化
 215   1              Delay400Ms();
 216   1          LCMInit();
 217   1              Delay400Ms();                                           //1602初始化
 218   1      while(1)
 219   1              {
 220   2              DisplayListChar(0,0,"This is ListChar");
 221   2              DisplayListChar(0,1,"!");
 222   2              for(j=0;j<30;j++)for(i=0;i<30000;i++);
 223   2              WriteCommandLCM(0x01,1); //清屏
 224   2              Delay5Ms();
 225   2      
 226   2              DisplayListChar(0,0,"This is OneChar:");
 227   2              DisplayOneChar(0,1,0x4f);
 228   2              DisplayOneChar(1,1,0x6e);
 229   2              DisplayOneChar(2,1,0x65);
 230   2              DisplayOneChar(3,1,0x21);
 231   2              for(j=0;j<30;j++)for(i=0;i<30000;i++);
 232   2              WriteCommandLCM(0x01,1); //清屏
 233   2              Delay5Ms();
 234   2      
 235   2              DisplayListChar(0,0,"This is MyChar:");
 236   2              mychar(0,1, character0,1);
 237   2              mychar(1,1, character1,2);
 238   2              mychar(2,1, character2,3);
 239   2              for(j=0;j<30;j++)for(i=0;i<30000;i++);
 240   2              WriteCommandLCM(0x01,1); //清屏
 241   2              Delay5Ms();
C51 COMPILER V7.06   1602                                                                  07/15/2007 14:28:26 PAGE 5   

 242   2              }
 243   1      }
 244          
 245          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    844    ----
   CONSTANT SIZE    =     52    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     36      15
   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 + -