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

📄 lcddrv.lst

📁 各种器件的驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 236   3                              return 1;
 237   3                      }
 238   2              }
 239   1      }
 240          #endif
 241          
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 5   

 242          /* 显示一个8x8英文字符 */
 243          #if lcd_put_en8x8_en
 244          void lcd_put_en8x8(unsigned char x,unsigned char y,unsigned char en)
 245          {       
 246   1              en&=0x7f;
 247   1              if(en<0x20) en=0x20;
 248   1              en -= 0x20;
 249   1              if(y&0x01)      /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
 250   1              {       lcd_put(x,(y/2)|(y&0x80),&enlib_dat[en][0],8|0xa0);             /* 使用数据的低半作高半显示 */
 251   2                      lcd_put(x,(y/2+1)|(y&0x80),&enlib_dat[en][0],8|0xc0);   /* 使用数据的高半作低半显示 */
 252   2              }
 253   1              else    lcd_put(x,(y/2)|(y&0x80),&enlib_dat[en][0],8);
 254   1      }
 255          #endif
 256          
 257          /* 显示一个12x12点阵汉字 */
 258          #if lcd_put_ch12x12_en
 259          void lcd_put_ch12x12(unsigned char x,unsigned char y,unsigned int ch)
 260          {       unsigned char ci;
 261   1                                              /* 在字库中查找汉字 */
 262   1              for(ci=0;ci<ch12x12_num;ci++) if(ch12x12_code[ci]==ch) break;
 263   1              if(ci>=ch12x12_num) ci=0;       /* 没有找到0总是全空 */
 264   1              if(y&0x01)      /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
 265   1              {       lcd_put(x,(y/2)|(y&0x80),&ch12x12_dat[ci][0],12|0xa0);          /* 使用数据的低半作高半显示 */
 266   2                      lcd_put(x,(y/2+1)|(y&0x80),&ch12x12_dat[ci][0],12|0xc0);                /* 使用数据的高半作低半显示 */
 267   2                      lcd_put(x,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0xa0);                /* 使用数据的低半作高半显示 */
 268   2                      lcd_put(x+6,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0xe0);      /* 使用数据的高半作高半显示 */
 269   2              }
 270   1              else
 271   1              {       lcd_put(x,(y/2)|(y&0x80),&ch12x12_dat[ci][0],12);
 272   2                      lcd_put(x,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0x80);                /* 使用数据的低半作低半显示 */
 273   2                      lcd_put(x+6,(y/2+1)|(y&0x80),&ch12x12_dat[ci][12],6|0xc0);      /* 使用数据的高半作低半显示 */
 274   2              }
 275   1      }
 276          #endif
 277          
 278          /* 显示一个24x24点阵汉字 */
 279          #if lcd_put_ch24x24_en
 280          void lcd_put_ch24x24(unsigned char x,unsigned char y,unsigned int ch)
 281          {       unsigned char ci;
 282   1                                              /* 在字库中查找汉字 */
 283   1              for(ci=0;ci<ch24x24_num;ci++) if(ch24x24_code[ci]==ch) break;
 284   1              if(ci>=ch24x24_num) ci=0;       /* 没有找到0总是全空 */
 285   1              if(y&0x01)      /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
 286   1              {       lcd_put(x,(y/2)|(y&0x80),&ch24x24_dat[ci][0],24|0xa0);  /* 使用数据的低半作高半显示 */
 287   2                      lcd_put(x,(y/2+1)|(y&0x80),&ch24x24_dat[ci][0],24|0xc0);        /* 使用数据的高半作低半显示 */
 288   2                      lcd_put(x,(y/2+1)|(y&0x80),&ch24x24_dat[ci][24],24|0xa0);       /* 使用数据的低半作高半显示 */
 289   2                      lcd_put(x,(y/2+2)|(y&0x80),&ch24x24_dat[ci][24],24|0xc0);       /* 使用数据的高半作低半显示 */
 290   2                      lcd_put(x,(y/2+2)|(y&0x80),&ch24x24_dat[ci][48],24|0xa0);       /* 使用数据的低半作高半显示 */
 291   2                      lcd_put(x,(y/2+3)|(y&0x80),&ch24x24_dat[ci][48],24|0xc0);       /* 使用数据的高半作低半显示 */
 292   2              }
 293   1              else
 294   1              {       lcd_put(x,(y/2)|(y&0x80),&ch24x24_dat[ci][0],24);
 295   2                      lcd_put(x,(y/2+1)|(y&0x80),&ch24x24_dat[ci][24],24);
 296   2                      lcd_put(x,(y/2+2)|(y&0x80),&ch24x24_dat[ci][48],24);
 297   2              }
 298   1      }
 299          #endif
 300          
 301          /* 显示一个16x16点阵汉字 */
 302          #if lcd_put_ch16x16_en
 303          void lcd_put_ch16x16(unsigned char x,unsigned char y,unsigned int ch)
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 6   

 304          {       unsigned char ci;
 305   1                                              /* 在字库中查找汉字 */
 306   1              for(ci=0;ci<ch16x16_num;ci++) if(ch16x16_code[ci]==ch) break;
 307   1              if(ci>=ch16x16_num) ci=0;       /* 没有找到0总是全空 */
 308   1              else    /* 16点阵汉字 */
 309   1              {       if(y&0x01)      /* 一半的地方开始的 100低半作低半 101低半作高半 110高半作低半 111高半作高半 */
 310   2                      {       lcd_put(x,(y/2)|(y&0x80),&ch16x16_dat[ci][0],16|0xa0);  /* 使用数据的低半作高半显示 */
 311   3                              lcd_put(x,(y/2+1)|(y&0x80),&ch16x16_dat[ci][0],16|0xc0);        /* 使用数据的高半作低半显示 */
 312   3                              lcd_put(x,(y/2+1)|(y&0x80),&ch16x16_dat[ci][16],16|0xa0);       /* 使用数据的低半作高半显示 */
 313   3                              lcd_put(x,(y/2+2)|(y&0x80),&ch16x16_dat[ci][16],16|0xc0);       /* 使用数据的高半作低半显示 */
 314   3                      }
 315   2                      else
 316   2                      {       lcd_put(x,(y/2)|(y&0x80),&ch16x16_dat[ci][0],16);
 317   3                              lcd_put(x,(y/2+1)|(y&0x80),&ch16x16_dat[ci][16],16);
 318   3                      }
 319   2              }
 320   1      }
 321          #endif
 322          
 323          /* 写LCD显示 */
 324          #if lcd_put_en
 325          void lcd_put(unsigned char ccx,unsigned char ccy,unsigned char *cdt,unsigned char cclen)
 326          {       unsigned char cci,ccc;
 327   1      
 328   1              if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
 329   1              {       LCD_STA_SET2CS2;
 330   2                      LCD_DAT_SET2CS2;
 331   2              }
 332   1              else
 333   1              {       LCD_STA_SET2CS1;
 334   2                      LCD_DAT_SET2CS1;
 335   2              }
 336   1              *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址) */
 337   1              *LCD_STA = (ccy&0x07)|0xb8;     /* Y坐标(x地址) */
 338   1              for(cci=0;cci<(cclen&0x1f);cci++)
 339   1              {       if(cclen&0x80)  /* 只使用数据的半字节,需要将原屏幕数据读出 */
 340   2                      {       *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址) */
 341   3                              ccc = *LCD_DAT;         /* 读数据 */
 342   3                              ccc = *LCD_DAT;         /* 读数据 */
 343   3                              *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址)(读完了y地址要自动加因此将y地址设回原来的值) */
 344   3                              if(ccy&0x80) ccc=ccc^0xff;      /* 要反显,读出数据先非 */
 345   3                              if((cclen&0xe0)==0x80)          /* 100低半作低半 */
 346   3                                      ccc = (ccc&0xf0)|(cdt[cci]&0x0f);
 347   3                              else if((cclen&0xe0)==0xa0)     /* 101低半作高半 */
 348   3                                      ccc = (ccc&0x0f)|((cdt[cci]&0x0f)<<4);
 349   3                              else if((cclen&0xe0)==0xc0)     /* 110高半作低半 */
 350   3                                      ccc = (ccc&0xf0)|((cdt[cci]&0xf0)>>4);
 351   3                              else                            /* 111高半作高半 */
 352   3                                      ccc = (ccc&0x0f)|(cdt[cci]&0xf0);
 353   3                      }
 354   2                      else ccc=cdt[cci];
 355   2                      if(ccy&0x80) *LCD_DAT = ccc^0xff;       /* P0口发数据 */
 356   2                      else *LCD_DAT = ccc;
 357   2                      ccx++;
 358   2                      if((ccx&0x3f)==0)       /* 换左右半 */
 359   2                      {       if((ccx&0x7f)==0) ccx=0x7f;     /* 超过不换行 */
 360   3                              if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
 361   3                              {       LCD_STA_SET2CS2;
 362   4                                      LCD_DAT_SET2CS2;
 363   4                              }
 364   3                              else
 365   3                              {       LCD_STA_SET2CS1;
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 7   

 366   4                                      LCD_DAT_SET2CS1;
 367   4                              }
 368   3                              *LCD_STA = (ccx&0x3f)|0x40;     /* x地址 */
 369   3                              *LCD_STA = (ccy&0x07)|0xb8;     /* y地址 */
 370   3                      }
 371   2              }
 372   1      }
 373          #endif
 374          
 375          /* 写LCD数据 */
 376          #if lcd_write_en
              void lcd_write(unsigned char ccx,unsigned char ccy,unsigned char *cdt,unsigned char cclen)
              {       unsigned char cci;
              
                      if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
                      {       LCD_STA_SET2CS2;
                              LCD_DAT_SET2CS2;
                      }
                      else
                      {       LCD_STA_SET2CS1;
                              LCD_DAT_SET2CS1;
                      }
                      if(ccy&0x80)            /* 根据Y坐标bit7决定是写数据还是状态 */
                      {       if(cdt[0]&0x80)
                                      *LCD_STA = (cdt[0]&0x01)|0x3e;  /* 开关显示 */
                              else
                                      *LCD_STA = cdt[0]|0xc0;         /* 数据卷滚 */
                      }
                      else
                      {       *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址) */
                              *LCD_STA = (ccy&0x07)|0xb8;     /* Y坐标(x地址) */
                              for(cci=0;cci<cclen;cci++)
                              {       *LCD_DAT = cdt[cci];    /* P0口发数据 */
                                      ccx++;
                                      if((ccx&0x3f)==0)       /* 换左右半 */
                                      {       if((ccx&0x7f)==0)       /* 换行 */
                                              {       ccy++;          /* Y坐标加1 */
                                                      ccx=0;          /* X坐标回0 */
                                              }
                                              if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
                                              {       LCD_STA_SET2CS2;
                                                      LCD_DAT_SET2CS2;
                                              }
                                              else
                                              {       LCD_STA_SET2CS1;
                                                      LCD_DAT_SET2CS1;
                                              }
                                              *LCD_STA = 0x40;        /* X坐标(y地址) */
                                              *LCD_STA = (ccy&0x07)|0xb8;     /* Y坐标(x地址) */
                                      }
                              }
                      }
              }
              #endif
 420          
 421          /* 读LCD数据 */
 422          #if lcd_read_en
              void lcd_read(unsigned char ccx,unsigned char ccy,unsigned char *cdt,unsigned char cclen)
              {       unsigned char cci;
              
                      if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
                      {       LCD_STA_SET2CS2;
C51 COMPILER V7.50   LCDDRV                                                                09/25/2005 15:49:03 PAGE 8   

                              LCD_DAT_SET2CS2;
                      }
                      else
                      {       LCD_STA_SET2CS1;
                              LCD_DAT_SET2CS1;
                      }
                      if(ccy&0x80)            /* 根据Y坐标bit7决定是写数据还是状态 */
                      {       cdt[0] = *LCD_STA;      /* 状态数据 */
                      }
                      else
                      {       *LCD_STA = (ccx&0x3f)|0x40;     /* X坐标(y地址) */
                              *LCD_STA = (ccy&0x07)|0xb8;     /* Y坐标(x地址) */
                              for(cci=0;cci<cclen;cci++)
                              {       cdt[cci] = *LCD_DAT;    /* 数据 */
                                      ccx++;
                                      if((ccx&0x3f)==0)       /* 换左右半 */
                                      {       if((ccx&0x7f)==0)       /* 换行 */
                                              {       ccy++;          /* Y坐标加1 */
                                                      ccx=0;          /* X坐标回0 */
                                              }
                                              if(ccx&0x40)    /* 根据X地址bit6选择左右半 */
                                              {       LCD_STA_SET2CS2;
                                                      LCD_DAT_SET2CS2;
                                              }
                                              else
                                              {       LCD_STA_SET2CS1;
                                                      LCD_DAT_SET2CS1;
                                              }
                                              *LCD_DAT = 0x40;        /* X坐标(y地址) */
                                              *LCD_DAT = (ccy&0x07)|0xb8;     /* Y坐标(x地址) */
                                      }
                              }
                      }
              }
              #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2424    ----
   CONSTANT SIZE    =   2028    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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