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

📄 rc500pro.c

📁 ZLG500BT的mifare卡号读程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        P0 =1;
        A1 =0;
      }
      if ( (Addr <0xFFFF)&(P0 ==1)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA2;
        READ_ADDR_POWER=0XA3;
        if(storR(&i)==0) return 0;
      }
      if ( (Addr==0xFFFF)&(P0 ==1)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA2;
        READ_ADDR_POWER=0XA3;
        if(storR(&i)==0) return 0;
        P0 =0;
        A1 =1;
      }
      if ( (Addr <0xFFFF)&(P0 ==0)&(A1 ==1))
      {
        WRITE_ADDR_POWER=0xA4;
        READ_ADDR_POWER=0XA5;
        if(storR(&i)==0) return 0;
      }
      if ( (Addr==0xFFFF)&(P0 ==0)&(A1 ==1))
      {
        WRITE_ADDR_POWER=0xA4;
        READ_ADDR_POWER=0XA5;
        if(storR(&i)==0) return 0;
        P0 =1;
        A1 =1;
      }
      if ( (Addr <0xFFFF)&(P0 ==1)&(A1 ==1))
      {
        WRITE_ADDR_POWER=0xA6;
        READ_ADDR_POWER=0XA7;
        if(storR(&i)==0) return 0;
      }
    }
    if( storAddr()==0) return 0;
    //关闭E2PROM
    AT24C1024_POWER1_LOW;                       //POW1high,
    AT24C1024_POWER2_LOW;                       //POW2high,
    AT24C1024_WP_NEN;    
    return 1;

}
/****************************************************************************
* 名称:StoreRC500_ok()
* 功能:存储卡号成功后,红灯闪烁3次,蜂鸣一声
* 入口参数:无
* 出口参数:无
****************************************************************************/
void StoreRC500_ok(void)
{
  unsigned char i;
//蜂鸣5次,红灯闪烁5次
    for(i=0; i<4;i++)
    {
      P1OUT ^=BIT6;
      P6OUT ^=BIT5;
      DelayMS(200);
    }
    P1OUT |= BIT6;                  //熄灭红色LED
    P6OUT &=~BIT5;                 //禁止蜂鸣
}

/****************************************************************************
* 名称:Rc500En()
* 功能:RC500模块使能。RC500模块和上传都使用UART0口,通过74hc126选择
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Rc500En(void)
{
  FIVE_EN;       //5V使能
  P3DIR |=BIT1+BIT2;   //rc500_en,updata_enout      
  P3OUT |=BIT1;    //rc500_en 
  P3OUT &=~BIT2;        //updata_en ,low
}


/****************************************************************************
* 名称:CARDTimepro()
* 功能:读卡时间的处理,把读卡时间的年月日和最后存储的日期的年月日相比,不同则存入新的
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char CARDTimepro(void)
{
   unsigned int i;         //
   unsigned char stoTime[7];//RdDateErr=0;err=0,
   unsigned char DATEstor[4]={0,0,0,0};
 /*
   while(PCF8563_I2C_READCLOCK(Time)!=1)       //从时钟芯片读取时钟,并存入Time[7]数组中
   {
     if (RdDateErr++==3)
     {
       RdDateErr=0;
       return 0;
     }
   }*/
   AT24C1024_POWER1_HIGH;
   AT24C1024_POWER2_HIGH;
   WRITE_ADDR_POWER=0XA0;
   READ_ADDR_POWER=0XA1;
   //AT24C1024_WP_EN;
   for(i=0xff; i>0; i--);
   //读出0x0009和0x000A处的最后存入的日期地址,如果与当Date不同,
   //则存入E2PROM新的时间,并把地址存入0x0009,0x000A,P0和A1保存到0X000B
  DATEAddrL=AT24C1024_I2C_READE2(0x0009);
  DATEAddrH=AT24C1024_I2C_READE2(0x000A);
  DATEAddr=((DATEAddrH&0X00FF)<<8)|DATEAddrL; 

  DATEpage=AT24C1024_I2C_READE2(0x000B);

  //取出存储的年月日
  if(DTstorget(4,DATEstor,&DATEAddr,DATEpage)==0) return 0;
    //转换10进制数字为16进制年月日,如十进制35转换成16进制0x35
    for (i=0; i<7; i++)
    {
      stoTime[i]=(Time[i]/10)*6+Time[i];
    }
  
