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

📄 yxktv.lst

📁 C51环境下的KTV用的娱乐投票器
💻 LST
📖 第 1 页 / 共 5 页
字号:
 665   1           {  case 0x1:/*显示编号*/
 666   2                   IniPos=1;
 667   2                   ShowIni();
 668   2                   break;
 669   2              case 0x2: /*读配置*/
 670   2                   if (KeyNo!=KOK) break;
 671   2      
 672   2                   SendIni();
 673   2      
 674   2                   IniPos=1;
C51 COMPILER V7.00  YXKTV                                                                  05/08/2006 17:58:08 PAGE 12  

 675   2                   ShowIni();
 676   2      
 677   2                   break;
 678   2              case 0x3:  /*写配置*/
 679   2                   if (KeyNo!=KOK) break;
 680   2      
 681   2                   AddH=SerData[7];
 682   2                   AddL=SerData[8];
 683   2                   PwrT=SerData[9];
 684   2                   Config1=SerData[10];
 685   2                   Config2=SerData[11];
 686   2                   Config3=SerData[12];
 687   2                   WriteIni();
 688   2                   ReadIni();
 689   2                   IniPos=1;
 690   2                   ShowIni();
 691   2                   SendIni();
 692   2                   break;
 693   2              case 0x4: /*延时关机*/
 694   2                   //PwrTimer=SerData[7]*256 + SerData[8];
 695   2                   break;
 696   2              default: //认为是按模式扫描启动
 697   2                   InputClr();
 698   2                   ShowNums();
 699   2                   break;
 700   2      
 701   2            }
 702   1      }
