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

📄 yxkey.lst

📁 C51环境下的有线投票器的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 268   1      
 269   1      }
 270          
 271          
 272          
 273          void TimerFunc()
 274            {   bTimer=0;
 275   1      
 276   1            LED2=~LED2;
 277   1            //SendMoreKey();
 278   1       }
 279          
 280          /*统一的发送按键结果*/
 281          void SendInfo(uchar iPos,uchar iMode)
 282          {  uchar data i,Crc;
 283   1      
 284   1          if (iPos<0x80)
 285   1          {
 286   2              if (iPos!=0)
 287   2               {
 288   3                    iPos=iPos&0x0f;
 289   3                    if (iPos!=DataPos)
 290   3                    { //收到不同的DataPos时表示已经启动新的扫描
 291   4                    DataPos=iPos;
 292   4                    InputClr();
 293   4                    //ShowNums();
 294   4                    //for (i=0;i<10;i++) IcBuf[i]=0;//多人1投票器
 295   4                    }
 296   3                 }
 297   2           }
 298   1           else
 299   1           {//读出记录
 300   2             iPos=iPos&0x0f;
 301   2             //ReadKey(iPos);
 302   2             //ShowNums();
 303   2             bEnter=1;
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 6   

 304   2           }
 305   1      
 306   1                EA=0;SerN=0;TR=1;
 307   1                PushSendBuf(0xAA);
 308   1                PushSendBuf(0x55);
 309   1                PushSendBuf(0);
 310   1                PushSendBuf(AddH);
 311   1                PushSendBuf(0);
 312   1                PushSendBuf(AddL);
 313   1      
 314   1            switch (iMode)
 315   1            {
 316   2              case 0:
 317   2                SerData[2]=0x0B;
 318   2                SerData[4]=0x50;
 319   2                PushSendBuf(02);
 320   2                PushSendBuf(AddH);
 321   2                PushSendBuf(AddL );
 322   2                PushSendBuf(PwrT);
 323   2                PushSendBuf(Config1);
 324   2                PushSendBuf(Config2);
 325   2                PushSendBuf(Config3);
 326   2                break;
 327   2              case 1: //多键
 328   2                SerData[2]=0x0C;
 329   2                if (bEnter) SerData[4]=0x52;else SerData[4]=0x51;
 330   2                PushSendBuf(LcdBuf[0]);
 331   2                PushSendBuf(LcdBuf[1]);
 332   2                PushSendBuf(LcdBuf[2]);
 333   2                PushSendBuf(LcdBuf[3]);
 334   2                PushSendBuf(LcdBuf[4]);
 335   2                PushSendBuf(LcdBuf[5]);
 336   2                PushSendBuf(TimerA /256 );
 337   2                PushSendBuf(TimerA);
 338   2                break;
 339   2              case 2://单键
 340   2                SerData[2]=0x06;
 341   2                SerData[4]=0x53;
 342   2                PushSendBuf(LcdBuf[5]);
 343   2                PushSendBuf(0);
 344   2                break;
 345   2      /*        case 3://多人投票
 346   2                SerData[2]=0x0E;
 347   2                SerData[4]=0x56;
 348   2                for (i=0;i<10;i++) PushSendBuf(IcBuf[i]);
 349   2                break;*/
 350   2             }
 351   1      
 352   1                Crc=0;
 353   1                for (i=1;i<SerData[2];i++)
 354   1                    Crc=Crc^SerData[i+2];
 355   1      
 356   1                PushSendBuf(Crc);
 357   1                EA=1;
 358   1                StartSendBuf();
 359   1      
 360   1      }
 361          
 362          void SendIni()
 363          {
 364   1         SendInfo(0,0);
 365   1      }
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 7   

 366          
 367          
 368          /*处理系统命令*/
 369          void ReadCmd50()
 370          {    //uchar data i;
 371   1           switch (SerData[6])  /*子命令码*/
 372   1           {  case 0x1:/*显示编号*/
 373   2                   break;
 374   2              case 0x2: /*读配置*/
 375   2                   if ((KeyNo!=KOK)&&(KeyNo!=KK7)) break;
 376   2      
 377   2                   SendIni();
 378   2      
 379   2                   break;
 380   2              case 0x3:  /*写配置*/
 381   2                   if ((KeyNo!=KOK)&&(KeyNo!=KK7)) break;
 382   2      
 383   2                   AddH=SerData[7];
 384   2                   AddL=SerData[8];
 385   2                   PwrT=SerData[9];
 386   2                   Config1=SerData[10];
 387   2                   Config2=SerData[11];
 388   2                   Config3=SerData[12];
 389   2                   WriteIni();
 390   2                   ReadIni();
 391   2                   SendIni();
 392   2                   break;
 393   2      
 394   2              case 0x4: /*延时关机*/
 395   2                   //PwrTimer=SerData[7]*256 + SerData[8];
 396   2                   break;
 397   2              default: //认为是按模式扫描启动
 398   2                   InputClr();
 399   2                   break;
 400   2            }
 401   1           //Beep();
 402   1      }
 403          
 404          /*解读串口命令*/
 405          void ReadCmd()
 406          {    register uchar i,Crc;
 407   1      
 408   1      
 409   1           Crc=0;
 410   1           for (i=0;i<SerN-4;i++) Crc=Crc^SerData[i+3]; /*计算CRC,Len后Crc前的XOR值*/
 411   1           if(Crc!=SerData[SerN-1]) /*CRC效验不正确*/
 412   1              {  goto ReadClear;
 413   2      
 414   2              }
 415   1      
 416   1           LED2=~LED2;
 417   1           P1=P1Led;
 418   1      
 419   1           if (!((SerData[3]==AddH) && (SerData[5]==AddL)))
 420   1             if (!((SerData[3]==0)&&(SerData[5]==0)))
 421   1                goto ReadClear1;/*地址相同或00*/
 422   1      
 423   1           SerN=0; //!bug 有不发送应答的处理
 424   1                   //所以先清除SerN,否则后继第一条指令丢失
 425   1      
 426   1           switch (SerData[4])  /*命令码*/
 427   1           {
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 8   

 428   2              case 0x50:
 429   2                ReadCmd50();
 430   2                //InputN=6; //按键不能再输入 no 会影响启动扫描命令的InputClr
 431   2                bRcvOk=0;
 432   2                return;
 433   2      
 434   2              case 0x51:/*多键带计时*/
 435   2              case 0x52:
 436   2                if (SerData[2]==5) SendInfo(SerData[6],1);//带DataPos
 437   2                              else SendInfo(0,1);
 438   2                bRcvOk=0;
 439   2                return;/*不用break,保证SERN不改写为0*/
 440   2      
 441   2              case 0x53: /*单键带计时,包含抢答*/
 442   2                if (SerData[2]==5) SendInfo(SerData[6],2);
 443   2                              else SendInfo(0,2);
 444   2                bRcvOk=0;
 445   2                return;
 446   2      
 447   2              case 0x5A: //显示数字
 448   2                 InputN=0;
 449   2                 bEnter=0;
 450   2                 break;
 451   2      
 452   2             default:
 453   2                    break;
 454   2           };
 455   1      
 456   1      ReadClear:
 457   1           SerN=0;
 458   1           bRcvOk=0;
 459   1           return;
 460   1      
 461   1      ReadClear1:
 462   1           switch (SerData[4])  /*命令码*/
 463   1           {
 464   2      
 465   2              case 0x51:/*多键带计时*/
 466   2              case 0x52:
 467   2              case 0x53: /*单键带计时,包含抢答*/
 468   2                i=SerData[6];
 469   2                if ((SerData[2]==5)&&(i<0x80))
 470   2                 {  i=i&0x0f;
 471   3                    if (i!=DataPos)
 472   3                    { //收到不同的DataPos时表示已经启动新的扫描
 473   4                    DataPos=i;
 474   4                    InputClr();
 475   4                    //ShowNums();
 476   4                    //for (i=0;i<10;i++) IcBuf[i]=0;//多人1投票器
 477   4                    }
 478   3                 }
 479   2      
 480   2           }
 481   1           goto ReadClear;
 482   1      
 483   1      }
 484          
 485          void InputClr()
 486          { uchar i;
 487   1         for (i=0;i<6;i++) LcdBuf[i]=0x0f;
 488   1         for (i=0;i<3;i++) KeyBuf[i]=0xff;
 489   1         InputN=0;
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 9   

 490   1         bDot=0;bEnter=0;
 491   1         TimerA=0;
 492   1      }
 493          
 494          void SystemIni()
 495          {       register uchar i;
 496   1      
 497   1              TMOD=0x21;              /*定时器0工作于方式1,定时器1工作于方式0*/
 498   1              PCON=0x80;              /*波特率19200*/
 499   1              SCON=0x50;              /*串行口为方式1,10位异步收发模式*/
 500   1      
 501   1              TH0=C_T0H;
 502   1              TL0=C_T0L;
 503   1      
 504   1              TH1=0xFD;
 505   1              TL1=0xFD;
 506   1              TR0=1;TR1=1;            /*启动定时器0和定时器1*/
 507   1              IT0=1;                  /*外中断为下降沿触发*/
 508   1              IP=0;                   /*中断优先级全部设为低优先级*/
 509   1              //PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
 510   1              EX0=1;                  /*开发各个中断*/
 511   1              ET0=1;ES=1;             /*开定时器0中断和串行口中断*/
 512   1      
 513   1              TR=1;          /*系统先置为接收状态*/
 514   1      
 515   1              //if ((InitOkNum!=0xAA) | (InitOkNum2!=0x55))
 516   1              {
 517   2                 ReadIni();
 518   2                 InitOkNum=0xAA;
 519   2                 InitOkNum2=0x55;
 520   2              }
 521   1              P1Led=0xff;
 522   1      
 523   1              PwrTimer=PwrT*120;
 524   1              TimerN=C_TIMERN;
 525   1              SerN=0;
 526   1              bRcvOk=0;bSendOk=1;
 527   1      
 528   1              LED=0;
 529   1              //for (i=0;i<20;i++) DelayMs(200);//复位测试
 530   1      
 531   1              InputClr();
 532   1              REN=1;
 533   1              EA=1;
 534   1      
 535   1      }
*** WARNING C280 IN LINE 495 OF C:\WAVE\PEI\YXKEY\YXKEY.C: 'i': unreferenced local variable
 536          
 537          void int0 (void) interrupt 0 using 1
 538          {
 539   1              IE0=0;
 540   1      }
 541          
 542          void timer0 (void) interrupt 1 using 1

⌨️ 快捷键说明

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