//如果存储的年月日与读卡时的年月日不同就写入新的日期,并将年地址保存到0x0009,0x000A,0x000B,
//并根据地址写入0x0000的地址查询处
  if( (DATEstor[0] != stoTime[6])|(DATEstor[1] != stoTime[5])|(DATEstor[2] != stoTime[3])==1)
  {
    DATEstor[0]=0xBA;
    DATEstor[1]=stoTime[6];                                        //年存入Date[0]
    DATEstor[2]=stoTime[5];                                        //月存入Date[1]
    DATEstor[3]=stoTime[3];                                        //日存入Date[2]
    
    AT24C1024_WP_EN;                        //开启写使能
    
    //将标志位+年月日存入当前地址
    for (i=0; i<4; i++)                                    
    {
      if ( (Addr <0xFFFF)&(P0 ==0)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA0;
        READ_ADDR_POWER=0XA1;
        
        if( WRE2check(Addr,DATEstor[i])==0) return 0;
        Addr++;
      }
      if( (Addr ==0xFFFF)&(P0 ==0)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA0;
        READ_ADDR_POWER=0XA1;
        
        if( WRE2check(Addr,DATEstor[i])==0) return 0;

        Addr++;
        P0 =1;
        A1 =0;
      }
      if ( (Addr <0xFFFF)&(P0 ==1)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA2;
        READ_ADDR_POWER=0XA3;

        if( WRE2check(Addr,DATEstor[i])==0) return 0;
       
        Addr++;
      }
      if ( (Addr==0xFFFF)&(P0 ==1)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA2;
        READ_ADDR_POWER=0XA3;

        if( WRE2check(Addr,DATEstor[i])==0) return 0;
       
        Addr++;
        P0 =0;
        A1 =1;
      }
      if ( (Addr <0xFFFF)&(P0 ==0)&(A1 ==1))
      {
        WRITE_ADDR_POWER=0xA4;
        READ_ADDR_POWER=0xA5;

        if( WRE2check(Addr,DATEstor[i])==0) return 0;
       
        Addr++;
      }
      if ( (Addr==0xFFFF)&(P0 ==0)&(A1 ==1))
      {
        WRITE_ADDR_POWER=0xA4;
        READ_ADDR_POWER=0XA5;

        if( WRE2check(Addr,DATEstor[i])==0) return 0;
      
        Addr++;
        P0 =1;
        A1 =1;
      }
      if ( (Addr <0xFFFF)&(P0 ==1)&(A1 ==1))
      {
        WRITE_ADDR_POWER=0xA6;
        READ_ADDR_POWER=0XA7;

        if( WRE2check(Addr,DATEstor[i])==0) return 0;
      
        Addr++;
      }
      if ( (Addr ==0xFFFF)&(P0 ==1)&(A1 ==1))
      {
        //存储器写满,手持机不能工作,LED不停闪烁        
        CCTL1 &=~CCIE;                              // CCR1 interrupdisabled
        IE2 &=~(URXIE1+UTXIE1);                     //禁止UART1中断
        P2DIR =0XFF;                                //禁止按键中断
        P6DIR |= BIT3+BIT4;
        P6OUT |= BIT3+BIT4;
        //两个LED不停闪烁
        while(1)
        {
          P6OUT ^=(BIT3+BIT4);
          DelayMS(100);
        }
      }
    }
    //将新的地址写入前面的地址查询处
    //将新的年地址写入0x0009,0x000A,0x000B
    WRITE_ADDR_POWER=0xA0;
    READ_ADDR_POWER=0XA1;
    if( WRE2check(0x0009,(Addr-3)&0x00ff)==0) return 0;
    if( WRE2check(0x000A,(Addr-3)>>8)==0)     return 0;
    if( WRE2check(0x000B,(P0|A1<<1))==0)      return 0;
  }
  return 1;
}

/****************************************************************************
* 名称:RC500read()
* 功能:读取卡号成功后,存入E2PROM并且提示
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500read(void)
{
   unsigned char i,config_OK =0,request_OK =0,anticoll2_OK=0;
   unsigned char stoTime[7];                                       //读卡时间
   Rc500En();
   IE1 |= URXIE0;
   DelayMS(10);
   
   for ( i=0xFF; i>0; i--);
   config_OK  =RC500_config();                                      //复位
   request_OK =RC500_request();                                     //询问  
   anticoll2_OK =RC500_anticoll2();                                 //防冲突
   if( (config_OK ==0)|(request_OK==0)|(anticoll2_OK==0)==1) 
   {
     FIVE_NEN;                                   //关闭5v使能
     return 0; //如果有错返回0
   }
   FIVE_NEN;                                   //关闭5v使能
//只是返回,并不用来作出错判断
   if (CARDTimepro()==0) return 0;
   //转换成16进制时间,和前面的storTime一样
    for (i=0; i<7; i++)
    {
      stoTime[i]=(Time[i]/10)*6+Time[i];
    }
   
   for(i=0; i<4; i++)
   {
     CardSNR[i+4]=0;                                              //时间暂为0
   }
   
   AscToHex(CardSNR, CardStore, 3);                                 //将卡号转换成紧缩BCD形式
   
   CardStore[5]=stoTime[2];                                         //将时钟存入
   CardStore[6]=stoTime[1];                                         //将分钟存入
  //提示
   if (Store_RC500()==1)
   {
     StoreRC500_ok();
   }
   return 1;
}

⌨️ 快捷键说明

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