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

📄 lcd1602四线驱动.lst

📁 文件夹包含LCD1602的一些经常用到的驱动: ├─★★LCD1602四线驱动 ├─★LCD1602_8显示Mini Driver ├─★★LCD1602A_优化驱动 ├─★▲LCD1602滚
💻 LST
📖 第 1 页 / 共 3 页
字号:
  13      =1  
  14      =1  /*--------------------------------------------------------------*/
  15      =1  //LCD1602接口定义
  16      =1  sfr             LCD_DATA    = 0xa0;             //P2口高四位(P2^4~P2^7)与LCD的高四位(D4~D7)一一对应相接
  17      =1  sbit    LCD_RS          = P2^2;         //数据指令
C51 COMPILER V7.06   LCD1602四_咔齙_                                                       08/10/2008 09:23:55 PAGE 5   

  18      =1  sbit    LCD_EN          = P2^3;         //使能端
  19      =1  //sbit  LCD_RW          = GND;          //读写控制端接地        ^_^哈哈,又少了一根线咯!
  20      =1  
  21      =1  
  22      =1  /*--------------------------------------------------------------*/
  23      =1  //函数声明
  24      =1  void LCD_init   (void);                                                                                                 //液晶初始化
  25      =1  void LCD_en     (void);                                                                                                 //输入使能
  26      =1  void LCD_clr    (void);                                                                                                 //液晶清屏
  27      =1  void LCD_cmd    (unsigned char cmd);                                                                    //指令输入
  28      =1  void LCD_dat    (unsigned char dat);                                                                    //数据输入
  29      =1  void LCD_delay  (unsigned char m, unsigned char n);                                             //延迟时间
  30      =1  void LCD_pos    (unsigned char x, unsigned char y);                                             //液晶定位
  31      =1  void LCD_printc (unsigned char x, unsigned char y, unsigned char c);    //字符定位输出
  32      =1  void LCD_prints (unsigned char x, unsigned char y, unsigned char *s);   //字符串定位输出
  33      =1  /*
  34      =1  void LCD_fprints(unsigned char *s,signed char pos);                                             //字符串输出
  35      =1  */
  36      =1  
  37      =1  /*--------------------------------------------------------------*/
  38      =1  //延迟时间12us→130 000us
  39      =1  void LCD_delay(unsigned char m, unsigned char n)
  40      =1  {
  41   1  =1      unsigned char tempm,tempn=n;
  42   1  =1      do{tempm=m;while(--tempm);}while(--tempn);
  43   1  =1  }
  44      =1  
  45      =1  
  46      =1  /*--------------------------------------------------------------*/
  47      =1  //液晶初始化
  48      =1  void LCD_init(void)
  49      =1  {
  50   1  =1          LCD_cmd(0x28);
  51   1  =1          LCD_en();
  52   1  =1          LCD_cmd(0x28);                  //四线显示
  53   1  =1          LCD_cmd(0x0c);                  //显示打开
  54   1  =1          LCD_cmd(0x01);                  //显示清屏
  55   1  =1          LCD_delay(2, 249);              //2000-2 us
  56   1  =1  }
  57      =1  
  58      =1  
  59      =1  /*--------------------------------------------------------------*/
  60      =1  //输入使能
  61      =1  void LCD_en(void)
  62      =1  {
  63   1  =1          LCD_EN = 1;
  64   1  =1          LCD_delay(1,1);                 //12us
  65   1  =1          LCD_EN = 0;
  66   1  =1  }
  67      =1  
  68      =1  
  69      =1  /*--------------------------------------------------------------*/
  70      =1  //指令输入
  71      =1  void LCD_cmd(unsigned char cmd)
  72      =1  {
  73   1  =1          LCD_delay(15,1);                //40us
  74   1  =1          LCD_RS = 0;                             //指令
  75   1  =1          LCD_DATA &= 0x0f;               //清高四位
  76   1  =1          LCD_DATA |= cmd&0xf0;   //写高四位
  77   1  =1          LCD_en();
  78   1  =1          cmd <<= 4;                              //低四位移到高四位
  79   1  =1          LCD_DATA &= 0x0f;               //清高四位
C51 COMPILER V7.06   LCD1602四_咔齙_                                                       08/10/2008 09:23:55 PAGE 6   

  80   1  =1          LCD_DATA |= cmd&0xf0;   //写高四位
  81   1  =1          LCD_en();
  82   1  =1  }
  83      =1  
  84      =1  
  85      =1  /*--------------------------------------------------------------*/
  86      =1  //数据输入
  87      =1  void LCD_dat(unsigned char dat)
  88      =1  {
  89   1  =1          LCD_delay(15,1);                //40us
  90   1  =1          LCD_RS = 1;                             //数据
  91   1  =1          LCD_DATA &= 0x0f;               //清高四位
  92   1  =1          LCD_DATA |= dat&0xf0;   //写高四位
  93   1  =1          LCD_en();
  94   1  =1          dat <<= 4;                              //低四位移到高四位
  95   1  =1          LCD_DATA &= 0x0f;               //清高四位
  96   1  =1          LCD_DATA |= dat&0xf0;   //写高四位
  97   1  =1          LCD_en();
  98   1  =1  }
  99      =1  
 100      =1  
 101      =1  /*--------------------------------------------------------------*/
 102      =1  //液晶清屏
 103      =1  void LCD_clr(void)      
 104      =1  {
 105   1  =1          LCD_cmd(0x01);
 106   1  =1          LCD_delay(2, 249);              //2000-2 us
 107   1  =1  }
 108      =1  
 109      =1  
 110      =1  /*--------------------------------------------------------------*/
 111      =1  //液晶定位
 112      =1  void LCD_pos(unsigned char x, unsigned char y)
 113      =1  {
 114   1  =1          if(y)   LCD_cmd(x|0xc0);
 115   1  =1          else    LCD_cmd(x|0x80);
 116   1  =1  }
 117      =1  
 118      =1  
 119      =1  
 120      =1  /*--------------------------------------------------------------*/
 121      =1  //字符定位输出
 122      =1  void LCD_printc(unsigned char x, unsigned char y, unsigned char c)
 123      =1  {
 124   1  =1          LCD_pos(x, y);
 125   1  =1          LCD_dat(c);
 126   1  =1  }
 127      =1  
 128      =1  
 129      =1  /*--------------------------------------------------------------*/
 130      =1  //字符串定位输出
 131      =1  void LCD_prints(unsigned char x, unsigned char y, unsigned char *s)
 132      =1  {
 133   1  =1          LCD_pos(x, y);
 134   1  =1          while(*s)
 135   1  =1          {
 136   2  =1                  LCD_dat(*s);
 137   2  =1                  s++;
 138   2  =1          }
 139   1  =1  }
 140      =1  
 141      =1  
C51 COMPILER V7.06   LCD1602四_咔齙_                                                       08/10/2008 09:23:55 PAGE 7   

 142      =1  /*--------------------------------------------------------------*/
 143      =1  //字符串输出            //pos=-1 清屏   *s='\n' 换行   *s='\b' 退格
 144      =1  /*void LCD_fprints(unsigned char *s, signed char pos)
 145      =1  {
 146      =1          unsigned char i;
 147      =1          if(pos==-1)
 148      =1          {
 149      =1                  LCD_cmd(0x01);          //清屏
 150      =1                  LCD_delay(2, 249);      //2000-2 us
 151      =1                  pos = 0;
 152      =1          }
 153      =1          while(*s)
 154      =1          {
 155      =1                  switch(*s)
 156      =1                  {
 157      =1                  case '\n':                      //换行
 158      =1                          {       
 159      =1                                  if(pos < 17)
 160      =1                                  {
 161      =1                                          for(i = pos; i < 16; i++) 
 162      =1                                                  LCD_printc(i%16, i/16, ' ');
 163      =1                                          pos = 16;
 164      =1                                  }
 165      =1                                  else
 166      =1                                  {
 167      =1                                          for(i = pos; i < 32; i++) 
 168      =1                                                  LCD_printc(i%16, i/16, ' ');
 169      =1                                          pos = 32;
 170      =1                                  }
 171      =1                                  break;
 172      =1                          }
 173      =1  
 174      =1                  case '\b':                      //退格
 175      =1                          {
 176      =1                                  if(pos > 0)     pos--;
 177      =1                                  LCD_printc(pos%16, pos/16, ' ');
 178      =1                                  break;
 179      =1                          }
 180      =1  
 181      =1                  default:
 182      =1                          {
 183      =1                                  if(*s < 0x20) 
 184      =1                                          *s=' ';
 185      =1                                  LCD_printc(pos%16, pos/16, *s);
 186      =1                                  pos++;
 187      =1                                  break;
 188      =1                          }
 189      =1                  }
 190      =1                  s++;
 191      =1          }
 192      =1  }
 193      =1  */
 194      =1  
 195      =1  
 196      =1  /*--------------------------------------------------------------*/
 197      =1  #endif
 198      =1  
 199      =1   
 200      =1  
 201      =1  
 202      =1  
 203      =1  
C51 COMPILER V7.06   LCD1602四_咔齙_                                                       08/10/2008 09:23:55 PAGE 8   

 204      =1  
 205      =1  
   3          
   4          
   5          void main(void)
   6          {
   7   1              LCD_init();
   8   1              LCD_clr();
   9   1              LCD_prints(0,0,"Hello! I am glad");
  10   1              LCD_prints(4,1,"!*^ ^*!");
  11   1              LCD_printc(7,1,'_');
  12   1              /*LCD_clr();
  13   1              LCD_fprints("HA HA... \n!*^_^*!\b!",-1);*/
  14   1              while(1);
  15   1      }
C51 COMPILER V7.06   LCD1602四_咔齙_                                                       08/10/2008 09:23:55 PAGE 9   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION Com0017 (BEGIN)
0000         L?0024:
0000 53A00F            ANL     LCD_DATA,#0FH
0003 EC                MOV     A,R4
0004 54F0              ANL     A,#0F0H
0006 42A0              ORL     LCD_DATA,A
0008 120000      R     LCALL   LCD_en
000B EC                MOV     A,R4
000C C4                SWAP    A
000D 54F0              ANL     A,#0F0H
000F FC                MOV     R4,A
0010 53A00F            ANL     LCD_DATA,#0FH
0013 54F0              ANL     A,#0F0H
0015 42A0              ORL     LCD_DATA,A
0017 22                RET     
             ; FUNCTION Com0017 (END)

             ; FUNCTION L?0025 (BEGIN)
0000 AC07              MOV     R4,AR7
0002 7D01              MOV     R5,#01H
0004 7F0F              MOV     R7,#0FH
             ; FUNCTION _LCD_delay (BEGIN)
                                           ; SOURCE LINE # 39
;---- Variable 'n' assigned to Register 'R5' ----
;---- Variable 'm' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 40
                                           ; SOURCE LINE # 41
;---- Variable 'tempn' assigned to Register 'R5' ----
0006         ?C0003:
                                           ; SOURCE LINE # 42
;---- Variable 'tempm' assigned to Register 'R6' ----
0006 AE07              MOV     R6,AR7

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -