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

📄 lcd1602.lst

📁 lcd液晶驱动显示原代码 根据硬件自己修改
💻 LST
字号:
C51 COMPILER V8.02   LCD1602                                                               09/14/2006 22:59:04 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: D:\Program-English\keil\C51\BIN\C51.EXE LCD1602.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //#include <iom8v.h> 
   2          //#include <macros.h> 
   3          #include "LCD1602.h"
   4          /********************************************************** 
   5          光标命令 
   6          lcd_write_command(0x0e,0);//光标开 
   7          lcd_write_command(0x0d,0);//光标所在字符闪烁   
   8          lcd_write_command(0x0c,0); //光标关  
   9          lcd_write_command(0x07,0); //屏幕左移
  10          
  11          **********************************************************/ 
  12          
  13          /*------------------------------------液晶驱动函数-------------------------------------*/ 
  14          void lcd_init_portDB(void) 
  15          { 
  16   1         lcd_data_port=0xff; 
*** ERROR C202 IN LINE 16 OF LCD1602.C: 'PORTB': undefined identifier
  17   1         lcd_data_ddr=0xff; 
*** ERROR C202 IN LINE 17 OF LCD1602.C: 'DDRB': undefined identifier
  18   1         lcd_control_port=0x07; 
*** ERROR C202 IN LINE 18 OF LCD1602.C: 'PORTC': undefined identifier
  19   1         lcd_control_ddr=0x07; 
*** ERROR C202 IN LINE 19 OF LCD1602.C: 'DDRC': undefined identifier
  20   1      } 
  21          
  22          //液晶初始化 
  23          void lcd_init(void) 
  24          { 
  25   1         delay_nms(15); 
  26   1         lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否) 
  27   1         delay_nms(5); 
  28   1         lcd_write_command(0x38,0); 
  29   1         delay_nms(5); 
  30   1         lcd_write_command(0x38,0); 
  31   1         delay_nms(5); 
  32   1          
  33   1         lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲) 
  34   1         lcd_write_command(0x08,1);//显示关闭 
  35   1         lcd_write_command(0x01,1);//显示清屏 
  36   1         lcd_write_command(0x06,1);//显示光标移动设置 
  37   1         lcd_write_command(0x0c,1);//显示开及光标设置 
  38   1      } 
  39          
  40          //写指令函数: E=高脉冲 RS=0 RW=0 
  41          void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测L
             -CD忙信号 
  42          { 
  43   1         if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲 
  44   1         lcd_control_port&=~lcd_RS;//RS=0 
*** ERROR C202 IN LINE 44 OF LCD1602.C: 'PORTC': undefined identifier
  45   1         lcd_control_port&=~lcd_RW;//RW=0 
*** ERROR C202 IN LINE 45 OF LCD1602.C: 'PORTC': undefined identifier
  46   1         lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲 
*** ERROR C202 IN LINE 46 OF LCD1602.C: 'PORTC': undefined identifier
  47   1         NOP(); 
C51 COMPILER V8.02   LCD1602                                                               09/14/2006 22:59:04 PAGE 2   

  48   1         lcd_control_port|=lcd_EN;//E=1 
  49   1         lcd_data_port=command; 
  50   1         lcd_control_port&=~lcd_EN;//重设E=0 
  51   1      } 
  52          
  53          //写数据函数: E =高脉冲 RS=1 RW=0 
  54          void lcd_write_data(unsigned char char_data) 
  55          { 
  56   1         wait_enable();//等待LCD空闲 
  57   1         lcd_control_port|=lcd_RS;//RS=1 
  58   1         lcd_control_port&=~lcd_RW;//RW=0 
  59   1         lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲 
  60   1         NOP(); 
  61   1         lcd_control_port|=lcd_EN;//E=1 
  62   1         lcd_data_port=char_data; 
  63   1         lcd_control_port&=~lcd_EN;//重设E=0 
  64   1      } 
  65          
  66          //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。 
  67          //检测忙信号,等待LCD空闲函数 
  68          void wait_enable(void) 
  69          { 
  70   1         lcd_busy_ddr&=~busy;//设置busy口为输入 
  71   1         lcd_control_port&=~lcd_RS;//RS=0 
  72   1         lcd_control_port|=lcd_RW;//RW=1 
  73   1         NOP(); 
  74   1         lcd_control_port|=lcd_EN;//E=1 
  75   1         while(lcd_busy_pin&busy);//等待LCD_DB7为0 
  76   1         lcd_control_port&=~lcd_EN;//重设E=0 
  77   1         lcd_busy_ddr|=busy;//设置busy口为输出 
  78   1      } 
  79          /**LCD_set_xy:设置LCD显示的起始位置输入参数:x、y :  
  80                              显示字符串的位置,X:0-15,Y:0-1 
  81                              LCD第一行显示寄存器地址:0X80-0X8F 
  82                              LCD第一行显示寄存器地址:0XC0-0XCF   ***/ 
  83          void lcd_set_xy( unsigned char x, unsigned char y ) 
  84          { 
  85   1          unsigned char address; 
  86   1          if (y == 0)  
  87   1             address = 0x80 + x; 
  88   1          else  
  89   1              address = 0xc0 + x; 
  90   1          lcd_write_command(address,1);//一定需要检查忙信号,所以为1 
  91   1      } 
  92          //显示一个字符函数 
  93          void display_a_char(unsigned char x,unsigned char y,unsigned char char_data)//char_data为要显示的字符 
  94          { 
  95   1          lcd_set_xy(x,y); 
  96   1          lcd_write_data(char_data); 
  97   1      } 
  98          
  99          //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符 
 100          //显示一行连续字符串函数 
 101          
 102          void display_a_string(unsigned char x,unsigned char y,unsigned char *ptr) 
 103          { 
 104   1      //ptr:指向无符号字符型变量的指针变量,指针也就是地址,指字符串数组的首指针 
 105   1          lcd_set_xy(x,y); 
 106   1         while(*ptr)//当ptr='\0'(空指针null)跳出循环 
 107   1          { 
 108   2           lcd_write_data(*ptr);//*ptr,指向该地址的内容 
 109   2           ptr++; 
C51 COMPILER V8.02   LCD1602                                                               09/14/2006 22:59:04 PAGE 3   

 110   2          } 
 111   1      }
 112          /*********************流动字幕***********************/
 113          void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr) 
 114                                          { lcd_write_command(0x07,1);//流动字幕
 115   1                                        lcd_set_xy(x,y);
 116   1                                        while(*ptr)
 117   1                                          {
 118   2                                           lcd_write_data(*ptr);
 119   2                                           delay_nms(200);
 120   2                                               ptr++;
 121   2                                              }
 122   1                                      }
 123                                          
 124                          
 125          void delay_1ms(void )  //延时1ms 
 126          { 
 127   1         unsigned int i ; 
 128   1         unsigned char xtal; 
 129   1         xtal=4; 
 130   1         for (i=1;i<(xtal*143-2);i++) 
 131   1         { 
 132   2          ; 
 133   2         }    
 134   1      } 
 135          
 136          void delay_nms(unsigned int n)  //延时nms 
 137          { 
 138   1         unsigned int i=0 ;  
 139   1         for(i=0;i<n;i++) 
 140   1         { 
 141   2          delay_1ms();  
 142   2         } 
 143   1      }        
 144                  void keyboard(void)
 145           {
 146   1        int i;
 147   1        while (1)
 148   1          {
 149   2           i=~PIND;
 150   2               i&=0xf0;
 151   2               if(i==speedadd) { 
 152   3                                   if(setspeed==maxspeed)setspeed=minspeed;
 153   3                                   else setspeed++;
 154   3                                               conver_BCD(1000,str10);
 155   3                                               lcd_write_command(0x01,0);
 156   3                                               lcd_display_full();
 157   3                                       }
 158   2               if(i==speeddec){
 159   3                                   if(setspeed==minspeed)setspeed=maxspeed;
 160   3                                   else setspeed--;
 161   3                                               lcd_write_command(0x01,0);
 162   3                                               I++;
 163   3                                               if (I>=3)I=0;  
 164   3                                               lcd_display_full();
 165   3                                       }
 166   2           if(i==speedok) {                             
 167   3                                           break;
 168   3                                
 169   3                                   }
 170   2               delay_nms(100);
 171   2               
C51 COMPILER V8.02   LCD1602                                                               09/14/2006 22:59:04 PAGE 4   

 172   2              }
 173   1       }      
 174          ///////////////////////////////////////////////////////////////
 175          void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr) 
 176                                          { lcd_write_command(0x07,1);//流动字幕
 177   1                                        lcd_set_xy(x,y);
 178   1                                        while(*ptr)
 179   1                                          {
 180   2                                           lcd_write_data(*ptr);
 181   2                                           delay_nms(200);
 182   2                                               ptr++;
 183   2                                              }
 184   1                                      }
 185          //------------------------------------------------------                                
 186          void copy (unsigned char x[],unsigned char *y,unsigned char i)
 187                   {
 188   1                while (*y){x[i]=*y; *y++; i++;}
 189   1               }
 190          //------------------------------------------------------------
 191          void lcd_display_full(void)
 192               {   
 193   1                if(I==0){lcd_display(str1,str10,str2,str20);}
 194   1                if(I==1){lcd_display(str2,str20,str3,str30);}
 195   1                if(I==2){lcd_display(str3,str30,str4,str40);}
 196   1                if(I==3){lcd_display(str4,str40,str1,str10);}         
 197   1               }
 198          //------------------------------------------------------------------------
 199          void lcd_display(unsigned char x0[],unsigned char x1[],unsigned char y0[],unsigned char y1[])
 200                   {
 201   1                      display_a_string(0,0,x0);
 202   1                  display_a_string(7,0,x1);
 203   1                      display_a_string(0,1,y0);
 204   1                      display_a_string(7,1,y1);
 205   1               }
 206          void conver_BCD(int x,unsigned char string[])
 207                  {int i;
 208   1               for(i=0;i<4;i++)
 209   1               {string[i]=(char)x%10;x/=10;}
 210   1               }              
 211          
 212            /***********这些是1602的流动字幕的一些程序
 213             display_a_fluid(16,0,welcome);
 214             lcd_write_command(0x01,1);//显示清屏
 215             lcd_write_command(0x06,1);//显示光标移动设置 */
 216             
 217             
 218          /*lcd_write_command(0x07,1); //屏幕右移,内容左移
 219             lcd_set_xy(8,0);
 220             for(i=0;welcome[i]!='\0';i++)
 221                {
 222                     lcd_write_data(welcome[i]);  
 223                     delay_nms(200);
 224                   }
 225                  lcd_write_command(0x01,1);//显示清屏 
 226             lcd_write_command(0x06,1);//显示光标移动设置 */
 227          
 228             
 229          /*  键盘判断
 230          DDRD&=0X0F;
 231           PORTD|=0xf0;
 232           testkey=PIND;
 233           testkey=~testkey;
C51 COMPILER V8.02   LCD1602                                                               09/14/2006 22:59:04 PAGE 5   

 234           testkey&=0xf0;  */

C51 COMPILATION COMPLETE.  0 WARNING(S),  7 ERROR(S)

⌨️ 快捷键说明

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