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

📄 charlcd.lst

📁 电子书
💻 LST
字号:
C51 COMPILER V7.20   CHARLCD                                                               08/17/2007 16:25:17 PAGE 1   


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

line level    source

   1          
   2          /*------------------------------------------------------------------
   3          
   4             CharLCD.C (v1.00)   16x2 字符液晶屏驱动程序
   5          
   6          ------------------------------------------------------------------*/
   7                              
   8          
   9          #include "CharLCD.h"
  10          
  11           
  12          
  13          //Change the following section accroding to you hardware
  14          #ifdef _LCDXADDR  
                  #define Lcd1602WCmdPort    (*(volatile uchar *)0x2000)  //E=1 RS=0 RW=0
                  #define Lcd1602RStatusPort (*(volatile uchar *)0x2001)  //E=1 RS=0 RW=1
                  #define Lcd1602WdataPort   (*(volatile uchar *)0x2002)  //E =1 RS=1 RW=0
                  #define Lcd1602RDataPort   (*(volatile uchar *)0x2003)  //E=1 RS=1 RW=1 
              #else
  20              #ifdef  _51   
  21                  sbit lcd_cs = P2^0;            //控制位
  22                  sbit lcd_rw = P2^1; 
  23                  sbit lcd_rs = P2^2;
  24                  #define DataPort      P0 
  25                  #define DataDirPort   P0  
  26                  #define StatePort     P0   
  27              #endif
  28            
  29              #ifdef _AVR 
                      #define lcd_cs          PORTC.0    //控制位以及其方向控制位
                      #define lcd_cs_dir_bit  DDRC.0
                      #define lcd_rw          PORTC.1 
                      #define lcd_rw_dir_bit  DDRC.1
                      #define lcd_rs          PORTC.2
                      #define lcd_rs_dir_bit  DDRC.2  
                      #define DataPort        PORTA
                      #define StatePort       PINA
                      #define DataDirPort     DDRA    
                  #endif     
  40          
  41          #endif 
  42          
  43                 
  44          // ------ Private constants ----------------------------------------    
  45          
  46          #define Busy 0x80 // 忙判别位  
  47          
  48            
  49          // ------ Private variables-----------------------------------------
  50          #ifdef  _51   
  51              code uchar* WrtieLcdErr =  "Display char outof range."; 
  52          #endif
  53          
  54          #ifdef  _AVR   
                  flash uchar* WrtieLcdErr =  "Display char outof range."; 
C51 COMPILER V7.20   CHARLCD                                                               08/17/2007 16:25:17 PAGE 2   

              #endif
  57          
  58          
  59          // ------ Private function prototypes ------------------------------
  60          static BOOL WaitTillNotBusy();
  61          static BOOL LocateXY(uchar posx,uchar posy); 
  62          static BOOL LcdWData(uchar dataW);
  63          static BOOL LcdWCMD(uchar CMD);
  64                    
  65          
  66          
  67          
  68                    
  69          
  70          /*------------------------------------------------------------------
  71          
  72            WaitTillNotBusy()
  73            检测忙
  74          
  75          ------------------------------------------------------------------*/
  76          BOOL WaitTillNotBusy()
  77          { 
  78   1          uint delay = 0xffff;  
  79   1       
  80   1          #ifdef _LCDXADDR 
                      while( (Lcd1602RStatusPort & Busy) && delay )
                          delay--;
                            
                      if (!delay)  
                          return FALSE;
                             
                  #else
  88   1              #ifdef _AVR         
                          DataDirPort = 0x00;              
                      #endif   
  91   1          
  92   1              #ifdef _51    
  93   1                  DataDirPort = 0xff; 
  94   1              #endif  
  95   1                                
  96   1              lcd_cs = 1;
  97   1              lcd_rs = 0;
  98   1              lcd_rw = 1;
  99   1              while( (StatePort & Busy) && delay)
 100   1                  delay--;
 101   1              lcd_cs = 0;  
 102   1              if (!delay)  
 103   1                  return FALSE ; 
 104   1          #endif   
 105   1          
 106   1          return TRUE; 
 107   1      }      
 108          
 109          
 110          
 111          
 112          /*------------------------------------------------------------------
 113          
 114            LocateXY()
 115           显示光标定位
 116          
 117          ------------------------------------------------------------------*/
C51 COMPILER V7.20   CHARLCD                                                               08/17/2007 16:25:17 PAGE 3   

 118          BOOL LocateXY( uchar posx,uchar posy)
 119          {
 120   1          posy &= 0x01;
 121   1          if (posy == 1)
 122   1              posx |= 0x40;
 123   1              posx |= 0x80;
 124   1          
 125   1          
 126   1          return LcdWCMD(posx);   
 127   1      }
 128          
 129          
 130           
 131          
 132          
 133          /*------------------------------------------------------------------
 134          
 135            LcdWCMD()
 136           写控制字符子程序: E=1 RS=0 RW=0
 137          
 138          ------------------------------------------------------------------*/
 139          BOOL LcdWCMD(uchar CMD) 
 140          {        
 141   1          #ifdef _LCDXADDR               
                      if (!WaitTillNotBusy()) // 检测忙信号? 
                          return FALSE;
                      Lcd1602WCmdPort = CMD; 
                         
                  #else 
 147   1              uchar i=1;
 148   1                                  
 149   1              if (!WaitTillNotBusy()) // 检测忙信号? 
 150   1                  return FALSE;    
 151   1                
 152   1              #ifdef _AVR         
                          DataDirPort = 0xff;              
                      #endif   
 155   1                                       
 156   1              DataPort = CMD;
 157   1              lcd_rs = 0;
 158   1              lcd_rw = 0;
 159   1              lcd_cs = 1;
 160   1              while(i++);
 161   1              lcd_cs = 0;  
 162   1          
 163   1          #endif
 164   1          
 165   1          return TRUE;
 166   1      }
 167          
 168             
 169          
 170          
 171          /*------------------------------------------------------------------
 172          
 173            LcdWData()
 174           当前位置写字符子程序: E =1 RS=1 RW=0
 175          
 176          ------------------------------------------------------------------*/
 177          BOOL LcdWData( uchar dataW ) 
 178          {    
 179   1          #ifdef _LCDXADDR  
C51 COMPILER V7.20   CHARLCD                                                               08/17/2007 16:25:17 PAGE 4   

                      if (!WaitTillNotBusy()) // 检测忙信号? 
                          return FALSE;
                      Lcd1602WdataPort = dataW;
                  
                  #else       
 185   1              uchar i = 1;
 186   1               
 187   1              if (!WaitTillNotBusy()) // 检测忙信号? 
 188   1                  return FALSE; 
 189   1              
 190   1              #ifdef _AVR         
                          DataDirPort = 0xff;              
                      #endif        
 193   1              
 194   1              DataPort = dataW;
 195   1              lcd_rs = 1;
 196   1              lcd_rw = 0;
 197   1              lcd_cs = 1;
 198   1              while(i++);
 199   1              lcd_cs = 0;   
 200   1              
 201   1          #endif  
 202   1          
 203   1          return TRUE;
 204   1      } 
 205               
 206          
 207          
 208          
 209          /*------------------------------------------------------------------
 210          
 211            LCDInit()
 212           初始化程序, 必须按照产品资料介绍的初始化过程进行
 213          
 214          ------------------------------------------------------------------*/
 215          BOOL LCDInit() 
 216          {
 217   1          #ifdef _AVR 
                      #ifndef _LCDXADDR
                          lcd_cs_dir_bit = 1;
                          lcd_rw_dir_bit = 1;
                          lcd_rs_dir_bit = 1; 
                      #endif
                  #endif
 224   1          
 225   1          // 显示模式设置,光标移动设置,显示开及光标设置,显示清屏 
 226   1          return (LcdWCMD( 0x38) && LcdWCMD( 0x06) && LcdWCMD( 0x0c) && LcdWCMD( 0x01));       
 227   1      
 228   1      }
 229             
 230              
 231          
 232          
 233          /*------------------------------------------------------------------
 234          
 235            DisplayOneChar()
 236           按指定位置显示数出一个字符
 237          
 238          ------------------------------------------------------------------*/   
 239          BOOL DisplayOneChar(uchar x ,uchar y ,uchar Wdata) 
 240          {
 241   1         
C51 COMPILER V7.20   CHARLCD                                                               08/17/2007 16:25:17 PAGE 5   

 242   1          if( (x >= 0 && x < 16) && (y >= 0 && y < 2) )
 243   1              return (LocateXY( x, y ) && LcdWData( Wdata )) ;// 定位显示地址,写字符 
 244   1          else
 245   1              return ( LCDInit() && DisplayString(0, 0, WrtieLcdErr));    //显示越界消息    
 246   1      }
 247          
 248          
 249          
 250          
 251          /*------------------------------------------------------------------
 252          
 253            DisplayString()
 254           从指定位置开始显示一串字符
 255          
 256          ------------------------------------------------------------------*/
 257          BOOL DisplayString(uchar posx, uchar posy,  flash uchar*  str)
 258          {    
 259   1          while ( (*str) != '\0' )
 260   1          {
 261   2              if (!DisplayOneChar(posx, posy, (*str)))
 262   2                  return FALSE;
 263   2              str++;
 264   2              posx++;
 265   2              if( posx == 16 )
 266   2              {
 267   3                  posx = 0;
 268   3                  posy++;
 269   3      
 270   3              }
 271   2          }
 272   1          
 273   1          return TRUE;              
 274   1      }          
 275          
 276          
 277          /*------------------------------------------------------------------
 278            ---- END OF FILE -------------------------------------------------
 279          ------------------------------------------------------------------*/


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