📄 rc500pro.c
字号:
//#include "stor_commu.c"
//#include "WrReadE2.c"
/****************************************************************************
* 名称:RC500_config()
* 功能:RC500模块复位,发送复位命令后,RC500返回00 00 00 FF 03,不用管
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500_config(void)
{
unsigned int i;
unsigned char config[5]={0x00,0x52,0x00,0xAD,0x03};//发送的命令字符
unsigned char nouse[5],err=0;
Flag3&=~Flaguart0rx; //清除接收中断标志
for(i=0; i<3; i++)
{
while (!(IFG1 & UTXIFG0));
TXBUF0=STX;
DelayMS(10);
if((Flag3&Flaguart0rx)==0)//等待接收中断
{
;
}
else if((Flag3&Flaguart0rx)>0) break;
if(err++==2)
{
err=0;
return 0;
}
}
//如果RC500模块回复ACK,则发送复位命令
if(RXBUF0 ==ACK)
{
for(i=0 ;i<5; i++)
{
while(!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?);
TXBUF0=config[i];
}
}
else return 0;
Flag3&=~Flaguart0rx; //清除接收中断标志
//发送命令后等待300ms之内的回应
Flag3|=WaitReply; //开始等待回应
while ((Flag3&Flaguart0rx)==0)
{
if((Flag3&rdCARDTimeOut)>0)
{
Flag3&=~rdCARDTimeOut;
return 0; //超时返回
}
}
if(RXBUF0 ==STX)
{
while(!(IFG1 & UTXIFG0));
TXBUF0=ACK;
}
else return 0;
Flag3&=~Flaguart0rx;
Flag3|=WaitReply; //开始等待回应
//返回00 00 00 FF 03赋值给nouse数组,只是为了不影响后面的接收
i=0;
while( i < 5)
{
while ((Flag3&Flaguart0rx)==0)
{
if((Flag3&rdCARDTimeOut)>0)
{
Flag3&=~rdCARDTimeOut;
return 0; //超时返回
}
}
nouse[i++]=RXBUF0; //卡的类型赋值
Flag3&=~Flaguart0rx; //把UART0接收标志位清零
}
return 1;
}
/****************************************************************************
* 名称:RC500_request()
* 功能:RC500模块查询命令,发送0x41命令检查在有效范围内是否有卡存在,如果有返回卡的类型
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500_request(void)
{
unsigned char i,CardTyp[7];
unsigned char request[6]={0x00,0x41,0x01,0x01,0xBE,0x03},err=0;//发送的命令字符
for(i=0; i<7; i++)
{
CardTyp[i]=0x00;
}
Flag3&=~Flaguart0rx; //首先把UART0接收标志位清零
for(i=0; i<3; i++)
{
while (!(IFG1 & UTXIFG0));
TXBUF0=STX;
DelayMS(10);
if((Flag3&Flaguart0rx)==0) //等待接收中断
{
;//DelayMS(5);
}
else if((Flag3&Flaguart0rx)>0) break;
if(err++==2)
{
err=0;
return 0;
}
}
if(RXBUF0 ==ACK)
{
for(i=0 ;i<6; i++)
{
while(!(IFG1 & UTXIFG0));
TXBUF0=request[i]; // 发送查询命令
}
}
else return 0;
Flag3&=~Flaguart0rx; //把UART0接收标志位清零
Flag3|=WaitReply; //开始等待回应
while ((Flag3&Flaguart0rx)==0)
{
if((Flag3&rdCARDTimeOut)>0)
{
Flag3&=~rdCARDTimeOut;
return 0; //超时返回
}
}
if ( RXBUF0 ==STX)
{
while(!(IFG1 & UTXIFG0));
TXBUF0=ACK; //接到应答返回ACK确认
}
else return 0;
Flag3&=~Flaguart0rx; //把UART0接收标志位清零
Flag3|=WaitReply; //开始等待回应
i=0;
while( i < 7)
{
while ((Flag3&Flaguart0rx)==0)
{
if((Flag3&rdCARDTimeOut)>0)
{
Flag3&=~rdCARDTimeOut;
return 0; //超时返回
}
}
CardTyp[i++]=RXBUF0; //卡的类型赋值
Flag3&=~Flaguart0rx; //把UART0接收标志位清零
}
return 1;
}
/****************************************************************************
* 名称:RC500_request()
* 功能:RC500模块防冲突命令,发送0x71命令,进行防冲突操作,返回卡的序列号
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500_anticoll2(void)
{
unsigned char i,tmCardSNR[9];
unsigned char anticoll2[7]={0x00,0x71,0x02,0x00,0x00,0x8C,0x03},err=0;//发送的命令字符
for(i=0; i<9; i++)
{
tmCardSNR[i]=0x00;
}
Flag3&=~Flaguart0rx; //首先把UART0接收标志位清零
for(i=0; i<3; i++)
{
while (!(IFG1 & UTXIFG0));
TXBUF0=STX;
DelayMS(10);
if((Flag3&Flaguart0rx)==0) //等待接收中断
{
;
}
else if((Flag3&Flaguart0rx)>0) break;
if(err++==2)
{
err=0;
return 0;
}
}
if( RXBUF0 ==ACK) //如果收到ack
{
for(i=0 ;i<7; i++)
{
while(!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?);
TXBUF0=anticoll2[i]; //卡号赋值
} //返回ACK
}
else return 0;
Flag3&=~Flaguart0rx; //首先把UART0接收标志位清零
Flag3|=WaitReply; //开始等待回应
while ((Flag3&Flaguart0rx)==0)
{
if((Flag3&rdCARDTimeOut)>0)
{
Flag3&=~rdCARDTimeOut;
return 0; //超时返回
}
}
if ( RXBUF0 ==STX)
{
while(!(IFG1 & UTXIFG0));
TXBUF0=ACK; //返回ACK
}
else return 0;
Flag3&=~Flaguart0rx; //把UART0接收标志位清零
Flag3|=WaitReply; //开始等待回应
i=0;
while( i < 9)
{
while ((Flag3&Flaguart0rx)==0)
{
if((Flag3&rdCARDTimeOut)>0)
{
Flag3&=~rdCARDTimeOut;
return 0; //超时返回
}
}
tmCardSNR[i++]=RXBUF0;
Flag3&=~Flaguart0rx; //把UART0接收标志位清零
}
//4字节卡号赋值给CardSNR
for(i=0; i<4; i++)
{
CardSNR[i]=tmCardSNR[i+3];
}
return 1;
}
/****************************************************************************
* 名称:storR()
* 功能:把CardStore的一个元素(一个字节)存入E2PROM,并且地址和元素标号+1
* 入口参数:CardStore数组的元素标号
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char storR(unsigned char *Numcou)
{
//unsigned int err=0,j;
if( WRE2check(Addr,CardStore[*Numcou])==0) return 0;
Addr++;
(*Numcou)++;
return 1;
}
/****************************************************************************
* 名称:Store_RC500()
* 功能:把7个字节的CardStore数组存入E2PROM
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char Store_RC500(void)
{
unsigned char i=0;
//AT24C1024_POWER1_HIGH; //POW1high,
//AT24C1024_POWER2_HIGH; //POW2high,
AT24C1024_WP_EN; //WP置低,写使能
for(i=0xff; i>0; i--);
//getAddr();
while(i<7)
{
if ( (Addr <0xFFFF)&(P0 ==0)&(A1 ==0))
{
// unsigned int *p=i;
WRITE_ADDR_POWER=0xA0;
READ_ADDR_POWER=0XA1;
if(storR(&i)==0) return 0;
}
if( (Addr ==0xFFFF)&(P0 ==0)&(A1 ==0))
{
WRITE_ADDR_POWER=0xA0;
READ_ADDR_POWER=0XA1;
if(storR(&i)==0) return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -