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 + -
显示快捷键?