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

📄 tree.lst

📁 LCD12864做的显示函数
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   TREE                                                                  03/26/2009 20:55:54 PAGE 5   

 242          void chkbusy(void)              //检测LCD忙状态
 243          {
 244   1              E=1;                            //LCD使能
 245   1              RS=0;                           //读写指令
 246   1              RW=1;                           //读
 247   1              P2=0xff;                   //读操作以前先进行一次空读操作 接下来才能读到数据
 248   1              while(!Busy);      //等待不忙
 249   1      }
 250          
 251          
 252          void wcode(uc cd)               //写指令代码
 253          {
 254   1              chkbusy();                      //等待空闲
 255   1              E=1;                            //以下使能LCD,设置LCD写指令状态
 256   1              RW=0;
 257   1              RS=0;
 258   1              P2=cd;                           //写指令代码
 259   1              E=1;                             //一下二句E产生下降沿,使得写操作有效
 260   1              E=0;
 261   1      }
 262          
 263          
 264          void wdata(uc dat)               //写显示数据
 265          {
 266   1              chkbusy();                       //等待空闲
 267   1              E=1;                             //     以下使能LCD,设置LCD写数据状态
 268   1              RW=0;
 269   1              RS=1;
 270   1              P2=dat;                         //写数据代码
 271   1              E=1;                             //一下二句E产生下降沿,使得写操作有效
 272   1              E=0;
 273   1      }
 274          
 275          
 276          void display_HZ(uc page,uc col,uc *temp)        //显示汉字子程序
 277           {
 278   1              L=1;R=0;                                                         //从左半屏开始 若列数超过128 改右
 279   1              if(col>=0x80)
 280   1                      {
 281   2                              R=1;L=0;
 282   2                              col-=0x40;
 283   2                      }
 284   1                      wcode(page);                                     //按要求写入页地址
 285   1                      wcode(col);                                              //按要求从相应列开始写数据
 286   1                      for(j=0;j<16;j++)                                //写入一个汉字的上半部分,共16字节
 287   1                      {
 288   2                              wdata(temp[j]);
 289   2                      }       
 290   1             wcode(page+1);          //从下一页开始显示汉字的下半部分要求从相应的列开始写数据
 291   1                      wcode(col);
 292   1                      for(j=16;j<32;j++)
 293   1                      {
 294   2                              wdata(temp[j]);
 295   2                      }
 296   1        }
 297          
 298          
 299          void display_FH(uc page,uc col,uc *temp)        //显示16*8字符子程序
 300           {
 301   1              L=1;R=0;                                                         //从左半屏开始 若列数超过128 改右
 302   1              if(col>=0x80)
 303   1                      {
C51 COMPILER V8.02   TREE                                                                  03/26/2009 20:55:54 PAGE 6   

 304   2                              R=1;L=0;
 305   2                              col-=0x40;
 306   2                      }
 307   1                      wcode(page);                                     //按要求写入页地址
 308   1                      wcode(col);                                              //按要求从相应列开始写数据
 309   1                      for(j=0;j<8;j++)                                
 310   1                      {
 311   2                              wdata(temp[j]);
 312   2                      }
 313   1                      wcode(page+1);         
 314   1                      wcode(col);
 315   1                      for(j=8;j<16;j++)
 316   1                      {
 317   2                              wdata(temp[j]);
 318   2                      }       
 319   1        }
 320          
 321          void Display_FiveNum(uc a, uc b, float num)     //函数功能:从a地址代表的页,b地址代表的列开始向左显示 0000.0 
             -五位数据,
 322            {
 323   1              uc flag=0,shuzu[5]=0; //shuzu[]用来存储num的千,百,十,个,'.',十分位共六位
 324   1              ui i=0,j=0,num1,quzheng;
 325   1              quzheng=num; //num的整数部分
 326   1              num1=num*10; //先乘10,精确到十分位
 327   1           while(num1)           //分离float型 num 的整数部分quzheng的各位数字
 328   1              {
 329   2                 i=num1%10;
 330   2                 num1=num1/10;
 331   2                         shuzu[j++]=i;
 332   2               }
 333   1                       if(j!=0)
 334   1                         { while(shuzu[j--]==0);}
 335   1                      for(i=0;i<=j+1;i++)
 336   1      
 337   1                       { if(flag==1) 
 338   2                         display_FH(a,b-(1+i)*8,SZ[shuzu[i]]);
 339   2                         if(flag==0)
 340   2                         display_FH(a,b-i*8,SZ[shuzu[i]]);
 341   2                         if(i==0)
 342   2                          {
 343   3                                display_FH(a,b-(i+1)*8,FH[1]);flag=1;  //显示小数点
 344   3                              }
 345   2                        } 
 346   1           }
 347          
 348          
 349          void initshow()                                    //0xb8~0xbf表示第0~7页(64行); 0x01_____表示行(0x40~0x3f)
 350           {
 351   1         display_HZ(0xb8,0x40,HZ[0]);   //单
 352   1         display_HZ(0xb8,0x50,HZ[1]);   //价
 353   1         display_FH(0xb8,0x60,FH[0]);  //:
 354   1         Display_FiveNum(0xb8,0xA8,dj);       //从0xA8列开始向左显示
 355   1         display_HZ(0xb8,0xB0,HZ[8]);   //元
 356   1         display_HZ(0xba,0x40,HZ[2]);  //里:一个汉字占2行 行+2
 357   1         display_HZ(0xba,0x50,HZ[3]);  //程 
 358   1         display_FH(0xba,0x60,FH[0]);  //:
 359   1         Display_FiveNum(0xba,0xA8,lc);
 360   1         //display_FH(0xba,0xB0,FH[2]);   //k
 361   1         display_FH(0xba,0xB4,FH[3]);   //m
 362   1         display_HZ(0xbc,0x40,HZ[4]);   //总
 363   1         display_HZ(0xbc,0x50,HZ[1]);   //价
 364   1         display_FH(0xbc,0x60,FH[0]);  //:
C51 COMPILER V8.02   TREE                                                                  03/26/2009 20:55:54 PAGE 7   

 365   1         Display_FiveNum(0xbc,0xA8,zj);
 366   1         display_HZ(0xbc,0xB0,HZ[8]); //元
 367   1        }
 368          
 369          
 370          void int1() interrupt 0        //外部中断0——实时显示处理
 371             {
 372   1                 lc=lc+0.5;
 373   1                 zj=lc*dj;
 374   1                 if(lc<3) zj=3;
 375   1                 Display_FiveNum(0xb8,0xA8,dj); 
 376   1                 Display_FiveNum(0xba,0xA8,lc);         
 377   1                 Display_FiveNum(0xbc,0xA8,zj);
 378   1               }
 379           
 380          void main(void)
 381          {
 382   1          
 383   1          uc t,a,b,c=0,flag1=100;
 384   1          SCON=0x11;                   //方式0设置 (彬哥不理解)
 385   1          //EX0=1;               //打开外部中断0
 386   1          IT0=1;               //下降沿触发中断INT0
 387   1          EA=1;                //全局中断允许
 388   1              iniLCD();
 389   1              for(t=0;t<4;t++)
 390   1                display_HZ(0xbb,0x50+23*t,HZ[9+t]);
 391   1               
 392   1         // 
 393   1          while(1) //键盘扫描程序
 394   1          {
 395   2                  P1=0x0f;//p1接矩阵键盘
 396   2                      a=P1;
 397   2                      delay(10);
 398   2                      P1=0xf0;
 399   2                      b=P1;
 400   2                      delay(10);
 401   2                      c=a+b; //c为键盘扫描的键值
 402   2                      if(c==0xee)
 403   2                {flag1=0;delay(10);}//按下0
 404   2                      if(c==0xde)
 405   2                         {flag1=1;delay(10);}//按下1
 406   2              if(c==0xbe)      
 407   2                        { flag1=2;delay(300);}//2
 408   2                      if(c==0x7e)
 409   2                         { flag1=3;delay(300);}//3
 410   2      
 411   2                      switch(flag1)
 412   2                        {
 413   3                              
 414   3                              case 0:flag1=-1;EX0=0;
 415   3                                     dj=0;zj=0;lc=0;
 416   3                                         SelectScreen(0);
 417   3                                              for(i = 0;i < 8;i ++)
 418   3                                                      {
 419   4                                                              SetLine(i);
 420   4                                                              SetColum(64);
 421   4                                              for(j = 0;j < 48; j++)
 422   4                                               wdata(0x00); 
 423   4                                                       }
 424   3                                              initshow(); break;
 425   3                               case 1:flag1=-1;iniLCD();initshow();EX0=1;break;
 426   3                         /* case 1:
C51 COMPILER V8.02   TREE                                                                  03/26/2009 20:55:54 PAGE 8   

 427   3                                       {
 428   3                                         flag1=-1;EX0=0;
 429   3                                         iniLCD();initshow();break;   //按下1,回归显示
 430   3                                         Display_FiveNum(0xb8,0xA8,dj); 
 431   3                                         Display_FiveNum(0xba,0xA8,lc);         
 432   3                                         Display_FiveNum(0xbc,0xA8,zj);break; //      按下0,清0;        */
 433   3      
 434   3                              case 2:flag1=-1;EX0=0;dj+=0.5;zj=0;lc=0;
 435   3                                      SelectScreen(0);
 436   3                                              for(i = 0;i < 8;i ++)
 437   3                                                      {
 438   4                                                              SetLine(i);
 439   4                                                              SetColum(64);
 440   4                                              for(j = 0;j < 48; j++)
 441   4                                               wdata(0x00); 
 442   4                                                       }
 443   3                                         Display_FiveNum(0xb8,0xA8,dj); 
 444   3                                         Display_FiveNum(0xba,0xA8,lc);         
 445   3                                         Display_FiveNum(0xbc,0xA8,zj);
 446   3                                              break;
 447   3      
 448   3                              case 3:flag1=-1;EX0=0;
 449   3                                         if(dj>0) 
 450   3                                                     {dj-=0.5;zj=0;lc=0;}
 451   3                                      SelectScreen(0);
 452   3                                              for(i = 0;i < 8;i ++)
 453   3                                                      {
 454   4                                                              SetLine(i);
 455   4                                                              SetColum(64);
 456   4                                              for(j = 0;j < 48; j++)
 457   4                                               wdata(0x00); 
 458   4                                                       }
 459   3                                         Display_FiveNum(0xb8,0xA8,dj); 
 460   3                                         Display_FiveNum(0xba,0xA8,lc);         
 461   3                                         Display_FiveNum(0xbc,0xA8,zj);
 462   3                                              break;
 463   3                              //case 3:flag1=-1;EX0=0;
 464   3                         }
 465   2                         //if(c!=0xff)
 466   2                         // break;
 467   2              //if(c==0x7e)
 468   2                       //    {show_shuzi(3); break;}//按下3,右屏显示‘3’
 469   2      
 470   2          } 
 471   1               //while(1); 
 472   1        }     


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1599    ----
   CONSTANT SIZE    =    645    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     18      29
   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 + -