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

📄 lcddrv.lst

📁 各种器件的驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LCDDRV
OBJECT MODULE PLACED IN LCDdrv.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE LCDdrv.c ROM(COMPACT) OPTIMIZE(4,SIZE) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*      LCD128x64显示接口函数
   2                  魏东 2004-11-22 10:08'
   3          */
   4          #include "def_port.h"
   5          #define __SRC
   6          #include "lcddrv.h"
   7          #undef  __SRC
   8          #if lcd_put_en8x8_en
   9          #include "en8x8.h"
  10          #endif
  11          #if lcd_put_ch12x12_en
  12          #include "ch12x12.h"    /* 12x12点阵汉字库,如果不使用,至少保留1个作空显示 */
  13          #endif
  14          #if lcd_put_ch16x16_en
  15          #include "ch16x16.h"    /* 16x16点阵汉字库,如果不使用,至少保留1个作空显示 */
  16          #endif
  17          #if lcd_put_ch24x24_en
  18          #include "ch24x24.h"    /* 24x24点阵汉字库,如果不使用,至少保留1个作空显示 */
  19          #endif
  20          /***********************************************************************************/
  21          
  22          /* LCD复位 */
  23          #if lcd_reset_en
  24          void lcd_reset(void)
  25          {       unsigned int ui;
  26   1      
  27   1              L_RST = 0;                              /* 复位 */
  28   1              for(ui=0;ui<LCD_RST_DELAY;ui++) ;       /* 等待25mS */
  29   1              L_RST = 1;                              /* 工作 */
  30   1              for(ui=0;ui<LCD_RST_DELAY;ui++) ;       /* 等待25mS */
  31   1              lcd_fill(0);                            /* 清除显示数据 */
  32   1              lcd_x=0;
  33   1              lcd_y=0;
  34   1              _ch_id=0;
  35   1      }
  36          #endif
  37          
  38          /* LCD开显示 */
  39          #if lcd_on_en
  40          void lcd_on(void)
  41          {
  42   1              LCD_STA_SET2CS12;
  43   1              *LCD_STA=0x3f;
  44   1      }
  45          #endif
  46          
  47          /* LCD关显示 */
  48          #if lcd_off_en
  49          void lcd_off(void)
  50          {
  51   1              LCD_STA_SET2CS12;
  52   1              *LCD_STA=0x3e;
  53   1      }
  54          #endif
  55          
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 2   

  56          /* LCD显示滚卷 */
  57          #if lcd_roll_en
  58          void lcd_roll(unsigned char uc)
  59          {
  60   1              LCD_STA_SET2CS12;
  61   1              *LCD_STA=(uc&0x3f)|0xc0;
  62   1      }
  63          #endif
  64          
  65          /* 填充全屏LCD数据 */
  66          #if lcd_fill_en
  67          void lcd_fill(unsigned char cdt)
  68          {       unsigned char ccy,cci;
  69   1      
  70   1              LCD_STA_SET2CS12;
  71   1              LCD_DAT_SET2CS12;
  72   1              for(ccy=0;ccy<8;ccy++)
  73   1              {       *LCD_STA=ccy|0xb8;      /* Y坐标(x地址) */
  74   2                      *LCD_STA=0x40;  /* X坐标(y地址) */
  75   2                      for(cci=0;cci<64;cci++)
  76   2                      {       *LCD_DAT=cdt;   /* 数据 */
  77   3                      }
  78   2              }
  79   1              lcd_on();       /* LCD开显示 */
  80   1              lcd_x=0;
  81   1              lcd_y&=0xe0;
  82   1              _ch_id=0;
  83   1              return;
  84   1      }
  85          #endif
  86          
  87          /* 填充LCD数据(x坐标列,y低4位是坐标行(4点为1行)|高4位是填充数据,i填充列数) */
  88          #if lcd_fill_xy_en
  89          void lcd_fill_xy(unsigned char ccx,unsigned char ccy,unsigned char cci)
  90          {       unsigned char ccc;
  91   1              
  92   1              if((ccx+cci)>128) cci=128-ccx;
  93   1              cci=ccx+cci;
  94   1              for(;ccx<cci;ccx++)
  95   1              {       if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
  96   2                      {       LCD_STA_SET2CS2;
  97   3                              LCD_DAT_SET2CS2;
  98   3                      }
  99   2                      else
 100   2                      {       LCD_STA_SET2CS1;
 101   3                              LCD_DAT_SET2CS1;
 102   3                      }
 103   2                      /* 将原屏幕数据读出 */
 104   2                      LCD_STA = (ccx&0x3f)|0x40;              /* X坐标(y地址) */
 105   2                      LCD_STA = ((ccy>>1)&0x07)|0xb8;         /* Y坐标(x地址) */
 106   2                      ccc = * LCD_DAT;                        /* 读数据 */
 107   2                      LCD_STA = (ccx&0x3f)|0x40;      /* X坐标(y地址)(读完了y地址要自动加因此将y地址设回原来的值) */
 108   2                      if(ccy&1) LCD_DAT = (ccc&0x0f)|(ccy&0xf0);      /* 奇数行(下半整行) */
 109   2                      else LCD_DAT = (ccc&0xf0)|((ccy>>4)&0x0f);      /* 偶数行(上半整行) */
 110   2              }
 111   1      }
 112          #endif
 113          
 114          /* 选择LCD显示行高(最高位设置是否翻黑显示,其他位0:8;1:12;2:16;3:24) */
 115          #if lcd_set_chlib_en
 116          void lcd_set_chlib(unsigned char cch)
 117          {
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 3   

 118   1              lcd_y = (lcd_y&0x0f)|((cch<<5)&0x60)|(cch&0x80);
 119   1      }
 120          #endif
 121          
 122          /* 设置当前LCD显示位置 */
 123          #if lcd_moveto_en
 124          void lcd_moveto(unsigned char ccx,unsigned char ccy)
 125          {
 126   1              lcd_x = ccx;
 127   1              lcd_y = (lcd_y&0xe0) | (ccy&0x1f);
 128   1              _ch_id=0;
 129   1      }
 130          #endif
 131          
 132          /* LCD显示/清除一个点 */
 133          #if lcd_dot_en
 134          void lcd_dot(unsigned char ccx,unsigned char ccy,unsigned char dot)
 135          {       unsigned char ccc;
 136   1      
 137   1              if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
 138   1              {       LCD_STA_SET2CS2;
 139   2                      LCD_DAT_SET2CS2;
 140   2              }
 141   1              else
 142   1              {       LCD_STA_SET2CS1;
 143   2                      LCD_DAT_SET2CS1;
 144   2              }
 145   1              /* 将原屏幕数据读出 */
 146   1              *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址) */
 147   1              *LCD_STA = ((ccy>>3)&0x07)|0xb8;        /* Y坐标(x地址) */
 148   1              ccc = *LCD_DAT;         /* 读数据 */
 149   1              ccc = *LCD_DAT;         /* 读数据 */
 150   1              *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址)(读完了y地址要自动加因此将y地址设回原来的值) */
 151   1              if(dot) *LCD_DAT = ccc|(1<<(ccy&7));            /* 数据(显示) */
 152   1              else *LCD_DAT = ccc&((1<<(ccy&7))^0xff);        /* 数据(清除) */
 153   1      }
 154          #endif
 155          
 156          /* LCD显示发送一字符 */
 157          #if lcd_putchar_en
 158          char lcd_putchar (unsigned char c)
 159          {       unsigned char uc;
 160   1      
 161   1              lcd_y &= 0xef;  /* lcd_y最大0f(4*16=64点) */
 162   1              if(_ch_code)    /* 已有汉字第1字节,加第2字节后显示 */
 163   1              {       _ch_id=1;
 164   2                      _ch_code = _ch_code + c;
 165   2                      if((lcd_y&0x60)==0x60)          /* 24点阵汉字 */
 166   2                      {       if(lcd_x > 104)
 167   3                              {       lcd_x = 0;
 168   4                                      lcd_y +=6 ;
 169   4                              }
 170   3      #if lcd_put_ch24x24_en
 171   3                              lcd_put_ch24x24(lcd_x,lcd_y,_ch_code);
 172   3      #endif
 173   3                              lcd_x += 24;
 174   3                      }
 175   2                      else if((lcd_y&0x60)==0x40)     /* 16点阵汉字 */
 176   2                      {       if(lcd_x > 112)
 177   3                              {       lcd_x = 0;
 178   4                                      lcd_y += 4;
 179   4                              }
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 4   

 180   3      #if lcd_put_ch16x16_en
 181   3                              lcd_put_ch16x16(lcd_x,lcd_y,_ch_code);
 182   3      #endif
 183   3                              lcd_x += 16;
 184   3                      }
 185   2                      else                            /* 12点阵汉字 */
 186   2                      {       if(lcd_x > 116)
 187   3                              {       lcd_x = 0;
 188   4                                      lcd_y += 3;
 189   4                              }
 190   3      #if lcd_put_ch12x12_en
 191   3                              lcd_put_ch12x12(lcd_x,lcd_y,_ch_code);
 192   3      #endif
 193   3                              lcd_x += 12;
 194   3                      }
 195   2                      _ch_code=0;
 196   2                      return 2;
 197   2              }
 198   1              else            /* 这是第1字节 */
 199   1              {       if(c&0x80)
 200   2                      {       _ch_code = c*256;       /* 汉字第1字节 */
 201   3                              return 0;
 202   3                      }
 203   2                      else                    /* 8点阵字母 */
 204   2                      {       if((lcd_x>120)||(c=='\n'))
 205   3                              {       if((lcd_y&0x60)==0x60) lcd_y += 6;              /* 24点一行 */
 206   4                                      else if((lcd_y&0x60)==0x40) lcd_y += 4;         /* 16点一行 */
 207   4                                      else if((lcd_y&0x60)==0x20) lcd_y += 3;         /* 12点一行 */
 208   4                                      else if(_ch_id) lcd_y += 3;                     /* 本来是8点一行显了汉字按12点一行 */
 209   4                                      else lcd_y += 2;                                /* 8点一行 */
 210   4                                      lcd_x = 0;
 211   4                                      _ch_id=0;                                       /* 换行后清有汉字标志 */
 212   4                                      if(c=='\n') return 1;
 213   4                              }
 214   3                              if(c=='\r')
 215   3                              {       lcd_x=0;
 216   4                                      return 1;
 217   4                              }
 218   3      #if lcd_put_en8x8_en
 219   3                              if(lcd_y&0x80) uc=0xf0;         /* 空的填黑 */
 220   3                              else uc=0x00;                   /* 空的填白 */
 221   3                              if((lcd_y&0x60)==0x60)
 222   3                              {       lcd_fill_xy(lcd_x,(lcd_y&0x0f)|uc,8);           /* 空的填充 */
 223   4                                      lcd_fill_xy(lcd_x,((lcd_y+1)&0x0f)|uc,8);       /* 空的填充 */
 224   4                                      lcd_put_en8x8(lcd_x,lcd_y+2,c);                 /* 24点阵中下移2行(8点) */
 225   4                                      lcd_fill_xy(lcd_x,((lcd_y+4)&0x0f)|uc,8);       /* 空的填充 */
 226   4                                      lcd_fill_xy(lcd_x,((lcd_y+5)&0x0f)|uc,8);       /* 空的填充 */
 227   4                              }
 228   3                              else if(lcd_y&0x60)
 229   3                              {       lcd_fill_xy(lcd_x,(lcd_y&0x0f)|uc,8);           /* 空的填充 */
 230   4                                      lcd_put_en8x8(lcd_x,lcd_y+1,c);                 /* 16/12点阵中下移1行(4点) */
 231   4                                      if((lcd_y&0x60)==0x40) lcd_fill_xy(lcd_x,((lcd_y+3)&0x0f)|uc,8);        /* 空的填充 */
 232   4                              }
 233   3                              else lcd_put_en8x8(lcd_x,lcd_y,c);                      /* 8点阵 */
 234   3      #endif
 235   3                              lcd_x+=8;

⌨️ 快捷键说明

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