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

📄 lcd.lst

📁 PC机通过串口向单片机传输数据
💻 LST
字号:
C51 COMPILER V7.06   LCD                                                                   11/13/2006 15:57:58 PAGE 1   


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

stmt level    source

   1          /*--------------------------------------------------------------------------------------------------------
             -----
   2          液晶模块OCM4X8C DB0-DB7连接至实验板DP0-DP7(4/8位并行接口方式)
   3            E(sclk)连接至实验板DL7;
   4            RS连接到DL6;
   5            R/W(SID)固定接地;
   6            外加一条连线:DK6,DK7接到VCC(+5V);
   7            本程序功能:实现自动换行,汉字不能正常显示出自动补空,及无乱码显示(单字节于双字节字符混合)
   8            实现方式:检测汉字前的字母(单字节)个数,若为奇数,字母后一位补以空字符,以后的字符全部往后退一个字符位
   9            测试字符串:3嵌G入1式C21工4作8式03届
  10            变量说明:
  11                                  LCD_cn 字符写入地址或液晶要显示的数据
  12                                  line   对应于液晶的显示行数,从的0行开始                                                                                                                                        
  13                                                                                                                                                                          3G1C embedded studio design
  14          ----------------------------------------------------------------------------------------------------------
             ---*/
  15          #include <reg52.h> 
  16          #include <absacc.h>                             //片外地址定义
  17          
  18          #define uchar unsigned char
  19          
  20          #define led_data XBYTE[0xe000]    /*端口地址,对应实验板的DP0-DP7,数据*/
  21          #define led_sel XBYTE[0xc000]   /*端口地址,对应实验板的DL*/
  22          
  23          void changeAddr(uchar lin);                     //地址转换子程序
  24          void insert(uchar p);                   //插入空字符子程序
  25          void changeArr(void);                   //数组调整子程序
  26          void show(void);                                //液晶显示子程序
  27          void wcom(void);                                //液晶写指令子程序
  28          void wdat(void);                                //液晶写数据子程序
  29          void delayms(uchar ms);                 //ms级延时子程序
  30          void init(void);                                //初始化子程序
  31          
  32          uchar LCD_cn;
  33          uchar buffer[100]={"3嵌G入1式C21工4作8式03届"};
  34          /*---------------------------------------------------------------------------------------------
  35                                                                                          主函数
  36          ---------------------------------------------------------------------------------------------*/
  37          main(void)
  38          {
  39   1              init();                         //液晶模块初始化
  40   1      
  41   1              led_data=0;  
  42   1              led_sel=0xff; 
  43   1              
  44   1              changeArr();            //调用字符数组排列子程序
  45   1              show();                         //调用液晶显示子程序
  46   1      
  47   1              while(1)
  48   1              {
  49   2                      
  50   2              }
  51   1                      
  52   1      }
  53          /*-----------------------------------------------------------------------------------------------
C51 COMPILER V7.06   LCD                                                                   11/13/2006 15:57:58 PAGE 2   

  54                                                                                          液晶初始化子程序
  55          -----------------------------------------------------------------------------------------------*/
  56          void init(void)
  57          { 
  58   1              LCD_cn=0x30;    //功能设定
  59   1              wcom();
  60   1                                      //delayms(2);
  61   1      
  62   1              LCD_cn=0x01;    //清除显示
  63   1              wcom();
  64   1                                      //delayms(2);
  65   1      
  66   1              LCD_cn=0x06;    //光标右移
  67   1              wcom();
  68   1                                      //delayms(2);
  69   1      
  70   1              LCD_cn=0x0c;    //开显示器
  71   1              wcom();
  72   1                                      //delayms(2);
  73   1      
  74   1              LCD_cn=0x01;    //清除显示
  75   1              wcom();
  76   1                                      //delayms(2);
  77   1              
  78   1      }
  79          /*----------------------------------------------------------------------------------------------
  80                                                                                          延时子程序
  81          确保上一指令/数据已经接受、处理完。
  82          ----------------------------------------------------------------------------------------------*/
  83          void delayms(uchar ms)                  
  84          {
  85   1          uchar i;
  86   1          while(ms--)
  87   1          {
  88   2              for(i=0; i<125; i++);
  89   2          }
  90   1      }
  91          
  92          /*----------------------------------------------------------------------------------------------
  93                                                                                          液晶写指令子程序                                                                                
  94          ----------------------------------------------------------------------------------------------*/
  95          void wcom(void)         //写指令
  96          { 
  97   1              led_sel=0xbf;   //RW=0,RS=0,E=1 指令写
  98   1                                              //delayms(2);
  99   1              led_data=LCD_cn;
 100   1                                              //delayms(2);
 101   1              led_sel=0x3f;   //RW=0,RS=0,E=0 恢复
 102   1              delayms(2);
 103   1      }
 104          /*-----------------------------------------------------------------------------------------------
 105                                                                                          液晶写数据子程序
 106          -----------------------------------------------------------------------------------------------*/
 107          void wdat(void)         //写数据
 108          { 
 109   1              led_sel=0xff;   //RW=0,RS=1,E=1 写
 110   1                                              //delayms(2);
 111   1              led_data=LCD_cn;
 112   1                                              //delayms(2);
 113   1              led_sel=0x7f;   //写脉冲Rs=1,wr=0;e=0 恢复
 114   1              //led_sel=0x3f; //RW=0,RS=0,E=0 恢复  这句代替上句的话,RS=0,无法显示数据
 115   1              delayms(2);
C51 COMPILER V7.06   LCD                                                                   11/13/2006 15:57:58 PAGE 3   

 116   1      }
 117          /*--------------------------------------------------------------------
 118                                                          地址转换子程序
 119          第一行: 80H ———87H ,第二行: 90H ———97H 第三行:88H ———8FH 第四行:9
 120          --------------------------------------------------------------------*/
 121          void changeAddr(uchar lin)
 122           { 
 123   1              switch(lin)
 124   1              {
 125   2                      case 0:
 126   2                                      LCD_cn=0x80;                    //LINE 1
 127   2                                      break;
 128   2                      case 1:
 129   2                                      LCD_cn=0x90;                    //LINE 2
 130   2                                      break;
 131   2                      case 2:
 132   2                                      LCD_cn=0x88;                    //LINE 3
 133   2                                      break;
 134   2                      case 3:
 135   2                                      LCD_cn=0x98;                    //LINE 4
 136   2                                      break;  
 137   2                }
 138   1      }
 139          /*------------------------------------------------------------------------------------------
 140                                                                                  插入字符子程序
 141          相应位插入空字符,同时该位以后的所有字符逐位往后退一位
 142          ------------------------------------------------------------------------------------------*/
 143          void insert(uchar p)
 144          {
 145   1              uchar p1;
 146   1              p1=p;
 147   1              while(buffer[p]!='\0')                  //将数组指针移到数组末尾第一个\0处
 148   1              {
 149   2                      p++;
 150   2               }
 151   1              for(;p>p1;p--)                                  //从第p1+1位开始,逐位往后退一位
 152   1                      buffer[p]=buffer[p-1];
 153   1              buffer[p1]=' ';                                 //p1位补空字符
 154   1      }
 155          /*----------------------------------------------------------------------------------------
 156                                                                          数组重排列子程序
 157          ----------------------------------------------------------------------------------------*/
 158          void changeArr(void)
 159          {
 160   1              uchar count;                                    //用于计算字母(单字符)个数
 161   1              uchar j=0;
 162   1              while(buffer[j]!='\0')
 163   1              {
 164   2                      if(buffer[j]<127)                       //判断是否位字母
 165   2                      {
 166   3                              count++;
 167   3                              j++;
 168   3                       }
 169   2                       if(buffer[j]>127)                      //判断是否位汉字
 170   2                       {
 171   3                              if(count%2!=0)                  //若汉字前字母个数为奇数则调用子函数insert(),作相应的处理
 172   3                                      {
 173   4                                              insert(j);
 174   4                                              j=j+2;                  //跳到汉字后的字符(一个汉字占用2个字节位置)
 175   4                                              count=0;
 176   4                                       }
 177   3                              else
C51 COMPILER V7.06   LCD                                                                   11/13/2006 15:57:58 PAGE 4   

 178   3                              {
 179   4                                      count=0;
 180   4                                      j++;
 181   4                               }
 182   3                        }
 183   2               }
 184   1       }
 185          /*---------------------------------------------------------------------------------------------------
 186                                                                                          液晶显示子程序
 187          ---------------------------------------------------------------------------------------------------*/
 188           void show(void)
 189           {
 190   1              uchar j=0;
 191   1              uchar line;
 192   1              LCD_cn=0x80;
 193   1              wcom();
 194   1              while(buffer[j]!='\0')
 195   1              {
 196   2                      if(j%16==0)                                     //每行智能显示16个字符,到达字符个数自动换行
 197   2                      {
 198   3                              line=j/16;
 199   3                              if(line>4) break;
 200   3                              changeAddr(line);                       //改变地址
 201   3                              wcom();
 202   3                       }
 203   2                       LCD_cn=buffer[j];
 204   2                       wdat();
 205   2                       j++;
 206   2               }
 207   1       }


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