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

📄 lcd.lst

📁 含20个经典例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
 233   3                              intbuf[++c]=inum%t+'0';
 234   3                              intbuf[++c]=' ';
 235   3                              goto putmes;
 236   3                      }
 237   2                      if(inum<t&flag)
 238   2                              continue;
C51 COMPILER V8.08   LCD                                                                   11/29/2007 11:29:41 PAGE 5   

 239   2                      else    {
 240   3                              flag=0;
 241   3                              intbuf[c]=inum/t;
 242   3                              inum-=(long)(intbuf[c]) * t;
 243   3                              intbuf[c]+='0';
 244   3                              c++;
 245   3                      }
 246   2              }//以上部分是将puti()函数重新写一次,但不给数组加结束符
 247   1              putmes:
 248   1              for(k=c;*str!='\0';k++){//以下为数组复制的算法
 249   2           intbuf[k]=*str;
 250   2                   str++;                                         
 251   2                  if(*str==' '){
 252   3                              intbuf[++c]='\0';
 253   3                              break;
 254   3                      }
 255   2              }
 256   1              intbuf[k]='\0';//intbuf数组复制完毕
 257   1              showline(intbuf,page);//显示行控制
 258   1      }
 259          void showline(uchar  *str,bit page){//page值为0,显示第一行,page为1,显示第二行
 260   1              uchar idata  k;
 261   1              if(page==0){//控制显示在第几行是通过k的地址不同来实现的
 262   2                      for(k=0x80;k<0x90;k++){
 263   3                      if(*str=='\0'){//*str的指针不下移,会执行到k=0x8f为止
 264   4                                      sendc(k);
 265   4                                      sendd(' ');//显示空格清掉上次显示部分
 266   4                              }
 267   3                              else{
 268   4                                      sendc(k); 
 269   4                                      sendd(*str);
 270   4                                      str++;
 271   4                              }
 272   3                      }
 273   2              }
 274   1              if(page==1){
 275   2                      for(k=0xc0;k<0xd0;k++){
 276   3                              if(*str=='\0'){
 277   4                                      sendc(k);
 278   4                                      sendd(' ');
 279   4                              }
 280   3                              else    {
 281   4                                      sendc(k); 
 282   4                                      sendd(*str);
 283   4                                      str++;
 284   4                              }
 285   3                      }
 286   2              }
 287   1      }
 288          void showpage(uchar *str,uchar *show){//显示整屏
 289   1              showline(str,0);//str显示在第一行
 290   1              showline(show,1);//show显示在第二行
 291   1       }
 292          uchar scankey(){//扫描键值函数
 293   1              uchar  c;
 294   1              SFRPAGE=0X0F;
 295   1              c=P5;
 296   1              c=c&0xf8;//电路中有按键按下是低电平
 297   1              if(c==0x0f8)
 298   1                      return(0);
 299   1              delay1ms(20);
 300   1              switch(c){
C51 COMPILER V8.08   LCD                                                                   11/29/2007 11:29:41 PAGE 6   

 301   2              case 0xd8:
 302   2                      return 4;
 303   2              case 0xe8:
 304   2                      return 2;
 305   2              case 0xf0:
 306   2                      return 3;
 307   2              case 0xb8:
 308   2                      return 1;
 309   2              case 0x78:
 310   2                      return 5;
 311   2              default: return 0;//此行事实上包含了对串键的处理
 312   2              }
 313   1      }
 314          uchar menu_sec(uchar *menuname,uchar code  *menu,uchar menu_num){
 315   1      /*菜单选择控制,菜单可在code数组中定义,menu_num为菜单项数,menulenth为菜单一项的长度*/
 316   1              char idata c,i=0;
 317   1              showline(menuname,0);//菜单翻页中menumame是不随着翻动的
 318   1              showline(&(menu[i*menulenth]),1);
 319   1              for(;;){
 320   2                      c=scankey();
 321   2                      if(c==0)
 322   2                              continue;
 323   2                      if(c==1){//下翻页操作
 324   3                              i++;
 325   3                              if(i>=menu_num)//i值上溢处理
 326   3                                      i=0;
 327   3                                      showline(&(menu[i*menulenth]),1);
 328   3                        }
 329   2                   if(c==3){//上翻页操作
 330   3                           i--;
 331   3                           if(i<0)//i值下溢处理
 332   3                              i=menu_num-1;
 333   3                           showline(&(menu[i*menulenth]),1);  
 334   3                        }
 335   2                       if(c==4)
 336   2                              return -1;//作为exit键
 337   2                       if(c==5)
 338   2                              return -2;//预想作为快捷键
 339   2                   if(c==2){//确定键处理              
 340   3                                      //此程序有待用户改进
 341   3                              return i;
 342   3                       }    
 343   2                      for(c=0;c<3;c++)//完成一次扫描后给一定的延时
 344   2                              delay1ms(100);   
 345   2              }
 346   1      }
 347          int   getint(){
 348   1                      getdata();
 349   1                      return (atoi(keybuf));//调用的是系统函数,将字符串转化成int型数据
 350   1      }
 351          float getfloat(){
 352   1                      getdata();
 353   1                      return (atof(keybuf));//调用的是系统函数,将字符串转化成float型数据
 354   1      }
 355          void  getdata(){//取键盘+LCD输入值,可取16个字节长度的字符串
 356   1                              char xdata  i,j,t,flag;
 357   1                              uchar k,c;
 358   1                      keystart:
 359   1                              flag=0;
 360   1                              for (k=0;k<16;k++){//先将缓冲区清零,以免把历史数据当成目前数据
 361   2                                      keybuf[k]='\0';
 362   2                              }
C51 COMPILER V8.08   LCD                                                                   11/29/2007 11:29:41 PAGE 7   

 363   1                              showline(keybuf,1);//将输入值回显在第二行,以方便即时矫正
 364   1                              i=0;
 365   1                              j=0;
 366   1                              showline(disdata[i],0);//显示供选择输入的字符
 367   1                              curshow;//显示光标
 368   1                              home;//回首位,作为初始状态
 369   1                              for(;;){
 370   2                                      do{     
 371   3                                              k=scankey();
 372   3                                              if(k==0)
 373   3                                              t=-1;
 374   3                                      }while(!k);//有按键按下时判断是否为有效按键,若不是,一直等待
 375   2                                      if(k==1){//下翻页键使之光标下移
 376   3                                              j++;
 377   3                                              toup;
 378   3                                              t=-1;
 379   3                                              if(j>15){//按键按过头后要翻到下一页显示,且使光标显示在首位
 380   4                                                      j=0;
 381   4                                                      i++;
 382   4                                                      if(i>DISROW)    
 383   4                                                              i=0;
 384   4                                                      showline(disdata[i],0);
 385   4                                                      curshow;        
 386   4                                                      home;
 387   4                                              }
 388   3                                      }
 389   2                                      if(k==2){
 390   3              //确定键,使光标所在位置的字符为有效输入,若为按长键表示结束输入
 391   3                                              while(scankey()==2){
 392   4                                                      t++;
 393   4                                                      if(t>20)
 394   4                                                              goto getdatacon; 
 395   4                                              }
 396   3                                              if(flag>=16)
 397   3                                                              goto keystart;//输入值过多,控制其回到首位矫正
 398   3                      
 399   3                                              keybuf[flag]=disdata[i][j];
 400   3                                              showline(keybuf,1);//将输入值回显
 401   3                                              home;
 402   3                                              delay1ms(3);//回显完毕后要控制其光标恢复到首行输入状态
 403   3                                              flag++;
 404   3                                              for(c=0;c<j;c++){
 405   4                                                      toup;
 406   4                                                      delay1ms(1);
 407   4                                              }
 408   3                                              goto firstout;
 409   3                                              getdatacon:
 410   3                                              showline("Has inputed:  ",0);
 411   3                                              showline(keybuf,1);//需长按键
 412   3                                              while(scankey()==2);
 413   3                                              curshut;//隐藏光标
 414   3                                              goto KEYEND;
 415   3                                      }
 416   2                                      if(k==3){//上翻页键控制光标上移
 417   3                                              j--;
 418   3                                              t=-1;
 419   3                                              if(j<0) {//同样存在过头处理,但是不是回到首位,而是末位
 420   4                                                      j=15;
 421   4                                                      i--;
 422   4                                                      if(i<0)
 423   4                                                              i=DISROW;
 424   4                                                      showline(disdata[i],0);
C51 COMPILER V8.08   LCD                                                                   11/29/2007 11:29:41 PAGE 8   

 425   4                                                      curshow;
 426   4                                                      home;
 427   4                                                      delay1ms(3);
 428   4                                                      for(c=0;c<j;c++){
 429   5                                                                      toup;
 430   5                                                                      delay1ms(1);
 431   5                                                      }
 432   4                                              }
 433   3                                              else{
 434   4                                                              todown;
 435   4                                              }
 436   3                                      
 437   3                              }
 438   2                              if(k==5){//delete 键,使输入缓冲区的最后一位删掉
 439   3                                      flag--;
 440   3                                      if(flag<1)
 441   3                                              flag=0;
 442   3                                      keybuf[flag]='\0';
 443   3                                      showline(keybuf,1);
 444   3                                      curshow;
 445   3                                      home;
 446   3                                      delay1ms(3);
 447   3                                      for(c=0;c<j;c++){
 448   4                                                      toup;
 449   4                                                      delay1ms(1);
 450   4                                      }
 451   3                              }       
 452   2                      firstout:       //每个循环必要的延时
 453   2                              for(k=0;k<2;k++)
 454   2                              delay1ms(100);
 455   2                      }
 456   1              KEYEND: 
 457   1                      _nop_();
 458   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2653    ----
   CONSTANT SIZE    =     63    ----
   XDATA SIZE       =     32       4
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      39
   IDATA SIZE       =   ----      11
   BIT SIZE         =   ----       6
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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