*** WARNING C280 IN LINE 663 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'i': unreferenced local variable
 703          
 704          /*解读串口命令*/
 705          void ReadCmd()
 706          {    register uchar i,Crc;
 707   1      
 708   1          if (bRcvChar==0)//是显示字符时不效验Crc
 709   1          {
 710   2           Crc=0;
 711   2           for (i=0;i<SerN-4;i++) Crc=Crc^SerData[i+3]; /*计算CRC,Len后Crc前的XOR值*/
 712   2           if(Crc!=SerData[SerN-1]) /*CRC效验不正确*/
 713   2              {  goto ReadClear;
 714   3      
 715   3              }
 716   2           }
 717   1      
 718   1           LED=~LED;
 719   1      
 720   1           if (!((SerData[3]==AddH) && (SerData[5]==AddL)))
 721   1             if (!((SerData[3]==0)&&(SerData[5]==0)))
 722   1                goto ReadClear1;
 723   1      
 724   1           /*地址相同或00*/
 725   1           SerN=0; //!bug 有不发送应答的处理
 726   1                   //所以先清除SerN,否则后继第一条指令丢失
 727   1           SleepTimer=PwrT*120;
 728   1      
 729   1           switch (SerData[4])  /*命令码*/
 730   1           {
 731   2              case 0x50:
 732   2                ReadCmd50();
 733   2                //InputN=6; //按键不能再输入 no 会影响启动扫描命令的InputClr
 734   2                bRcvOk=0;
 735   2                return;
C51 COMPILER V7.00  YXKTV                                                                  05/08/2006 17:58:08 PAGE 13  

 736   2      
 737   2              case 0x51://多键
 738   2              case 0x52://单键
 739   2              case 0x53://定额
 740   2                InputMode=SerData[4]-0x50;
 741   2                SendInfo(SerData[6],1);//带DataPos
 742   2      
 743   2                bRcvOk=0;
 744   2                return;/*不用break,保证SERN不改写为0*/
 745   2      
 746   2              case 0x5A:
 747   2                 for (i=0;i<6;i++) LcdBuf[i]=SerData[6+i];
 748   2                 ShowNums();
 749   2                 InputN=0;
 750   2                 bEnter=0;
 751   2                 break;
 752   2      
 753   2              case 0x5C://循环显示效果
 754   2                 bRcvOk=0;
 755   2                 bRcvChar=0;
 756   2                 if (SerData[3]!=0) SendAck();//开始启动应答
 757   2                 CharN=SerData[2]-6;
 758   2                 LcdClr(0);
 759   2                 LCDLED=0;
 760   2                 LedTimer=C_LED; //亮
 761   2                 bLoopShow=1;
 762   2                 LoopPos=0;
 763   2                 return;//!!
 764   2      
 765   2              case 0x5D://全屏显示效果
 766   2                 bRcvOk=0;
 767   2                 bRcvChar=0;
 768   2                 if (SerData[3]!=0) SendAck();
 769   2                 bLoopShow=0;//!!
 770   2                 CharN=SerData[2]-6;
 771   2                 LcdClr(0);
 772   2                 Prints(CharData[0],CharData[1],&CharData[2],CharN);
*** WARNING C259 IN LINE 772 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'parameter': pointer: different mspace
 773   2                 LCDLED=0;
 774   2                 LedTimer=C_LED; //亮
 775   2                 return;//!!
 776   2      
 777   2              case 0x5E://写缺省显示数据
 778   2                 bRcvOk=0;
 779   2                 bRcvChar=0;
 780   2                 if (SerData[3]!=0) SendAck();//开始启动应答
 781   2                 CharN=SerData[2]-6;
 782   2                 if (CharN>0)
 783   2                 {
 784   3                   CharData[0]=CharN;
 785   3                   CharData[1]=0;
 786   3                   WrBytes(0x80,&CharData[0],CharN+2);
*** WARNING C259 IN LINE 786 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'parameter': pointer: different mspace
 787   3                 };
 788   2                 ShowEprom();
 789   2                 return;//!!
 790   2      
 791   2              case 0x55://停止输入
 792   2                 InputMode=0;
 793   2                 if (SerData[6]==2) LcdClr(4);
 794   2                 break;
 795   2             default:
C51 COMPILER V7.00  YXKTV                                                                  05/08/2006 17:58:08 PAGE 14  

 796   2                    break;
 797   2           };
 798   1      
 799   1      ReadClear:
 800   1           bRcvOk=0;
 801   1           SerN=0;
 802   1           bRcvChar=0;//must!!!!
 803   1           return;
 804   1      
 805   1      ReadClear1:
 806   1           switch (SerData[4])  /*命令码*/
 807   1           {
 808   2      
 809   2              case 0x51:/*多键带计时*/
 810   2              case 0x52:
 811   2              case 0x53: /*单键带计时,包含抢答*/
 812   2                InputMode=SerData[4]-0x50;
 813   2                i=SerData[6];
 814   2                if ((SerData[2]==5)&&(i<0x80))
 815   2                 {  i=i&0x0f;
 816   3                    if (i!=DataPos)
 817   3                    { //收到不同的DataPos时表示已经启动新的扫描
 818   4                    DataPos=i;
 819   4                    InputClr();
 820   4                    ShowNums();
 821   4                    }
 822   3                  }
 823   2           }
 824   1           goto ReadClear;
 825   1      }
 826          
 827          void InputClr()
 828          {  uchar i;
 829   1         for (i=0;i<6;i++) LcdBuf[i]=0x0f;
 830   1         InputN=0;
 831   1         bDot=0;bEnter=0;
 832   1         TimerA=0;
 833   1         Money=0;
 834   1      }
 835          
 836          void SystemIni()
 837          {       register uchar i;
 838   1      
 839   1              TMOD=0x21;              /*定时器0工作于方式1,定时器1工作于方式0*/
 840   1              PCON=0x80;              /*波特率19200*/
 841   1              SCON=0x50;              /*串行口为方式1,10位异步收发模式*/
 842   1      
 843   1              TH0=C_T0H;
 844   1              TL0=C_T0L;
 845   1      
 846   1              TH1=0xFD;
 847   1              TL1=0xFD;
 848   1      
 849   1              IT0=1;                  /*外中断为下降沿触发*/
 850   1              IP=0;                   /*中断优先级全部设为低优先级*/
 851   1              //PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
 852   1              ET0=1;ES=1;             /*开定时器0中断和串行口中断*/
 853   1              ET1=0;     //串口定时器1关
 854   1              EX0=0;     //INT0关
 855   1      
 856   1              P1=0xff;
 857   1              P2=0xff;
C51 COMPILER V7.00  YXKTV                                                                  05/08/2006 17:58:08 PAGE 15  

 858   1              InputClr();
 859   1      
 860   1              if (InitOkNum!=0xA5)
 861   1              {  ReadIni();
 862   2                 InitOkNum=0xA5;
 863   2                 InitOkNum1=0x5A;
 864   2                 //LcdAll();DelayMs(200);DelayMs(200);//复位测试
 865   2              }
 866   1      
 867   1              LcdInit();
 868   1      
 869   1              TimerN=C_TIMERN;
 870   1              LoopT=C_LOOPT;
 871   1              SerN=0;
 872   1              bRcvOk=0;bSendOk=1;
 873   1              InputMode=1;
 874   1              SleepTimer=10;//PwrT*120;
 875   1              SleepN=3;
 876   1      
 877   1              P3=0xff; //S52有开机RXD=0的情况
 878   1              REN=1;
 879   1              TR0=1;TR1=1;            /*启动定时器0和定时器1*/
 880   1              EA=1;
 881   1      
 882   1      }
*** WARNING C280 IN LINE 837 OF C:\WAVE\PEI\YXKTV\YXKTV.C: 'i': unreferenced local variable
 883          
 884          void int0 (void) interrupt 0 using 1
 885          {
 886   1              IE0=0;
 887   1      }
 888          
 889          void timer0 (void) interrupt 1 using 1
 890          {       /*TR0=0;*/
 891   1              TH0=C_T0H;
 892   1              TL0=TL0+C_T0L;
 893   1              if (--TimerN==0 )
 894   1                 { bTimer=1;
 895   2                   TimerN=C_TIMERN;}
 896   1              if (--LoopT==0 )
 897   1                 { if (bLoopShow) bLoop=1;
 898   2                   LoopT=C_LOOPT;}
 899   1      
 900   1              /*TR0=1;*/
 901   1              TimerA++;
 902   1              bKeyScan=1;/*键盘防抖*/
 903   1      }
 904          
 905          void Int1 (void) interrupt 2 using 1
 906          {
 907   1          IE1=0;
 908   1      }
 909          
 910          void timer1 (void) interrupt 3 using 1
 911          {
 912   1          //TR1=0;//不能关闭Timer1
 913   1      
 914   1      }
 915          
 916          /*串口数据接收*/
 917          void RecvData() using BANK_SERI
 918          {
C51 COMPILER V7.00  YXKTV                                                                  05/08/2006 17:58:08 PAGE 16  

 919   1           if (bRcvOk) return;
 920   1      
 921   1           //IconSETUP=1;//test
 922   1      
 923   1           switch (SerN)
 924   1           {
 925   2              case 0:
 926   2                   if (SBUF==0xAA) {
 927   3                      SerData[0]=SBUF;
 928   3                      SerN++;
 929   3                   }
 930   2                   break;
 931   2              case 1:
 932   2                   if (SBUF==0x55) {
 933   3                      SerData[1]=SBUF;
 934   3                      SerN++;
 935   3                   } else{
 936   3                         SerN=0;
 937   3                         }
 938   2      
 939   2                   break;
 940   2              case 2:
 941   2                   if ((SBUF>3)&&(SBUF<80)) {//长度
 942   3                      SerData[2]=SBUF;
 943   3                      SerN++;
 944   3                   } else{
 945   3                         SerN=0;
 946   3                         }
 947   2                   break;
 948   2              case 5:
 949   2                   SerData[5]=SBUF;
 950   2                   SerN++;
 951   2                   if (SerData[4]>=0x5C)
 952   2                   {  if ((SBUF==AddL)||(SBUF==0))
 953   3                        bRcvChar=1;
 954   3                      else 
 955   3                        SerN=0; //保证不修改其他键盘的显示缓冲区
 956   3                   }
 957   2                   break;
 958   2              default:
 959   2                   if (bRcvChar==0)
 960   2                   {
 961   3                     if (SerN < C_SERMAXN   )
 962   3                     {
 963   4                        SerData[SerN]=SBUF;
 964   4      //                  if ((SerN==5)&&(SerData[4]>=0x5C))
 965   4      //                     bRcvChar=1;
 966   4                        SerN++;
 967   4                      }else
 968   3                       {  SerN=0;}
 969   3                   } else
 970   2                   {//接收显示数据
 971   3                     if (SerN>73)
 972   3                     { SerN=73;
 973   4                     }
 974   3                     CharData[SerN-6]=SBUF;
 975   3                     SerN++;
 976   3                   };
 977   2      
 978   2                   if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
 979   3                        bRcvOk=1; }
 980   2                   break;
C51 COMPILER V7.00  YXKTV                                                                  05/08/2006 17:58:08 PAGE 17  

 981   2           }
 982   1      }
 983          
 984          
 985          /*发送的数据入串口Buf*/
 986          void PushSendBuf(uchar i)
 987          {
 988   1           if (SerN >= C_SERMAXN) return;
 989   1           SerData[SerN]=i;
 990   1           SerN++;
 991   1           SerBufN++;
 992   1      }
 993          
 994          /*开始发送数据包*/
 995          void StartSendBuf()

⌨️ 快捷键说明

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