windows.lst

来自「用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245」· LST 代码 · 共 1,237 行 · 第 1/5 页

LST
1,237
字号
 469   3                                              {
 470   4                                                      CurLn++; StartLn++;
 471   4                                                      if((CurLn>MenuLen) || (StartLn>MenuLen))
 472   4                                                      {
 473   5                                                              CurLn = 1;
 474   5                                                              StartLn = 1;
 475   5                                                      }
 476   4                                              }
 477   3                                                              break;
 478   3      
 479   3                              case K_LEFT:    if(StartLn>4)        //不在第一页
 480   3                                              {
 481   4                                                      StartLn-=4;
 482   4                                                      CurLn-=4;
 483   4                                              }
 484   3                                              else
C51 COMPILER V8.01   WINDOWS                                                               03/28/2006 09:48:48 PAGE 9   

 485   3                                              {
 486   4                                                      StartLn = 1;
 487   4                                                      CurLn = 1;
 488   4                                              }
 489   3                                              break;
 490   3      
 491   3                              case K_RIGHT:   if(MenuLen>4)
 492   3                                                              {
 493   4                                                                      if((StartLn+4)<=MenuLen)
 494   4                                                      {  
 495   5                                                              if((StartLn+4)<=(MenuLen-4))
 496   5                                                          { 
 497   6                                                              StartLn+=4; 
 498   6                                                              CurLn+=4; 
 499   6                                                          }
 500   5                                                          else
 501   5                                                          { 
 502   6                                                              StartLn = MenuLen-3; 
 503   6                                                              CurLn = MenuLen-3; 
 504   6                                                          }
 505   5                                                      }
 506   4                                                      else
 507   4                                                      { 
 508   5                                                              StartLn = MenuLen-3;
 509   5                                                              CurLn = MenuLen; 
 510   5                                                      }
 511   4                                                  }
 512   3                                                  break;
 513   3      
 514   3                              case K_SR:              SelectInput++;
 515   3                                              if(SelectInput>=TotalInput) SelectInput = 0;
 516   3                                                              break;
 517   3      
 518   3                              case K_LJ:              DelGb18030(&WinDat[k][2]);
 519   3                                                              break;
 520   3      
 521   3                              case K_QC:              if(WinDat[k][0]==3)
 522   3                                                              {
 523   4                                                                      j = strlen(&WinDat[k][2]);
 524   4                                                                      for(i=0;i<j;i++)
 525   4                                                                              WinDat[k][i+2]=0;
 526   4                                                              }
 527   3                                                              break;
 528   3      
 529   3                              default:                j=0;
 530   3                                                              while(key[j]!=0)
 531   3                                              {
 532   4                                                      if(key[j]==val)
 533   4                                                      {
 534   5                                                              key[0]=val;
 535   5                                                              return val;
 536   5                                                      }
 537   4                                                      j++;
 538   4                                              }
 539   3                                                              break;
 540   3                      }        
 541   2              }
 542   1      }
 543          
 544          uchar CountStrDotLen(uchar *str)
 545          {//统计字符串中点阵宽度 最多192个点
 546   1              uchar i,Dot=0;
C51 COMPILER V8.01   WINDOWS                                                               03/28/2006 09:48:48 PAGE 10  

 547   1          
 548   1          i=0;
 549   1          while(str[i]!=0)
 550   1          {
 551   2              if(str[i]>0xa0)
 552   2              {
 553   3                              Dot+=16;   //汉字占16点
 554   3                  i++;
 555   3              }
 556   2              else
 557   2                      Dot+=8;      //西文字符占8点
 558   2              i++;
 559   2          }
 560   1          return Dot;
 561   1      }
 562          
 563          uchar Windows(uchar no,uchar mode,uchar *key)
 564          {
 565   1          uchar i,j;
 566   1          uchar InCurLocation[13];   //输入区光标位置
 567   1      
 568   1          //计算总行数
 569   1          for(i=0;i<12;i++)   //最多12行
 570   1          {
 571   2              if(WinHint[i][0] == 0) break;
 572   2              InCurLocation[i] = CountStrDotLen(&WinHint[i][1]);  //从第一字节开始
 573   2          }
 574   1          if(i==0)return 0;
 575   1          if(i<4)
 576   1          {
 577   2              j = i*2;
 578   2              for(;j<8;j++)
 579   2                      LcdClearLine(j,192);
 580   2          }
 581   1          if(mode==0)   //mode为窗口工作工作方式,0为菜单选择模式
 582   1              return DisMenu(no,i,key);
 583   1          else
 584   1              return DisMenuMode(no,i,InCurLocation,key);
 585   1      }
 586          
 587          //---------------------------------------------------------------------------------------
 588          
 589          //键盘扫苗,返回数字(0~9) 是功能键则将键值最高位置1以和字母区分
 590          uchar ScanNumber(uchar row,uchar col,uchar dat,uchar mode)
 591          {
 592   1              uchar const str[]={K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, 
 593   1                                                      K_XM1,K_XM2,K_XM3,K_XM4,K_XM5,K_XM6,K_00};
 594   1          uchar i,k,val,tp[2];
 595   1          uint time=0;
 596   1              bit flg=1;
 597   1      
 598   1              tp[1]=0;
 599   1              val=0xFF;
 600   1              while(val==0xFF)
 601   1              {
 602   2                      val = GetKey();
 603   2                      if(RxdFlg==1 && mode!=0)return 0;
 604   2                      time++;
 605   2                      if(time>CursorTime)
 606   2                      {
 607   3                              time = 0;
 608   3                          if(mode!=0)
C51 COMPILER V8.01   WINDOWS                                                               03/28/2006 09:48:48 PAGE 11  

 609   3                          {
 610   4                              if(flg!=0)
 611   4                                      tp[0]=dat;
 612   4                              else
 613   4                                      tp[0]=' ';
 614   4                              if(mode==3)i=0x0B;
 615   4                              else i=0;
 616   4                              LcdDisplay(row,col,tp,i);
 617   4                              flg = ~flg;
 618   4                          }
 619   3                      }
 620   2              }
 621   1              if(mode==4)k=17;
 622   1              else k=10;
 623   1          for(i=0;i<k;i++)
 624   1          {
 625   2            if(str[i]==val)return i;   //返回数字
 626   2          }
 627   1          if(val==K_00 && mode!=4)return 16;
 628   1      //    return (val | 0x80);          //是功能键则将键值最高位置1以和字母区分
 629   1              return val;
 630   1      }
 631          
 632          //整数显示
 633          void LcdDisNum(uchar row, uchar col, uchar *str,uchar flg)
 634          {
 635   1              uchar i,len,dat[26];
 636   1      
 637   1              if(flg==1)
 638   1              {
 639   2                      len=strlen(str);
 640   2                      for(i=0;i<len;i++)   //最多显示24个数字
 641   2                  {
 642   3                      dat[i]='*';
 643   3                  }
 644   2                  dat[len]=0;
 645   2                  LcdDisplay(row,col,dat,0);
 646   2              }
 647   1              else
 648   1              LcdDisplay(row,col,str,0);
 649   1      }
 650          
 651          //小数输入
 652          //row  小数显示的行坐标  Col 小数显示的列坐标  bcd 显示初始值
 653          //key[0] 存放有效按键的值,返回按键扫描码
 654          //当输入键值与keyvalue数组中任意一位相等时退出
 655          ulong GetFloat(uchar row, uchar col, ulong dat,uchar len,uchar *key)
 656          {//keyvalue数组长度至少2字节
 657   1              uchar i,val,dotlen,disparr[26],tp[25],lastposition = 0;
 658   1              ulong returnvalue=0;
 659   1              bit x=0,dot=0,zero=0,win;
 660   1      
 661   1              win=0;
 662   1              if(len&0x80)win=1;
 663   1              len &= 0x7F;
 664   1              if(len>24) len = 24;   //最大输入长度
 665   1              dotlen=0xFF;
 666   1              disparr[0]=0;
 667   1              if(dat!=0)
 668   1              {
 669   2                      zero=1;
 670   2                      NumToStr(dat,disparr,1);
C51 COMPILER V8.01   WINDOWS                                                               03/28/2006 09:48:48 PAGE 12  

 671   2              }
 672   1              lastposition = strlen(disparr);
 673   1              for(i=0;i<lastposition;i++)
 674   1                      if(disparr[i]=='.')
 675   1                      {
 676   2                              dot=1;
 677   2                              dotlen=0;
 678   2                              break;
 679   2                      }
 680   1              while(1)
 681   1          {
 682   2              LcdDisplay(row, col, disparr, 0);  //显示数字
 683   2              VfdDisplayInt(disparr,len,0);
 684   2              val = ScanNumber(row,col+lastposition*8,'_',1);
 685   2                  if(RxdFlg==1) //串口中断,退出
 686   2                      {
 687   3                          key[0] = 0;
 688   3                              RxdFlg=0;
 689   3                              IEA &= 0xEF;                    //关UART2中断,ES2 = 0;
 690   3                  LcdDisplay(row,col+lastposition*8," ",0);
 691   3                              VfdClear();
 692   3                  return returnvalue;  //返回整数
 693   3                      }
 694   2              if(val>=0x0A && val<=0x0F)continue;
 695   2              if(val<10 || val==16)   //是数字键
 696   2                      {//对数字键的判断不能放到switch中
 697   3                              if(lastposition<len)
 698   3                          {
 699   4      //                      if(zero==0 && (val==16 || val==0))
 700   4                              if(val==16 && zero==0) //输入的第一个按键不能是"00"
 701   4                                      continue;
 702   4                              zero=1;
 703   4                              if(dotlen!=0)
 704   4                              {
 705   5                                      if(dotlen!=0xFF)dotlen--;
 706   5                                      if(val == 16)
 707   5                                  {
 708   6                                      disparr[lastposition++] = '0';

⌨️ 快捷键说明

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