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

📄 lcd.lst

📁 C8051F120与串口、并口、D12、USB、LCD应用
💻 LST
📖 第 1 页 / 共 2 页
字号:
 266   4                                      for(temp=0;temp<16;temp++) 
 267   4                                      { 
 268   5                                              DataWrite( ~CBYTE[BASE+offset+2+temp*2+k]);
 269   5                                      }
 270   4                              }
 271   3                              PSBANK=0x11;
 272   3                              uRow+=2;
 273   3                              i++;
 274   3            }
 275   2      
 276   2         if(uRow >= 40)          // 光标后移
 277   2              {
 278   3                 uCol += 16;
 279   3                 uRow = 0;
 280   3                 if( uCol >= 240 ) uCol = 0;
 281   3              }
 282   2           
 283   2            Locatexy(uRow,uCol);
 284   2            i++;
 285   2      }
 286   1         CS=1;
 287   1      }
 288          
 289          //在x,y处用n位显示一个无符号数,不足n位左端补齐字符c。TYPE=0正常显示,=1反色显示
 290          void putufig(unsigned char  x,unsigned char  y, unsigned long ulong,char n,char TYPE,char c)
 291          {
 292   1              char buf[12];
 293   1              char len,i;
 294   1              sprintf(buf,"%lu",ulong);
 295   1              len=strlen(buf);
 296   1              if( len<n )
 297   1              {
 298   2                      for(i=n;i>=0;i--)
 299   2                      {       
 300   3                              if(len>=0)
 301   3                              {
 302   4                                      buf[i]=buf[len];
 303   4                                      len--;
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 6   

 304   4                              }
 305   3                              else
 306   3                              {
 307   4                                      buf[i]=c;
 308   4                              }
 309   3                      }
 310   2              }
 311   1              if(TYPE==0)
 312   1              dprintf(x,y,buf);
 313   1              else
 314   1              Udprintf(x,y,buf);
 315   1      }
 316          
 317          //以十六进制形式显示uchar       例如: 16H
 318          void puthex(unsigned char  x,unsigned char  y, unsigned char hex)
 319          {
 320   1              unsigned int low,high;
 321   1              char buf[5];
 322   1              high=hex/16;
 323   1              low=hex%16;
 324   1              sprintf(buf,"%X%X%s",high,low,"H");
 325   1              dprintf(x,y,buf);
 326   1      }
 327          
 328          //以二进制形式显示uchar         例如: 00010110
 329          void putbin(unsigned char  x,unsigned char  y, unsigned char bin)
 330          {
 331   1              int i;
 332   1              char buf[10];
 333   1              for(i=7;i>=0;i--)
 334   1              {
 335   2                      if(bin%2)       buf[i]='1';
 336   2                      else            buf[i]='0';
 337   2                      bin/=2;
 338   2              }
 339   1              buf[8]='\0';
 340   1              dprintf(x,y,buf);
 341   1      }
 342          
 343          unsigned char X,Y,F;                                                    //全局变量,记录屏幕坐标
 344          //显示文本,在全局变量x,y中保存光标位置,如果一页显示满则F置一
 345          char * tprintf(unsigned char  x,unsigned char  y, char *ptr)    
 346          {                                                                                                                               //显示字符串,直到屏幕写满(F=1)或写完(F=0)。
 347   1          unsigned char c1,c2;                                                                                //返回指针指向所写最后一个字符的下一个。
 348   1          unsigned int  i,j,uLen;
 349   1          unsigned char temp,uRow,uCol;
 350   1          unsigned int k;
 351   1              unsigned int offset;
 352   1      
 353   1          CS=0;
 354   1          uRow=x;
 355   1          uCol=y;
 356   1          uLen=0;
 357   1        
 358   1          CmdWrite(CSRDIR_DOWN);  /*光标移动方向定义,自动下移*/
 359   1          Locatexy(uRow,uCol);
 360   1              
 361   1              uLen=strlen(ptr);
 362   1              i=0;
 363   1              while(i<uLen)
 364   1              {       
 365   2                      c1=ptr[i];
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 7   

 366   2              c2=ptr[i+1];
 367   2                  if( c1 <= 128 )                         // ASCII
 368   2                      {
 369   3                              if(uRow >= 40)                                          //ASCII换行
 370   3                      {
 371   4                              uCol += 16;
 372   4                              uRow = 0;
 373   4                      }
 374   3                              if( uCol >= 208)                                //写满一页    
 375   3                              {
 376   4                                      F=1;
 377   4                                      return ptr+i;
 378   4                              }
 379   3                              Locatexy(uRow,uCol);
 380   3                              if( c1==13 )                    //文本文档中换行 = /r+/n (13+10)
 381   3                              {
 382   4                              uRow = 0;
 383   4                                      i++;
 384   4                              }
 385   3                              else
 386   3                              {
 387   4                                      if( c1==10 )                    //文本文档中换行 = /r+/n (13+10)
 388   4                                      {
 389   5                                              uCol += 16;
 390   5                                              i++;
 391   5                                      }
 392   4                              else
 393   4                                      {       
 394   5                                      CmdWrite( MWRITE );                             // 写数据(命令)
 395   5                                      for(j=0;j<16;j++) DataWrite( ASC_MSK[(c1-0x20)*16 +j]);
 396   5                                      uRow++;                                                 //将光标调整到下一位置
 397   5                                              i++;
 398   5                                      }
 399   4                              }
 400   3                      }
 401   2                      else  // 汉字
 402   2                      {   
 403   3                              if(c2==0)                               //数据不完整,放弃显示
 404   3                              {
 405   4                                      F=0;
 406   4                                      return ptr+i;
 407   4                              }
 408   3                              if(uRow >= 39)                          //汉字换行,可能空一列
 409   3                      {
 410   4                              uCol += 16;
 411   4                              uRow = 0;
 412   4                      }           
 413   3                              if( uCol >= 208)        //写满一页    
 414   3                              {
 415   4                                      F=1;
 416   4                                      return ptr+i;
 417   4                              }
 418   3                              offset=0;
 419   3                              //调整bank页,从第3页中取常数 
 420   3                              PSBANK=0x31;
 421   3                              while(CBYTE[BASE+offset]!=0xFF || CBYTE[BASE+offset+1]!=0xFF)
 422   3                              {
 423   4                                      if(CBYTE[BASE+offset]==c1 && CBYTE[BASE+offset+1]==c2)
 424   4                                      break;
 425   4                                      offset+=34;
 426   4                              }
 427   3                              for(k=0;k<2;k++)   //分两列显示该汉字字模,先显示左半部分,再显示右半部分
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 8   

 428   3                              {
 429   4                                      Locatexy(uRow+k,uCol);
 430   4                              CmdWrite(CSRDIR_DOWN);
 431   4                                      CmdWrite(MWRITE);     //写数据命令
 432   4                                      for(temp=0;temp<16;temp++) 
 433   4                                      { 
 434   5                                              DataWrite(CBYTE[BASE+offset+2+temp*2+k]);
 435   5                                      }
 436   4                              }
 437   3                              PSBANK=0x11;
 438   3                              uRow+=2;
 439   3                              i+=2;
 440   3                      }
 441   2      
 442   2              }//while(i<len)
 443   1          CS=1;
 444   1              X=uRow;
 445   1              Y=uCol;                         //记录屏幕坐标
 446   1              F=0;                                                    //表明正常写完字符串,未写满一页
 447   1          return ptr+i;                                       //写完返回'\0'
 448   1      }
 449          
 450          //给定两点连结一条直线(屏幕左上角为坐标原点)
 451          void drawline(int x1,int y1,int x2,int y2)
 452          {
 453   1              double k;                                               //斜率
 454   1              int minx,maxx,miny,i,j;
 455   1              int py;                                                 //记录前一个点的纵坐标
 456   1      
 457   1              if(x1<x2)                                       
 458   1              {
 459   2                      minx=x1;
 460   2                      maxx=x2;
 461   2                      miny=y1;
 462   2              }
 463   1              else
 464   1              {
 465   2                      minx=x2;
 466   2                      maxx=x1;
 467   2                      miny=y2;
 468   2              }
 469   1      
 470   1              if(x1==x2)
 471   1              {
 472   2                      if(y1<=y2)
 473   2                      for(i=y1;i<=y2;i++)
 474   2                      Point(x1,i);
 475   2                      else
 476   2                      for(i=y2;i<=y1;i++)
 477   2                      Point(x1,i);
 478   2              }
 479   1              else
 480   1              {
 481   2                      k=(double)(y2-y1)/(x2-x1);      
 482   2                      py=miny;                                                //py初值
 483   2                      for(i=minx;i<=maxx;i++)                 
 484   2                      {
 485   3                              unsigned char y;                        //当前点的纵坐标
 486   3                              y=(unsigned char)(k*(i-minx)+miny+0.5);
 487   3                              Point(i,y);
 488   3                              if(y<py)                                        //插入点,使线连续
 489   3                              for(j=y+1;j<py;j++)
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 9   

 490   3                              Point(i,j);
 491   3                              if(y>py)
 492   3                              for(j=py+1;j<y;j++)
 493   3                              Point(i,j);
 494   3                              py=y;
 495   3                      }
 496   2              }
 497   1      }
 498          
 499          //将n个点连结起来
 500          void link(int *pointlist)
 501          {
 502   1              int n,i;
 503   1              n=pointlist[0];
 504   1              if(n<2)
 505   1              return;
 506   1              for(i=0;i<n-1;i++)
 507   1              drawline(pointlist[2*i+1],pointlist[2*i+2],pointlist[2*i+3],pointlist[2*i+4]);
 508   1      }
 509          
 510          void circle(unsigned char ox,unsigned char oy,unsigned char r)
 511          {
 512   1              int x,y;
 513   1              for(x=r;x>=0;x--)
 514   1              {
 515   2                      y=r;
 516   2                      while(x*x+y*y>r*r)      y--;
 517   2                      Point(ox-x,oy+y);
 518   2                      Point(ox+x,oy+y);
 519   2                      Point(ox+x,oy-y);
 520   2                      Point(ox-x,oy-y);               
 521   2              }
 522   1      
 523   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3970    ----
   CONSTANT SIZE    =   1602    ----
   XDATA SIZE       =      5     135
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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