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

📄 yxkeyv1.0.lst

📁 C51环境下的有线投票器的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 258   2              PwrT=IcBuf[2];
 259   2              Config1=IcBuf[3];
 260   2              Config2=IcBuf[4];
 261   2              Config3=IcBuf[5];
 262   2          }
 263   1      
 264   1      }
 265          
 266          
 267          
 268          void SendIni()
 269          {  uchar data i,Crc;
 270   1      
 271   1              EA=0;SerN=0;TR=0;
 272   1      
 273   1                PushSendBuf(0xAA);
 274   1                PushSendBuf(0x55);
 275   1                PushSendBuf(0x0b);
 276   1                PushSendBuf(AddH);
 277   1                PushSendBuf(0x50);
 278   1                PushSendBuf(AddL);
 279   1                PushSendBuf(02);
 280   1                PushSendBuf(AddH);
 281   1                PushSendBuf(AddL );
 282   1                PushSendBuf(PwrT);
 283   1                PushSendBuf(Config1);
 284   1                PushSendBuf(Config2);
 285   1                PushSendBuf(Config3);
 286   1      
 287   1                Crc=0;
 288   1                for (i=1;i<SerData[2];i++)
 289   1                    Crc=Crc^SerData[i+2];
 290   1      
 291   1                PushSendBuf(Crc);
 292   1                EA=1;
 293   1                StartSendBuf();
 294   1      
 295   1      }
 296          
 297          
 298          
 299          void TimerFunc()
 300            {   bTimer=0;
 301   1      
 302   1            LED2=~LED2;
 303   1            //SendMoreKey();
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 6   

 304   1       }
 305          
 306          /*多键结果*/
 307          void SendMoreKey()
 308          {  uchar data i,Crc;
 309   1                EA=0;SerN=0;TR=0;
 310   1      
 311   1                PushSendBuf(0xAA);
 312   1                PushSendBuf(0x55);
 313   1                PushSendBuf(0x0C);
 314   1                PushSendBuf(AddH);
 315   1                if (bEnter) PushSendBuf(0x52);else PushSendBuf(0x51);
 316   1                PushSendBuf(AddL);
 317   1                PushSendBuf(LcdBuf[0]);
 318   1                PushSendBuf(LcdBuf[1]);
 319   1                PushSendBuf(LcdBuf[2]);
 320   1                PushSendBuf(LcdBuf[3]);
 321   1                PushSendBuf(LcdBuf[4]);
 322   1                PushSendBuf(LcdBuf[5]);
 323   1                PushSendBuf(TimerA /256 );
 324   1                PushSendBuf(TimerA);
 325   1      
 326   1                Crc=0;
 327   1                for (i=1;i<SerData[2];i++)
 328   1                    Crc=Crc^SerData[i+2];
 329   1      
 330   1                PushSendBuf(Crc);
 331   1                EA=1;
 332   1                StartSendBuf();
 333   1      
 334   1      }
 335          
 336          /*单键结果*/
 337          void SendOneKey()
 338          {  uchar data i,Crc;
 339   1                EA=0;SerN=0;TR=0;
 340   1      
 341   1                PushSendBuf(0xAA);
 342   1                PushSendBuf(0x55);
 343   1                PushSendBuf(0x05);//len
 344   1                PushSendBuf(AddH);
 345   1                PushSendBuf(0x53);
 346   1                PushSendBuf(AddL);
 347   1                PushSendBuf(LcdBuf[5]);
 348   1                //PushSendBuf(TimerA /256 );
 349   1                //PushSendBuf(TimerA);
 350   1      
 351   1                Crc=0;
 352   1                for (i=1;i<SerData[2];i++)
 353   1                    Crc=Crc^SerData[i+2];
 354   1      
 355   1                PushSendBuf(Crc);
 356   1                EA=1;
 357   1                StartSendBuf();
 358   1      
 359   1      }
 360          
 361          
 362          /*处理系统命令*/
 363          void ReadCmd50()
 364          {    //uchar data i;
 365   1           switch (SerData[6])  /*子命令码*/
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 7   

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

 428   2              case 0x51:/*多键带计时,包含抢答*/
 429   2              case 0x52:
 430   2                if (SerData[2]==4)//len
 431   2                   SendMoreKey();
 432   2                bRcvOk=0;
 433   2                return;/*不用break,保证SERN不改写为0*/
 434   2      
 435   2              case 0x53: /*单键不带计时*/
 436   2                if (SerData[2]==4)//len
 437   2                   SendOneKey();
 438   2                bRcvOk=0;
 439   2                return;
 440   2      
 441   2              case 0x5A: //显示数字
 442   2                 InputN=0;
 443   2                 bEnter=0;
 444   2                 break;
 445   2      
 446   2             default:
 447   2                    break;
 448   2           };
 449   1      
 450   1      ReadClear:
 451   1           SerN=0;
 452   1           bRcvOk=0;
 453   1           return;
 454   1      }
 455          
 456          void InputClr()
 457          { uchar i;
 458   1         for (i=0;i<6;i++) LcdBuf[i]=0x0f;
 459   1         for (i=0;i<3;i++) KeyBuf[i]=0xff;
 460   1         InputN=0;
 461   1         bDot=0;bEnter=0;
 462   1         TimerA=0;
 463   1      }
 464          
 465          void SystemIni()
 466          {       register uchar i;
 467   1      
 468   1              TMOD=0x21;              /*定时器0工作于方式1,定时器1工作于方式0*/
 469   1              PCON=0x80;              /*波特率19200*/
 470   1              SCON=0x50;              /*串行口为方式1,10位异步收发模式*/
 471   1      
 472   1              TH0=C_T0H;
 473   1              TL0=C_T0L;
 474   1      
 475   1              TH1=0xFD;
 476   1              TL1=0xFD;
 477   1              TR0=1;TR1=1;            /*启动定时器0和定时器1*/
 478   1              IT0=1;                  /*外中断为下降沿触发*/
 479   1              IP=0;                   /*中断优先级全部设为低优先级*/
 480   1              //PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
 481   1              EX0=1;                  /*开发各个中断*/
 482   1              ET0=1;ES=1;             /*开定时器0中断和串行口中断*/
 483   1      
 484   1              TR=1;          /*系统先置为接收状态*/
 485   1      
 486   1              if ((InitOkNum!=0xAA) | (InitOkNum2!=0x55))
 487   1              {  ReadIni();
 488   2                 InitOkNum=0xAA;
 489   2                 InitOkNum2=0x55;
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 9   

 490   2              }
 491   1              P1Led=0xff;
 492   1      
 493   1              PwrTimer=PwrT*120;
 494   1              TimerN=C_TIMERN;
 495   1              SerN=0;
 496   1              bRcvOk=0;bSendOk=1;
 497   1      
 498   1              LED=0;
 499   1              //for (i=0;i<20;i++) DelayMs(200);//复位测试
 500   1      
 501   1              InputClr();
 502   1              REN=1;
 503   1              EA=1;
 504   1      
 505   1      }
*** WARNING C280 IN LINE 466 OF C:\WAVE\PEI\YXKEY\YXKEYV1.0.C: 'i': unreferenced local variable
 506          
 507          void int0 (void) interrupt 0 using 1
 508          {
 509   1              IE0=0;
 510   1      }
 511          
 512          void timer0 (void) interrupt 1 using 1
 513          {       /*TR0=0;*/
 514   1              TH0=C_T0H;
 515   1              TL0=TL0+C_T0L;
 516   1              if (--TimerN==0 )
 517   1                 { bTimer=1;
 518   2                   TimerN=C_TIMERN;}
 519   1              /*TR0=1;*/
 520   1              TimerA++;
 521   1              bKeyScan=1;/*键盘防抖*/
 522   1      }

⌨️ 快捷键说明

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