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

📄 lcd_fun.lst

📁 使用51单片机作为控制器
💻 LST
📖 第 1 页 / 共 2 页
字号:
 255   3                                              dat=~dat&0x0f;
 256   3                                      if(r1)                            //避免写完第二行再写第一行时候有冲突。
 257   3                                              iTmp=~iTmp&0xf0;
 258   3                                      dat |= iTmp;
 259   3                                      LCD_write_byte(dat,1);
 260   3                              }
 261   2                              break;
 262   2                      case    1:
 263   2                  if(reverse)
 264   2                                              r1=1;//如果本行有反显;
 265   2                              else
 266   2                                              r1=0;
 267   2                              for(i=0;i<12;i++) {                                             // 显示高4位
 268   3                                      iTmp = gLCDScr[0][gLCDy];                       // 
 269   3                                      iTmp = gFontLib[iTmp][i+12];
 270   3                                      dat = gFontLib[iIndex][i];
 271   3                      if(reverse)
 272   3                                              dat=~dat;
 273   3                                      dat <<= 4;
 274   3                      if(r0)//如果第一行有反显。避免写完第一行再写第二行有冲突;
 275   3                                              iTmp=~iTmp&0x0f;                
 276   3                                      dat |= iTmp;
 277   3                                      LCD_write_byte(dat,1);
 278   3                              }
 279   2                              LCD_set_XY(gLCDy*12,2);
 280   2                              for(i=0;i<12;i++) {                                             // 显示低8位
 281   3                                      iTmp = gFontLib[iIndex][i]>>4;
 282   3                                      dat = gFontLib[iIndex][i+12]<<4;
 283   3                                      dat |= iTmp;
 284   3                                      if(r1)
 285   3                                              dat=~dat;
 286   3                                      LCD_write_byte(dat,1);
 287   3                              }
 288   2                              break;
 289   2                      case    2:
 290   2                              if(reverse)
 291   2                              {       for(i=0;i<12;i++){                                              // 显示高8位
 292   4                                              LCD_write_byte(~gFontLib[iIndex][i],1);
 293   4                                      }
 294   3                                      r2=1;
 295   3                              }
 296   2                              else
 297   2                              {       for(i=0;i<12;i++){                                              // 显示高8位
 298   4                                              LCD_write_byte(gFontLib[iIndex][i],1);
 299   4                                      }
 300   3                                      r2=0;
 301   3                              }
 302   2                              LCD_set_XY(gLCDy*12,4);
 303   2                              for(i=0;i<12;i++) {                                             // 显示低4位
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 6   

 304   3                                      iTmp = gLCDScr[3][gLCDy];                       // 
 305   3                                      iTmp = gFontLib[iTmp][i];
 306   3                                      iTmp <<= 4;
 307   3                                      dat = gFontLib[iIndex][i+12];
 308   3                                      if(r2)
 309   3                                              dat=~dat&0x0f;
 310   3                                      if(r3)                           
 311   3                                              iTmp=~iTmp&0xf0;                
 312   3                                      dat |= iTmp;
 313   3                                      LCD_write_byte(dat,1);
 314   3                                      }
 315   2                              break;
 316   2                      case    3:
 317   2                              if(reverse)
 318   2                                      r3=1;//如果本行有反显;
 319   2                              else
 320   2                                      r3=0;
 321   2                              for(i=0;i<12;i++) {                                             // 显示高4位
 322   3                                      iTmp = gLCDScr[2][gLCDy];                       // 
 323   3                                      iTmp = gFontLib[iTmp][i+12];
 324   3                                      dat = gFontLib[iIndex][i];
 325   3                      if(reverse)
 326   3                                              dat=~dat;
 327   3                                      dat <<= 4;
 328   3                                      if(r2)//如果第三行有反显。避免写完第四行再写第三行有冲突;
 329   3                                              iTmp=~iTmp&0x0f;                
 330   3                                      dat |= iTmp;
 331   3                                      LCD_write_byte(dat,1);
 332   3                                      }
 333   2                              LCD_set_XY(gLCDy*12,5);
 334   2                              for(i=0;i<12;i++) {                                             // 显示低8位
 335   3                                      iTmp = gFontLib[iIndex][i]>>4;
 336   3                                      dat = gFontLib[iIndex][i+12]<<4;
 337   3                                      dat |= iTmp;
 338   3                      if(r3)
 339   3                                              dat=~dat;
 340   3                                      LCD_write_byte(dat,1);
 341   3                                      }
 342   2                              break;
 343   2                      default:
 344   2                              ;
 345   2              }
 346   1              gLCDy ++;
 347   1              if(gLCDy>6) {
 348   2                      gLCDy = 0;
 349   2                      gLCDx ++;
 350   2                      }
 351   1              if(gLCDx>3)
 352   1                      gLCDx = 0;
 353   1                      
 354   1      }
 355          //---------------------------正/反显示多个汉字------------------------------- 
 356          //因为每一行只有一个正反标志位,所以反显移动时,只能纵向。
 357          void LCD_puts(unsigned char iIndex[],bit reverse)
 358          {
 359   1              unsigned char data i=0;
 360   1              while(iIndex[i]){
 361   2                      LCD_putc(iIndex[i++], reverse);
 362   2                      }
 363   1      }
 364          
 365          //---------------修改putc函数,用于printf直接输出到液晶,只支持英文------------
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 7   

 366          bit printf_reverse=0;
 367          char putchar(char c)
 368          {
 369   1              LCD_write_char(c,printf_reverse);
 370   1          return 0;
 371   1      }
 372          //----------------条项显示函数,在函数一个制定位置显示条项文字-------------------
 373          //*s条项文字字符串;r0 c0,条项文字起始坐标;c1,条项文字的尾坐标;Mode,对齐方式
 374          /*void GUI_DispStringAtBar(unsigned char *s,unsigned char r0, unsigned char c0,
 375          unsigned char c1,unsigned char Mode)
 376          {   unsigned char data i,Cnt;
 377                  if(Mode==0)//左对齐
 378                  {       
 379                          LCD_set_RC(r0,c0);
 380                          for(i=0;i<c1-c0;i++)
 381                             LCD_putc(*(s+i),0);          
 382                  }
 383                  if(Mode==1)//居中
 384                  {
 385                          for(Cnt=0;*(s+Cnt);Cnt++);//计算所要显示的字体个数。
 386                          LCD_set_RC(r0,(c1-c0-Cnt)/2+c0);
 387                          for(i=0;i<Cnt;i++)
 388                                  LCD_putc(*(s+i),0);             
 389                  }
 390                  if(Mode==2)//右对齐
 391                  {       for(Cnt=0;*(s+Cnt)!=0;Cnt++);//计算所要显示的字体个数。
 392                          LCD_set_RC(r0,c1-Cnt);
 393                          for(i=0;i<Cnt;i++)
 394                                  LCD_putc(*(s+i),0);     
 395                  }
 396          }*/
 397          //-------------------------------比上一个函数增加反显----------------------------
 398          void GUI_DispStringAt(unsigned char *s,unsigned char r0, unsigned char c0,
 399          unsigned char c1,unsigned char Mode,bit reverse)
 400          {   unsigned char data i,Cnt;
 401   1              for(Cnt=0;*(s+Cnt)!=0;Cnt++);//计算所要显示的字体个数。
 402   1              LCD_set_RC(r0,c0);
 403   1              if(Mode==0)//左对齐
 404   1              {       
 405   2                      for(i=0;*(s+i);i++)
 406   2                         LCD_putc(*(s+i),reverse);//写字符
 407   2                      for(i=0;i<c1-c0-Cnt;i++)       //写零
 408   2                         LCD_putc(0,reverse);                         
 409   2              }
 410   1              if(Mode==1)//居中
 411   1              {   
 412   2              for(i=0;i<(c1-c0-Cnt)/2;i++)
 413   2                              LCD_putc(0,reverse);
 414   2                      for(i=0;i<Cnt;i++)
 415   2                              LCD_putc(*(s+i),reverse);
 416   2                      for(i=0;i<c1-c0-Cnt-1;i++)
 417   2                              LCD_putc(0,reverse);                            
 418   2              }
 419   1              if(Mode==2)//右对齐(未完成)
 420   1              {       
 421   2                      LCD_set_RC(r0,c1-Cnt);
 422   2                      for(i=0;i<Cnt;i++)
 423   2                              LCD_putc(*(s+i),0);     
 424   2              }
 425   1      }
 426          //-----------------------滚动条显示--------------------------------------------
 427          //itembar所要显示项数,当前所在项数目;
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 8   

 428          #define BARBITLONG 32 //滚动杆像数长度。
 429          #define LCDXEND 83 //x坐标最大值
 430          void GUI_ScrollBar(unsigned char Item,unsigned char curbar)
 431          {   uchar data i;//用做计数辅助以及计算结果暂存器,避免重复计算。
 432   1          uchar data SmalBarStar;//滚动条开始像素位置
 433   1          uchar data SmalBarEnd;//滚动条结束像素位置
 434   1      
 435   1              i=BARBITLONG/Item;//暂存小滚动条像素长度。
 436   1          SmalBarStar=curbar*i;//滚动条开始像素位置
 437   1          SmalBarEnd=(curbar+1)*i;//滚动条结束像素位置
 438   1          for(i=0;i<BARBITLONG/8;i++)
 439   1              {   LCD_set_XY(LCDXEND-2,i);
 440   2                      LCD_write_byte(0,1);
 441   2                      LCD_write_byte(0xff,1); 
 442   2              LCD_write_byte(0,1); 
 443   2              }
 444   1          if(BARBITLONG%8)
 445   1              {
 446   2                      LCD_set_XY(LCDXEND-2,BARBITLONG/8);
 447   2                      LCD_write_byte(0,1);
 448   2                      LCD_write_byte(0xff>>(8-BARBITLONG%8),1); 
 449   2              LCD_write_byte(0,1); 
 450   2              }
 451   1      //----滚动条横夸两字节时候---------
 452   1          LCD_set_XY(LCDXEND-2,SmalBarStar/8);        //显示第一字节部分
 453   1          LCD_write_byte(0xff<<(SmalBarStar%8),1);
 454   1          LCD_set_XY(LCDXEND,SmalBarStar/8);
 455   1          LCD_write_byte(0xff<<(SmalBarStar%8),1);
 456   1          if(SmalBarEnd!=BARBITLONG) //当不是拉到最后
 457   1          {
 458   2                  LCD_set_XY(LCDXEND-2,SmalBarEnd/8);        //显示第二字节部分
 459   2                  LCD_write_byte(0xff>>(8-SmalBarEnd%8),1);
 460   2                  LCD_set_XY(LCDXEND,SmalBarEnd/8);
 461   2                  LCD_write_byte(0xff>>(8-SmalBarEnd%8),1);
 462   2          }
 463   1          for(i=1;i<(char)(SmalBarEnd/8-SmalBarStar/8);i++)//当滚动条长度大于一个字节的时候。
 464   1          {
 465   2                      LCD_set_XY(LCDXEND-2,SmalBarStar/8+i);
 466   2              LCD_write_byte(0xff,1);
 467   2              LCD_set_XY(LCDXEND,SmalBarStar/8+i);
 468   2              LCD_write_byte(0xff,1);
 469   2              }
 470   1          LCD_set_XY(73,0);
 471   1          printf("%d",(uint)(curbar+1));
 472   1      }
 473          //---------------------------------英文条项层-----------------------
 474          void LCD_write_english_bar(unsigned char *s,unsigned char x0, unsigned char y0,
 475          unsigned char x1,unsigned char Mode,bit reverse)
 476          {   unsigned char i,Cnt;
 477   1              for(Cnt=0;*(s+Cnt)!=0;Cnt++);//计算所要显示的字符个数。
 478   1              LCD_set_XY(x0,y0);
 479   1              if(Mode==0)//左对齐
 480   1              {       
 481   2                      for(i=0;*(s+i);i++)
 482   2                         LCD_write_char(*(s+i),reverse);//写字符
 483   2                      for(i=0;i<(x1-x0)/6-Cnt;i++)       //写零
 484   2                         LCD_write_char(' ',reverse);                         
 485   2              }
 486   1              if(Mode==1)//居中
 487   1              {   
 488   2              for(i=0;i<((x1-x0)/8-Cnt)/2;i++)
 489   2                              LCD_write_char(' ',reverse);
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 9   

 490   2                      for(i=0;i<Cnt;i++)
 491   2                              LCD_write_char(*(s+i),reverse);
 492   2                      for(i=0;i<(x1-x0)/8-Cnt-1;i++)
 493   2                              LCD_write_char(' ',reverse);                            
 494   2              }
 495   1              if(Mode==2)//右对齐(未完成)
 496   1              {       
 497   2                      LCD_set_XY(r0,x1/8-Cnt);
 498   2                      for(i=0;i<Cnt;i++)
 499   2                              LCD_write_char(*(s+i),0);       
 500   2              }
 501   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2690    ----
   CONSTANT SIZE    =      3    ----
   XDATA SIZE       =     28      28
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      17
   IDATA SIZE       =      2    ----
   BIT SIZE         =      5       7
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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