#define M500_GLOBALS //PICC=卡?PCD=阅读器 //以下位要包含的头文件
#include
#include /*存储器绝对地址访问定义?与指令MOVX相关*/ #include
#include \内部寄存器定义头文件*/ #include \内部寄存器错误标志头文件*/ #include \内部寄存器定义头文件*/
#include \用户自定义相关变量和数据结构头文件*/
#define GetRegPage(addr)(0x80|(addr>>3)) /*将addr右移3位再与80h取或*/
#definenocard0 / *能量场中没有卡*/ #definemifare11 /*场中有mifare1卡*/
#definemifarepro2 /*场中有mifarepro卡*/ #definemifarelight3 /*场中有mifarelight卡*/ #defineunknowncard4 /*场中有未知卡*/ #defineNO_TIMER21 /*?*/ #defineucharunsignedchar
bdataucharAA; //A,可位寻址单字节数据类型 sbithigh_bit=AA^7; //ACC.7 sbitlow_bit=AA^0; //ACC.0 //ucharsebuf;//RECBUF,SENBUF ucharidatadisp_buf[4]; void del_8us() {
Uchar i;
for(i=0;i<1;i++) {;} }
voiddel_50us()//延时子程序 {
Uchar i;
for(i=0;i<6;i++) {;} }
voiddel_50ms() {
Uchar i,j;
for(i=0;i<255;i++) for(j=0;j<255;j++)
{;} }
voidsend(ucharsebuf)//发送子程序 {
57.uchari; 58.AA=sebuf; 59.CLK=0; 60.CS=0;
61.del_50us();
62.for(i=0;i<8;i++) 63.{
64.del_8us(); 65.DIO=high_bit; 66.CLK=1;
67.del_8us();
68.AA=AA<<1;//循环移位 69.CLK=0; 70.}
71.DIO=0; 72.}
void reset_light()//复位子程序 {
KEY=1; DIO=1;
del_8us(); send(0xa4); CS=1;
del_8us(); }
void reset_7289() {
reset_light();//上电初检 send(0xbf);
CS=1;//测试所有的led灯 del_50ms();
reset_light();//恢复熄灭状态 }
void display() {
Uchar i;
for(i=0;i<4;i++)
{send(0xa1);CS=1;del_8us();//逻辑左移指令 send(0xc8);
send((disp_buf[i]>>4)&0x0f);CS=1;del_8us();
send(0xa1);CS=1;del_8us();//逻辑左移指令 send(0xc8);
send(disp_buf[i]&0x0f);CS=1;del_8us(); } }
///////////////////////////////////////////////////////////////////////
/*往一个寄存器写一个数据*/
///////////////////////////////////////////////////////////////////////
Void WriteRawIO(unsignedcharAddress,unsignedcharvalue) {
XBYTE[Address]=value;/*调用XBYTE函数?*/ }
///////////////////////////////////////////////////////////////////////
/*从一个寄存器读出一个数据*/
///////////////////////////////////////////////////////////////////////
Unsigned char ReadRawIO(unsigned char Address) {
returnXBYTE[Address];/*调用XBYTE函数*/ }
///////////////////////////////////////////////////////////////////////
/*用页选方式访问寄存器?写入?*/
///////////////////////////////////////////////////////////////////////
void WriteIO(unsigned char Address,unsigned char value) {
WriteRawIO(0x00,GetRegPage(Address));/*调用writerawio()函数?页选?80h-87h?*/
WriteRawIO(Address,value);/*调用writerawio()函数?选择一个寄存器?0-7h?*/ }
///////////////////////////////////////////////////////////////////////
/*用页选方式访问寄存器?读出?*/
///////////////////////////////////////////////////////////////////////
Unsigned char ReadIO(unsigned char Address) {
WriteRawIO(0x00,GetRegPage(Address));/*调用writerawio()函数?页选*/ returnReadRawIO(Address);/*调用readrawio()函数*/
}
///////////////////////////////////////////////////////////////////////
/*设置定时时间*/
///////////////////////////////////////////////////////////////////////
void M500PcdSetTmo(unsigned char tmoLength) {
switch(tmoLength) {case1:
WriteIO(RegTimerClock,0x07);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/128--2^7*/
WriteIO(RegTimerReload,0x6a);/*调用WRITEIO()函数,从单片机写计时器的初始值(6AH)*/ break; case2:
WriteIO(RegTimerClock,0x07);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/128--2^7*/
WriteIO(RegTimerReload,0xa0);/*调用WRITEIO()函数,从单片机写计时器的初始值(A0H)*/ break; case3:
WriteIO(RegTimerClock,0x09);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/512--2^9*/
WriteIO(RegTimerReload,0xa0);/*调用WRITEIO()函数,从单片机写计时器的初始值(A0H)*/ break; case4:
WriteIO(RegTimerClock,0x09);/*调用WRITEIO()函数,从单片机写计时器得分频比
(09H)=13.56MHZ/512--2^9*/
WriteIO(RegTimerReload,0xff);/*调用WRITEIO()函数,从单片机写计时器的初始值(FF)*/ break; case5:
WriteIO(RegTimerClock,0x0b);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/128--2^7*/
WriteIO(RegTimerReload,0xff);/*调用WRITEIO()函数,从单片机写计时器的初始值(FFH)*/ break;
case6:
WriteIO(RegTimerClock,0x0d);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/128--2^7*/
WriteIO(RegTimerReload,0xff);/*调用WRITEIO()函数,从单片机写计时器的初始值(FFH)*/ break; case7:
WriteIO(RegTimerClock,0x0f);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/128--2^7*/
WriteIO(RegTimerReload,0xff);/*调用WRITEIO()函数,从单片机写计时器的初始值(FFH)*/ break;
default:/*其它情况*/
WriteIO(RegTimerClock,0x07);/*调用WRITEIO()函数,从单片机写计时器得分频比
(07H)=13.56MHZ/128--2^7*/
WriteIO(RegTimerReload,tmoLength);/*调用WRITEIO()函数,从单片机写计时器的初始值(TMOLENTH)*/ break; } }
///////////////////////////////////////////////////////////////////////
//Request Command define dinISO14443(Mifare) /*命令判别程序*/
///////////////////////////////////////////////////////////////////////
Char M500PcdCmd(unsigned char cmd, volatileunsignedchardata*rcv, MfCmdInfoidata*info) {
Char idatastatus=MI_OK;
Char idatatmpStatus;/*中间状态寄存器*/
Unsigned char idatalastBits;/*中间状态寄存器*/ unsigned int idatatimecnt=0; unsigned char idatairqEn=0x00; unsigned char idatawaitFor=0x00; unsigned char idatatimerCtl=0x00;
WriteIO(RegInterruptEn,0x7F);/*?06H?SETEN,0,TIMER,TX,RX,IDLE,HI,LO=0111,1111:禁中断使 能*/
WriteIO(RegInterruptRq,0x7F);/*(07H)SETIRQ,0,TIMER,TX,RX,IDLE,HI,LO=