📄 rc500pro.c
字号:
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 + -