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

📄 yxkey.lst

📁 C51环境下的有线投票器的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 543          {       /*TR0=0;*/
 544   1              TH0=C_T0H;
 545   1              TL0=TL0+C_T0L;
 546   1              if (--TimerN==0 )
 547   1                 { bTimer=1;
 548   2                   TimerN=C_TIMERN;}
 549   1              /*TR0=1;*/
 550   1              TimerA++;
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 10  

 551   1              bKeyScan=1;/*键盘防抖*/
 552   1      }
 553          
 554          void Int1 (void) interrupt 2 using 1
 555          {
 556   1          IE1=0;
 557   1      }
 558          
 559          void timer1 (void) interrupt 3 using 1
 560          {
 561   1          TR1=0;
 562   1      }
 563          
 564          /*串口数据接收*/
 565          void RecvData() using BANK_SERI
 566          {
 567   1           if (bRcvOk) return;
 568   1      
 569   1           switch (SerN)
 570   1           {
 571   2              case 0:
 572   2                   if (SBUF==0xAA) {
 573   3                      SerData[0]=SBUF;
 574   3                      SerN++;
 575   3                   }
 576   2                   break;
 577   2              case 1:
 578   2                   if (SBUF==0x55) {
 579   3                      SerData[1]=SBUF;
 580   3                      SerN++;
 581   3                   } else{
 582   3                         SerN=0;
 583   3                         }
 584   2      
 585   2                   break;
 586   2              case 2:
 587   2                   if ((SBUF>3)&&(SBUF<14)) {//长度
 588   3                      SerData[2]=SBUF;
 589   3                      SerN++;
 590   3                   } else{
 591   3                         SerN=0;
 592   3                         }
 593   2                   break;
 594   2              default:
 595   2                   if (SerN < C_SERMAXN   )
 596   2                   {
 597   3                      SerData[SerN]=SBUF;
 598   3                      SerN++;
 599   3                      if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
 600   4                         bRcvOk=1;
 601   4                      }
 602   3                   }else{
 603   3                         SerN=0;
 604   3                   }
 605   2                   break;
 606   2           }
 607   1      }
 608          
 609          
 610          /*发送的数据入串口Buf*/
 611          void PushSendBuf(uchar i)
 612          {
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 11  

 613   1           if (SerN >= C_SERMAXN) return;
 614   1           SerData[SerN]=i;
 615   1           SerN++;
 616   1           SerBufN++;
 617   1      }
 618          
 619          /*开始发送数据包*/
 620          void StartSendBuf()
 621          {
 622   1            TR=0;/*切换到发送状态*/
 623   1            IconTX=1;
 624   1            DelayMs(2);
 625   1      
 626   1            SerHeadN=C_HEADN ;
 627   1            SerN=0;
 628   1            SBUF=0x55;
 629   1            bSendOk=0;
 630   1      }
 631          
 632          /*串口发送中断调用的 串口数据发送*/
 633          void SendData() using BANK_SERI
 634          {
 635   1           if (bSendOk) return;
 636   1      
 637   1      /*     if (SerHeadN>0) /*发送引导数据*/
 638   1      /*     {    if (SerHeadN==1) SBUF=0x66 ;
 639   1                   else
 640   1                if (SerHeadN==2) SBUF=0xFF ;
 641   1                   else SBUF=0x55;
 642   1                SerHeadN--;
 643   1                return;
 644   1           }
 645   1      */
 646   1           SBUF=SerData[SerN];
 647   1           SerN++;
 648   1           //if (SerN>=SerBufN)//Bug!最后一个字节不发送
 649   1           if (SerN>SerBufN)
 650   1           {
 651   2              TR=1;   /*切换到接收状态*/
 652   2              bSendOk=1;
 653   2              SerN=0;
 654   2              SerBufN=0;
 655   2           }
 656   1      }
 657          
 658          void serials(void) interrupt 4 using BANK_SERI
 659          {
 660   1              if(RI==1)
 661   1              {
 662   2                 RI=0;
 663   2                 //if (TR==1) RecvData();/*有发送状态产生接受中断的情况*/
 664   2                 RecvData();
 665   2                 return;
 666   2              }
 667   1              if(TI==1)
 668   1              {
 669   2                 TI=0;
 670   2                 SendData();
 671   2             }
 672   1      }
 673          
 674          /*------------------------------*/
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 12  

 675          void KeyScan()
 676          {
 677   1      #ifdef KEY15
 678   1           uchar code KEYTAB[] =
 679   1           //{ 0,0x0e,0x0f,0x0c,0x0d,1,4,7,0x0a,2,5,8,0,3,6,9,0x0b,0x10};
 680   1           { 0,KOK,KPRE,0,KESC,1,4,7,KDOT,2,5,8,0,3,6,9,KSPC,KFUNC};
 681   1      #else
                   uchar code KEYTAB[] =
                   { 0,0x0e,0x0f,0x0c,0x0d,1,4,KOK,0x0a,2,5,KESC,0,3,6,9,0x0b,0x10};
              #endif
 685   1      
 686   1           register uchar i,KeyTemp;
 687   1      
 688   1           bKeyScan=0;
 689   1      
 690   1           bKeyOk=0;
 691   1           P1=0xff;
 692   1           for (i=0;i<4;i++)
 693   1           {
 694   2              if (i==0) K0=0;
 695   2              if (i==1) K1=0;
 696   2              if (i==2) K2=0;
 697   2              if (i==3) K3=0;
 698   2              KeyTemp = i*4;
 699   2              if (K4==0) {KeyTemp=KeyTemp+1;break;}
 700   2              if (K5==0) {KeyTemp=KeyTemp+2;break;}
 701   2              if (K6==0) {KeyTemp=KeyTemp+3;break;}
 702   2              if (K7==0) {KeyTemp=KeyTemp+4;break;}
 703   2              KeyTemp=0;
 704   2           };
 705   1           P1=P1Led;//重写
 706   1      
 707   1           if (KeyTemp==0)
 708   1           {   KeyNo=0xff;
 709   2               LED=1;
 710   2               return;
 711   2           }
 712   1           LED=0;
 713   1           KeyTemp=KEYTAB[KeyTemp];
 714   1           if (KeyTemp==KeyNo ) return;
 715   1           KeyNo=KeyTemp;
 716   1           bKeyOk=1;
 717   1      
 718   1      }
 719          
 720          
 721          /*---24c02--*/
 722          void Start24()
 723          {       SDA=1;
 724   1              NOP
 725   1              SCL=1;//When CLK=1,SDA 1->0 =START!
 726   1              NOP
 727   1              SDA=0;
 728   1              NOP
 729   1              SCL=0;
 730   1              NOP
 731   1      
 732   1      }
 733          
 734          void  Stop24()
 735          {
 736   1              SDA=0;
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 13  

 737   1              NOP
 738   1              SCL=1;
 739   1              NOP
 740   1              SDA=1;
 741   1              NOP
 742   1      }
 743          
 744          unsigned char Rd24(void)
 745          {       register unsigned char i;
 746   1              SDA=1;
 747   1      /*      SCL=1;a7=SDA;SCL=0;
 748   1              SCL=1;a6=SDA;SCL=0;
 749   1              SCL=1;a5=SDA;SCL=0;
 750   1              SCL=1;a4=SDA;SCL=0;
 751   1              SCL=1;a3=SDA;SCL=0;
 752   1              SCL=1;a2=SDA;SCL=0;
 753   1              SCL=1;a1=SDA;SCL=0;
 754   1              SCL=1;a0=SDA;SCL=0;*/
 755   1              ICData=0;
 756   1              SCL=0;
 757   1              for (i=0;i<8;i++)
 758   1              {   SCL=1; NOP    /*实测5V下不延时也可*/
 759   2                  ICDataB0=SDA; NOP
 760   2                  SCL=0; NOP
 761   2                  if (i!=7) ICData=ICData<<1;
 762   2              }
 763   1              SDA=bAck;
 764   1              SCL=1;NOP
 765   1              SCL=0;NOP /*写应答位*/
 766   1              return(ICData);
 767   1      }
 768          
 769          bit Wr24(unsigned char dd)
 770          {   register unsigned char i;
 771   1      /*      ACC=dd;
 772   1              SDA=a7;SCL=1;SCL=0;
 773   1              SDA=a6;SCL=1;SCL=0;
 774   1              SDA=a5;SCL=1;SCL=0;
 775   1              SDA=a4;SCL=1;SCL=0;
 776   1              SDA=a3;SCL=1;SCL=0;
 777   1              SDA=a2;SCL=1;SCL=0;
 778   1              SDA=a1;SCL=1;SCL=0;
 779   1              SDA=a0;SCL=1;SCL=0;  */
 780   1              ICData=dd;
 781   1              for (i=0;i<8;i++)
 782   1              {
 783   2                 SDA=ICDataB7; NOP /*实测5V下不延时也可*/
 784   2                 SCL=1; NOP
 785   2                 SCL=0; NOP
 786   2                 ICData=ICData<<1;
 787   2              }
 788   1      
 789   1              SDA=1;SCL=1; /*等待应答0*/
 790   1              for (i=0;i<100;i++)
 791   1              {  if (SDA==0) break;
 792   2              }
 793   1              bAck=SDA;
 794   1              SCL=0;
 795   1              return bAck;
 796   1      }
 797          
 798          bit RdBytes24(unsigned int iAddr,uchar iLen)
C51 COMPILER V7.00  YXKEY                                                                  10/29/2004 13:57:33 PAGE 14  

 799          {    unsigned char ddd,i;
 800   1      
 801   1           ddd=((iAddr&0x7ff)/256)<<1;
 802   1           Start24();
 803   1           if (Wr24(0xa0|ddd)==1)
 804   1              {bAck=0;goto RDSTOP;}//err
 805   1           Wr24(iAddr);
 806   1           NOP
 807   1           Start24();Wr24(0xa1|ddd);
 808   1      
 809   1           for (i=0;i<iLen;i++)
 810   1           {
 811   2              bAck=0;if (i==(iLen-1)) bAck=1;
 812   2              IcBuf[i]=Rd24();
 813   2           };
 814   1           Stop24();
 815   1           return bAck;
 816   1      

⌨️ 快捷键说明

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