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

📄 yxkeyv1.0.lst

📁 C51环境下的有线投票器的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 523          
 524          void Int1 (void) interrupt 2 using 1
 525          {
 526   1          IE1=0;
 527   1      }
 528          
 529          void timer1 (void) interrupt 3 using 1
 530          {
 531   1          TR1=0;
 532   1      }
 533          
 534          /*串口数据接收*/
 535          void RecvData() using BANK_SERI
 536          {
 537   1           if (bRcvOk) return;
 538   1      
 539   1           switch (SerN)
 540   1           {
 541   2              case 0:
 542   2                   if (SBUF==0xAA) {
 543   3                      SerData[0]=SBUF;
 544   3                      SerN++;
 545   3                   }
 546   2                   break;
 547   2              case 1:
 548   2                   if (SBUF==0x55) {
 549   3                      SerData[1]=SBUF;
 550   3                      SerN++;
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 10  

 551   3                   } else{
 552   3                         SerN=0;
 553   3                         }
 554   2      
 555   2                   break;
 556   2              case 2:
 557   2                   if ((SBUF>3)&&(SBUF<14)) {//长度
 558   3                      SerData[2]=SBUF;
 559   3                      SerN++;
 560   3                   } else{
 561   3                         SerN=0;
 562   3                         }
 563   2                   break;
 564   2              default:
 565   2                   if (SerN < C_SERMAXN   )
 566   2                   {
 567   3                      SerData[SerN]=SBUF;
 568   3                      SerN++;
 569   3                      if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
 570   4                         bRcvOk=1;
 571   4                      }
 572   3                   }else{
 573   3                         SerN=0;
 574   3                   }
 575   2                   break;
 576   2           }
 577   1      }
 578          
 579          
 580          /*发送的数据入串口Buf*/
 581          void PushSendBuf(uchar i)
 582          {
 583   1           if (SerN >= C_SERMAXN) return;
 584   1           SerData[SerN]=i;
 585   1           SerN++;
 586   1           SerBufN++;
 587   1      }
 588          
 589          /*开始发送数据包*/
 590          void StartSendBuf()
 591          {
 592   1            TR=0;/*切换到发送状态*/
 593   1            IconTX=1;
 594   1            DelayMs(2);
 595   1      
 596   1            SerHeadN=C_HEADN ;
 597   1            SerN=0;
 598   1            SBUF=0x55;
 599   1            bSendOk=0;
 600   1      }
 601          
 602          /*串口发送中断调用的 串口数据发送*/
 603          void SendData() using BANK_SERI
 604          {
 605   1           if (bSendOk) return;
 606   1      
 607   1      /*     if (SerHeadN>0) /*发送引导数据*/
 608   1      /*     {    if (SerHeadN==1) SBUF=0x66 ;
 609   1                   else
 610   1                if (SerHeadN==2) SBUF=0xFF ;
 611   1                   else SBUF=0x55;
 612   1                SerHeadN--;
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 11  

 613   1                return;
 614   1           }
 615   1      */
 616   1           SBUF=SerData[SerN];
 617   1           SerN++;
 618   1           //if (SerN>=SerBufN)//Bug!最后一个字节不发送
 619   1           if (SerN>SerBufN)
 620   1           {
 621   2              TR=1;   /*切换到接收状态*/
 622   2              bSendOk=1;
 623   2              SerN=0;
 624   2              SerBufN=0;
 625   2           }
 626   1      }
 627          
 628          void serials(void) interrupt 4 using BANK_SERI
 629          {
 630   1              if(RI==1)
 631   1              {
 632   2                 RI=0;
 633   2                 //if (TR==1) RecvData();/*有发送状态产生接受中断的情况*/
 634   2                 RecvData();
 635   2                 return;
 636   2              }
 637   1              if(TI==1)
 638   1              {
 639   2                 TI=0;
 640   2                 SendData();
 641   2             }
 642   1      }
 643          
 644          /*------------------------------*/
 645          void KeyScan()
 646          {    uchar code KEYTAB[] =
 647   1           { 0,0x0e,0x0f,0x0c,0x0d,1,4,7,0x0a,2,5,8,0,3,6,9,0x0b,0x10};
 648   1      
 649   1           register uchar i,KeyTemp;
 650   1      
 651   1           bKeyScan=0;
 652   1      
 653   1           bKeyOk=0;
 654   1           P1=0xff;
 655   1           for (i=0;i<4;i++)
 656   1           {
 657   2              if (i==0) K0=0;
 658   2              if (i==1) K1=0;
 659   2              if (i==2) K2=0;
 660   2              if (i==3) K3=0;
 661   2              KeyTemp = i*4;
 662   2              if (K4==0) {KeyTemp=KeyTemp+1;break;}
 663   2              if (K5==0) {KeyTemp=KeyTemp+2;break;}
 664   2              if (K6==0) {KeyTemp=KeyTemp+3;break;}
 665   2              if (K7==0) {KeyTemp=KeyTemp+4;break;}
 666   2              KeyTemp=0;
 667   2           };
 668   1           P1=P1Led;//重写
 669   1      
 670   1           if (KeyTemp==0)
 671   1           {   KeyNo=0;
 672   2               LED=1;
 673   2               return;
 674   2           }
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 12  

 675   1           LED=0;
 676   1           KeyTemp=KEYTAB[KeyTemp];
 677   1           if (KeyTemp==KeyNo ) return;
 678   1           KeyNo=KeyTemp;
 679   1           bKeyOk=1;
 680   1      
 681   1      }
 682          
 683          
 684          /*---24c02--*/
 685          void Start24()
 686          {       SDA=1;
 687   1              NOP
 688   1              SCL=1;//When CLK=1,SDA 1->0 =START!
 689   1              NOP
 690   1              SDA=0;
 691   1              NOP
 692   1              SCL=0;
 693   1              NOP
 694   1      
 695   1      }
 696          
 697          void  Stop24()
 698          {
 699   1              SDA=0;
 700   1              NOP
 701   1              SCL=1;
 702   1              NOP
 703   1              SDA=1;
 704   1              NOP
 705   1      }
 706          
 707          unsigned char Rd24(void)
 708          {       register unsigned char i;
 709   1              SDA=1;
 710   1      /*      SCL=1;a7=SDA;SCL=0;
 711   1              SCL=1;a6=SDA;SCL=0;
 712   1              SCL=1;a5=SDA;SCL=0;
 713   1              SCL=1;a4=SDA;SCL=0;
 714   1              SCL=1;a3=SDA;SCL=0;
 715   1              SCL=1;a2=SDA;SCL=0;
 716   1              SCL=1;a1=SDA;SCL=0;
 717   1              SCL=1;a0=SDA;SCL=0;*/
 718   1              ICData=0;
 719   1              SCL=0;
 720   1              for (i=0;i<8;i++)
 721   1              {   SCL=1; NOP    /*实测5V下不延时也可*/
 722   2                  ICDataB0=SDA; NOP
 723   2                  SCL=0; NOP
 724   2                  if (i!=7) ICData=ICData<<1;
 725   2              }
 726   1              SDA=bAck;
 727   1              SCL=1;NOP
 728   1              SCL=0;NOP /*写应答位*/
 729   1              return(ICData);
 730   1      }
 731          
 732          bit Wr24(unsigned char dd)
 733          {   register unsigned char i;
 734   1      /*      ACC=dd;
 735   1              SDA=a7;SCL=1;SCL=0;
 736   1              SDA=a6;SCL=1;SCL=0;
C51 COMPILER V7.00  YXKEYV1_0                                                              09/04/2004 15:45:57 PAGE 13  

 737   1              SDA=a5;SCL=1;SCL=0;
 738   1              SDA=a4;SCL=1;SCL=0;
 739   1              SDA=a3;SCL=1;SCL=0;
 740   1              SDA=a2;SCL=1;SCL=0;
 741   1              SDA=a1;SCL=1;SCL=0;
 742   1              SDA=a0;SCL=1;SCL=0;  */
 743   1              ICData=dd;
 744   1              for (i=0;i<8;i++)
 745   1              {
 746   2                 SDA=ICDataB7; NOP /*实测5V下不延时也可*/
 747   2                 SCL=1; NOP
 748   2                 SCL=0; NOP
 749   2                 ICData=ICData<<1;
 750   2              }
 751   1      
 752   1              SDA=1;SCL=1; /*等待应答0*/
 753   1              for (i=0;i<100;i++)
 754   1              {  if (SDA==0) break;
 755   2              }
 756   1              bAck=SDA;
 757   1              SCL=0;
 758   1              return bAck;
 759   1      }
 760          
 761          bit RdBytes24(unsigned int iAddr,uchar iLen)
 762          {    unsigned char ddd,i;
 763   1      
 764   1           ddd=((iAddr&0x7ff)/256)<<1;
 765   1           Start24();
 766   1           if (Wr24(0xa0|ddd)==1)
 767   1              {bAck=0;goto RDSTOP;}//err
 768   1           Wr24(iAddr);
 769   1           NOP
 770   1           Start24();Wr24(0xa1|ddd);
 771   1      
 772   1           for (i=0;i<iLen;i++)
 773   1           {
 774   2              bAck=0;if (i==(iLen-1)) bAck=1;
 775   2              IcBuf[i]=Rd24();
 776   2           };
 777   1           Stop24();
 778   1           return bAck;
 779   1      
 780   1      RDSTOP:
 781   1           Stop24();
 782   1           return bAck;
 783   1      }
 784          
 785          bit WrBytes24(unsigned int iAddr,uchar iLen)
 786          {
 787   1           unsigned char ddd,i;
 788   1      

⌨️ 快捷键说明

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