📄 main.c
字号:
#define uchar unsigned char
#define uint unsigned int
#include "pic.h"
#include "string.h"
#include "inc\define.h"
#include "inc\rc500.h"
interrupt intserv(void);
void delay();
void char_to_hex();
void WriteRC(unsigned char Address, unsigned char value); //通用寄存器写命令,先指定页,再对地址写数据
char ReadRC(unsigned char Address); //通用寄存器读命令,先指定页,再对地址读数据
void PutRC500(unsigned char address,unsigned char dat3); // Write one byte to the reader IC address space
char GetRC500(unsigned char address);
char RC500Config(void);
char RC500OutSelect(unsigned char type);
char Mf500PiccRequest(unsigned char req_code, unsigned char *atq);
char RC500GetSnr(unsigned char* snr);
char Mf500PiccAnticoll (unsigned char bcnt,unsigned char *snr);
char PcdRfReset(unsigned char ms);
// char PcdReset(void);
void PcdSetTmo(unsigned int tmoLength);
char PcdSingleResponseCmd(unsigned char cmd);
// char Mf500PcdSetDefaultAttrib(void);
// char Mf500PcdLoadKeyE2(unsigned char key_type,unsigned char sector,unsigned char *uncoded_keys);
char Mf500PiccCommonRequest(unsigned char req_code, unsigned char *atq);
//
char Mf500PiccCascAnticoll (unsigned char select_code,unsigned char bcnt,unsigned char *snr);
//
char Mf500PiccSelect(unsigned char *snr, unsigned char *sak);
//
char Mf500PiccCascSelect(unsigned char select_code, unsigned char *snr, unsigned char *sak);
// char Mf500PiccAuthKey(unsigned char auth_mode,unsigned char *snr,unsigned char *keys, unsigned char sector);
//
// char Mf500PiccRead(unsigned char addr,unsigned char *data1); //从相应卡块读 16 字节
// char Mf500PiccWrite(unsigned char addr,unsigned char *data1); //向相应卡块写 16 字节
// char Mf500PiccHalt(void);
//
// char Mf500PiccAuthState(unsigned char auth_mode,unsigned char *snr,unsigned char sector);
//
// char Mf500PiccAuth(unsigned char key_type,unsigned char key_addr,unsigned char block);
// ;
// char Mf500PiccAuthE2(unsigned char auth_mode,unsigned char *snr,unsigned char key_sector,unsigned char block);
//
// char M500PiccValue(unsigned char dd_mode,unsigned char addr,unsigned long value);
//
// char M500PiccRestore(unsigned char addr);
//
// char M500PiccTransfer(unsigned char trans_addr);
//
// char Mf500HostCodeKey(unsigned char *uncoded, unsigned char *coded);
//
// void Mf500E2LoadKey(unsigned char *key,unsigned char addr);
// void Mf500E2ReloadKey(unsigned char addr);
char PcdReadE2(unsigned short startaddr,unsigned char length,unsigned char* data);
char PcdWriteE2(unsigned short startaddr,unsigned char length,unsigned char* data);
//
void SetBitMask(unsigned char reg,unsigned char mask);
void ClearBitMask(unsigned char reg,unsigned char mask);
void FlushFIFO(void);
// char ExchangeByteStream(unsigned char Cmd,unsigned char *send_data,unsigned char send_bytelen,unsigned char *rec_data, unsigned char *rec_bytelen);
//
// void start_timeout(unsigned int _50us);
// void stop_timeout(void);
void CommRx(void);
void BeepBeep(unsigned char cunt,unsigned char Hold);
void BeepControl(void);
void Copy(unsigned char *ptr1,unsigned char *ptr2,unsigned char Numb);
void LED_R_Flash(unsigned char cunt,unsigned char timer);
void LEDControl(void);
void SysIni(void);
// void eStart(void);
// void eStop(void);
// void eSend(unsigned char ebyte);
// void WaitAck(void);
// void eNack(void) ; //停止继续读
// void eAck(void) ; //发送继续读信号
// void DelayMS(unsigned char val);
// void DelayUS(void);//10us
// void Write24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr);
// void Read24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr);
// unsigned char eReceive(void);
//****************************************************************
//***************************** 主程序 ****************************
//****************************************************************
void main (void)
{
SysIni();
while(1)
{
if(tmrCommRx)
{
// 操作请求
status1 = Mf500PiccRequest(PICC_REQALL, tt1);//
if (status1==MI_OK)
// 读物理卡号
status1=RC500GetSnr(Snr_RC500);
if (status1==MI_OK)
// 防碰撞
status1=Mf500PiccAnticoll(0,Snr_RC500);
if (status1==MI_OK)
{
// 选择卡
status1=Mf500PiccSelect(Snr_RC500,sak1);
Flag.CardIn=1;// 读到卡
// BeepBeep(1,8);// 调试
tmrReadCard=0;
if ((Snr_RC500[0]==Snr_Temp[0])&&
(Snr_RC500[1]==Snr_Temp[1])&&
(Snr_RC500[2]==Snr_Temp[2])&&
(Snr_RC500[3]==Snr_Temp[3]))
{
Flag.CardSame=1;
}
else
{
Flag.CardSame=0;
Snr_Temp[0]=Snr_RC500[0];
Snr_Temp[1]=Snr_RC500[1];
Snr_Temp[2]=Snr_RC500[2];
Snr_Temp[3]=Snr_RC500[3];
}
}
}
if (Flag.Over50ms)
{
Flag.Over50ms=0;
if (Flag.cRxOver)
{
CommRx();
Flag.cRxOver=0;
cRxCunt=0;
}
LEDControl();
BeepControl();
}
}
}
unsigned char HexToChar(unsigned char Hex)
{
unsigned char CharByte;
if (Hex<0x0a)
{
CharByte=Hex+0x30;
}
else
{
Hex-=9;
CharByte=Hex+0x40;
}
return CharByte;
}
unsigned char CharToHex(unsigned char Char1,unsigned char Char2)
{
unsigned char Hex;
if (Char1 < 'A')
{
Char1 -= 0x30;
}
else
{
Char1 -= 0x40;
Char1 += 9;
}
if (Char2 < 'A')
{
Char2 -= 0x30;
}
else
{
Char2 -= 0x40;
Char2 += 9;
}
Hex = (Char1<<4)|Char2;
return Hex;
}
interrupt intserv(void)
{
unsigned char iRxByte;
if ((RCIF)&&(RCIE))
{
tmrCommRx=0;
iRxByte=RCREG;
if ((FERR)||(OERR))
{
SPEN=0;
SPEN=1;
RCREG==RCREG;
}
else
{
Sta.CommErr=0;
tmrCommErr=0;
CommBuff[cRxCunt]=iRxByte;
cRxCunt++;
}
}
if (T0IF)//1.45ms
{
T0IF=0;
tmrCommRx++;
tmr50ms++;
if (tmrCommRx==0) tmrCommRx=1;
if ((tmrCommRx>=3)&&(cRxCunt))
{
Flag.cRxOver=1;
}
// 50ms
if (tmr50ms>=68)
{
tmr50ms=0;
Flag.Over50ms=1;
tmrBeep++;
tmrLed++;
tmr500ms++;
tmrCommErr++;
if (tmrBeep>=BeepHoldTmr) {Flag.BeepOver=1;tmrBeep=0;}
if (tmrLed>=LedHoldTmr) {Flag.LedOver=1;tmrLed=0;}
if (tmrCommErr>42)
{
Sta.CommErr=1;
LedHoldTmr=5;//每秒闪两次,亮250ms,灭250ms
}
// 500ms
if (tmr500ms>=10)
{
tmr500ms=0;
tmrReadCard++;
if (tmrReadCard>=8)
{
Flag.CardIn=0;
Snr_Temp[0]=0xff;
Snr_Temp[1]=0xff;
Snr_Temp[2]=0xff;
Snr_Temp[3]=0xff;
tmrReadCard=0;
}
}
}
}
if (RBIF)
{
RBIE=0;
RBIF=0;
}
if (INTF)
{
INTF=0;
INTE=0;
}
}
#include "code\rc500.c"
#include "code\comm.c"
void Copy(unsigned char *ptr1,unsigned char *ptr2,unsigned char Numb)
{
unsigned char i;
while(Numb)
{
ptr2[i]=ptr1[i];
Numb--;
i++;
}
}
void BeepBeep(unsigned char cunt,unsigned char Hold)
{
BBcunt=cunt;
BeepHoldTmr=Hold;
}
void BeepControl(void)
{
if (Flag.BeepOver)
{
if (Sta.BEEP_ON)
{
BeepOff();
Sta.BEEP_ON=0;
BBcunt--;
tmrBeep=0;
}
else
{
if (BBcunt)
{
BeepOn();
Sta.BEEP_ON=1;
tmrBeep=0;
}
else
{
BeepOff();
}
}
}
Flag.BeepOver=0;
}
void LED_R_Flash(unsigned char cunt,unsigned char timer)
{
LEDcunt=cunt;
LedHoldTmr=timer*2;
Sta.CommErr=0;
Flag.LedOver=1;
tmrLed=0;
Sta.LED_R_ON=0;
}
// LED 控制
void LEDControl(void)
{
if (!Flag.LedOver)
return;
Flag.LedOver=0;
if (Sta.CommErr) // 通信错误,2秒无通信
{
if (Sta.LED_R_ON)
{
Sta.LED_R_ON=0;
LED_R_OFF();
LED_G_OFF();
}
else
{
LED_G_OFF();
Sta.LED_R_ON=1;
LED_R_ON();
}
}
else
{
if (LEDcunt)
{
if (Sta.LED_R_ON)
{
LED_R_OFF();
LED_G_OFF();
Sta.LED_R_ON=0;
LEDcunt--;
}
else
{
LED_R_ON();
LED_G_OFF();
Sta.LED_R_ON=1;
}
tmrCommErr=0;
}
// else
// {
// LED_G_ON();
// LED_R_OFF();
// }
}
}
void SysIni(void)
{
unsigned int i;
STATUS=0;
INTCON=0x0;
for(i=0;i<650;i++); //for(i=0;i<550;i++);
ADCON0=adcon0_ini; //adc 初始化
ADCON1=adcon1_ini;
TRISA=trisa_ini; //io 口初始化
TRISB=trisb_ini;
TRISC&=0xf2;
PORTA=porta_ini;
PORTB=portb_ini;
PORTC=portc_ini;
OPTION=option_ini; //定时器0 初始化
TMR0=timer0_ini;
T0IF=0;
T1CON=t1con_ini; //定时器1 初始化
TMR1L=timer1l_ini;
TMR1H=timer1h_ini;
TMR1IF=0;
T2CON=t2con_ini; //定时器 2 初始化
TMR2=timer2_ini;
TMR2IF=0;
clrwdt();
// eStop();
ADCON1=adcon1_ini;
ADCON0=adcon0_ini; //adc 初始化
rc500_rst = 0;
rc500_cs = 1; // enable the cs for rc500
rc500_wr = 1;
rc500_rd = 1;
rc500_ale = 0;
RC500Config(); // Initialise the RC500
RC500OutSelect(mfout);
MyAddr=0x31;
// Read24C32(E2Addr_Baud,1,&Baud);
if (Baud!=35)
{
Baud=71;
}
SPBRG=Baud;
RCSTA=rxdsta_ini; //串口初始化
TXSTA=txdsta_ini;
RCIE=1;
INTCON=0xE0;
BeepBeep(2,8);
Sta.CommErr=0;
tmrCommErr=0;
LED_R_Flash(1,5);
}
//#include "code\a24c01.c"
//#include "code\a24c32.c"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -