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

📄 yxkeyv1.0.c

📁 C51环境下的有线投票器的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
       if (!((SerData[3]==0)&&(SerData[5]==0)))
          goto ReadClear;/*地址相同或00*/

     SerN=0; //!bug 有不发送应答的处理
             //所以先清除SerN,否则后继第一条指令丢失

     switch (SerData[4])  /*命令码*/
     {
        case 0x50:
          ReadCmd50();
          //InputN=6; //按键不能再输入 no 会影响启动扫描命令的InputClr
          bRcvOk=0;
          return;

        case 0x51:/*多键带计时,包含抢答*/
        case 0x52:
          if (SerData[2]==4)//len
             SendMoreKey();
          bRcvOk=0;
          return;/*不用break,保证SERN不改写为0*/

        case 0x53: /*单键不带计时*/
          if (SerData[2]==4)//len
             SendOneKey();
          bRcvOk=0;
          return;

        case 0x5A: //显示数字
           InputN=0;
           bEnter=0;
           break;

       default:
              break;
     };

ReadClear:
     SerN=0;
     bRcvOk=0;
     return;
}

void InputClr()
{ uchar i;
   for (i=0;i<6;i++) LcdBuf[i]=0x0f;
   for (i=0;i<3;i++) KeyBuf[i]=0xff;
   InputN=0;
   bDot=0;bEnter=0;
   TimerA=0;
}

void SystemIni()
{       register uchar i;

        TMOD=0x21;              /*定时器0工作于方式1,定时器1工作于方式0*/
        PCON=0x80;              /*波特率19200*/
        SCON=0x50;              /*串行口为方式1,10位异步收发模式*/

        TH0=C_T0H;
        TL0=C_T0L;

        TH1=0xFD;
        TL1=0xFD;
        TR0=1;TR1=1;            /*启动定时器0和定时器1*/
        IT0=1;                  /*外中断为下降沿触发*/
        IP=0;                   /*中断优先级全部设为低优先级*/
        //PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
        EX0=1;                  /*开发各个中断*/
        ET0=1;ES=1;             /*开定时器0中断和串行口中断*/

        TR=1;          /*系统先置为接收状态*/

        if ((InitOkNum!=0xAA) | (InitOkNum2!=0x55))
        {  ReadIni();
           InitOkNum=0xAA;
           InitOkNum2=0x55;
        }
        P1Led=0xff;

        PwrTimer=PwrT*120;
        TimerN=C_TIMERN;
        SerN=0;
        bRcvOk=0;bSendOk=1;

        LED=0;
        //for (i=0;i<20;i++) DelayMs(200);//复位测试

        InputClr();
        REN=1;
        EA=1;

}

void int0 (void) interrupt 0 using 1
{
        IE0=0;
}

void timer0 (void) interrupt 1 using 1
{       /*TR0=0;*/
        TH0=C_T0H;
        TL0=TL0+C_T0L;
        if (--TimerN==0 )
           { bTimer=1;
             TimerN=C_TIMERN;}
        /*TR0=1;*/
        TimerA++;
        bKeyScan=1;/*键盘防抖*/
}

void Int1 (void) interrupt 2 using 1
{
    IE1=0;
}

void timer1 (void) interrupt 3 using 1
{
    TR1=0;
}

/*串口数据接收*/
void RecvData() using BANK_SERI
{
     if (bRcvOk) return;

     switch (SerN)
     {
        case 0:
             if (SBUF==0xAA) {
                SerData[0]=SBUF;
                SerN++;
             }
             break;
        case 1:
             if (SBUF==0x55) {
                SerData[1]=SBUF;
                SerN++;
             } else{
                   SerN=0;
                   }

             break;
        case 2:
             if ((SBUF>3)&&(SBUF<14)) {//长度
                SerData[2]=SBUF;
                SerN++;
             } else{
                   SerN=0;
                   }
             break;
        default:
             if (SerN < C_SERMAXN   )
             {
                SerData[SerN]=SBUF;
                SerN++;
                if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
                   bRcvOk=1;
                }
             }else{
                   SerN=0;
             }
             break;
     }
}


/*发送的数据入串口Buf*/
void PushSendBuf(uchar i)
{
     if (SerN >= C_SERMAXN) return;
     SerData[SerN]=i;
     SerN++;
     SerBufN++;
}

/*开始发送数据包*/
void StartSendBuf()
{
      TR=0;/*切换到发送状态*/
      IconTX=1;
      DelayMs(2);

      SerHeadN=C_HEADN ;
      SerN=0;
      SBUF=0x55;
      bSendOk=0;
}

/*串口发送中断调用的 串口数据发送*/
void SendData() using BANK_SERI
{
     if (bSendOk) return;

/*     if (SerHeadN>0) /*发送引导数据*/
/*     {    if (SerHeadN==1) SBUF=0x66 ;
             else
          if (SerHeadN==2) SBUF=0xFF ;
             else SBUF=0x55;
          SerHeadN--;
          return;
     }
*/
     SBUF=SerData[SerN];
     SerN++;
     //if (SerN>=SerBufN)//Bug!最后一个字节不发送
     if (SerN>SerBufN)
     {
        TR=1;   /*切换到接收状态*/
        bSendOk=1;
        SerN=0;
        SerBufN=0;
     }
}

void serials(void) interrupt 4 using BANK_SERI
{
        if(RI==1)
        {
           RI=0;
           //if (TR==1) RecvData();/*有发送状态产生接受中断的情况*/
           RecvData();
           return;
        }
        if(TI==1)
        {
           TI=0;
           SendData();
       }
}

/*------------------------------*/
void KeyScan()
{    uchar code KEYTAB[] =
     { 0,0x0e,0x0f,0x0c,0x0d,1,4,7,0x0a,2,5,8,0,3,6,9,0x0b,0x10};

     register uchar i,KeyTemp;

     bKeyScan=0;

     bKeyOk=0;
     P1=0xff;
     for (i=0;i<4;i++)
     {
        if (i==0) K0=0;
        if (i==1) K1=0;
        if (i==2) K2=0;
        if (i==3) K3=0;
        KeyTemp = i*4;
        if (K4==0) {KeyTemp=KeyTemp+1;break;}
        if (K5==0) {KeyTemp=KeyTemp+2;break;}
        if (K6==0) {KeyTemp=KeyTemp+3;break;}
        if (K7==0) {KeyTemp=KeyTemp+4;break;}
        KeyTemp=0;
     };
     P1=P1Led;//重写

     if (KeyTemp==0)
     {   KeyNo=0;
         LED=1;
         return;
     }
     LED=0;
     KeyTemp=KEYTAB[KeyTemp];
     if (KeyTemp==KeyNo ) return;
     KeyNo=KeyTemp;
     bKeyOk=1;

}


/*---24c02--*/
void Start24()
{	SDA=1;
        NOP
       	SCL=1;//When CLK=1,SDA 1->0 =START!
        NOP
	SDA=0;
        NOP
	SCL=0;
        NOP

}

void  Stop24()
{
        SDA=0;
        NOP
	SCL=1;
        NOP
	SDA=1;
        NOP
}

unsigned char Rd24(void)
{       register unsigned char i;
	SDA=1;
/*	SCL=1;a7=SDA;SCL=0;
	SCL=1;a6=SDA;SCL=0;
	SCL=1;a5=SDA;SCL=0;
	SCL=1;a4=SDA;SCL=0;
	SCL=1;a3=SDA;SCL=0;
	SCL=1;a2=SDA;SCL=0;
	SCL=1;a1=SDA;SCL=0;
	SCL=1;a0=SDA;SCL=0;*/
        ICData=0;
        SCL=0;
        for (i=0;i<8;i++)
        {   SCL=1; NOP    /*实测5V下不延时也可*/
            ICDataB0=SDA; NOP
            SCL=0; NOP
            if (i!=7) ICData=ICData<<1;
        }
	SDA=bAck;
        SCL=1;NOP
        SCL=0;NOP /*写应答位*/
	return(ICData);
}

bit Wr24(unsigned char dd)
{   register unsigned char i;
/*	ACC=dd;
	SDA=a7;SCL=1;SCL=0;
	SDA=a6;SCL=1;SCL=0;
	SDA=a5;SCL=1;SCL=0;
	SDA=a4;SCL=1;SCL=0;
	SDA=a3;SCL=1;SCL=0;
	SDA=a2;SCL=1;SCL=0;
	SDA=a1;SCL=1;SCL=0;
	SDA=a0;SCL=1;SCL=0;  */
        ICData=dd;
        for (i=0;i<8;i++)
        {
           SDA=ICDataB7; NOP /*实测5V下不延时也可*/
           SCL=1; NOP
           SCL=0; NOP
           ICData=ICData<<1;
        }

	SDA=1;SCL=1; /*等待应答0*/
        for (i=0;i<100;i++)
        {  if (SDA==0) break;
        }
        bAck=SDA;
        SCL=0;
        return bAck;
}

bit RdBytes24(unsigned int iAddr,uchar iLen)
{    unsigned char ddd,i;

     ddd=((iAddr&0x7ff)/256)<<1;
     Start24();
     if (Wr24(0xa0|ddd)==1)
        {bAck=0;goto RDSTOP;}//err
     Wr24(iAddr);
     NOP
     Start24();Wr24(0xa1|ddd);

     for (i=0;i<iLen;i++)
     {
        bAck=0;if (i==(iLen-1)) bAck=1;
        IcBuf[i]=Rd24();
     };
     Stop24();
     return bAck;

RDSTOP:
     Stop24();
     return bAck;
}

bit WrBytes24(unsigned int iAddr,uchar iLen)
{
     unsigned char ddd,i;

     ddd=((iAddr&0x7ff)/256)<<1;
     Start24();
     if (Wr24(0xa0|ddd)==1)
        {bAck=0;goto WRSTOP;}//err
     Wr24(iAddr);

     for (i=0;i<iLen;i++)
     {
        if (Wr24(IcBuf[i])==1)
              {bAck=0;goto WRSTOP;}//err
     };
     bAck=1;//OK
     Stop24();
     DelayMs(10);     //wait 10ms...

     return bAck;
WRSTOP:
     Stop24();
     return bAck;
}

void Tst24()
{   Stop24();NOP
    RdBytes24(0,6);
//    WrBytes24(0,6);
}

void DelayMs(uchar Ms)
{  uchar i;
   do
   {
     for (i=0;i<100;i++) ; /*12us*100?*/

     Ms--;
   } while (Ms!=0);
}

⌨️ 快捷键说明

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