1003.{
1004.memcpy(_data,SerBuffer,16);/*则将读出的数据送_DATA存储*/ 1005.} 1006.}
1007.M500PcdSetTmo(1);/*延时?方式0?*/ 1008.returnstatus;/*返回状态值*/ 1009.} 1010.
1011.////////////////////////////////////////////////////////////////
1012.//Writethemifarecard
1013./*写卡,下载密码到15区?1-15?的任意区的第四块?密钥块?*/
1014.////////////////////////////////////////////////////////////////
1015.charM500PiccWrite(unsignedcharaddr,unsignedchar*_data) 1016.{/*addr=卡的EEROM数据块地址?_data=写入数据的存放区首址*/ 1017.charidatastatus=MI_OK; 1018.
1019.ResetInfo(MInfo);
1020.SerBuffer[0]=PICC_WRITE; 1021.SerBuffer[1]=addr; 1022.MInfo.nBytesToSend=2;
1023./*上面为写卡命令的入口参数?写指令?块地址?发送字节数*/ 1024.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo); 1025.
1026.if(status!=MI_NOTAGERR)/*如果不是出现无卡情况*/ 1027.{
1028.if(MInfo.nBitsReceived!=4)/*如果返回比特数不是4*/ 1029.{
1030.status=MI_BITCOUNTERR;/*则置比特计数错标志*/ 1031.}
1032.else/*如果返回比特数是4*/ 1033.{
1034.SerBuffer[0]&=0x0f;
1035.if((SerBuffer[0]&0x0a)==0) 1036.{
1037.status=MI_NOTAUTHERR;/*没有通过授权?有些块是禁止读写的?*/ 1038.} 1039.else 1040.{
1041.if(SerBuffer[0]==0x0a)/*如果返回数据第一个字节最后四位是A*/ 1042.{
1043.status=MI_OK;/*则写入命令执行成功*/ 1044.}
1045.else 1046.{
1047.status=MI_CODEERR;/*否则是数据校验出错*/ 1048.} 1049.} 1050.} 1051.} 1052.
1053.if(status==MI_OK)/*如果写入命令执行成功*/ 1054.{
1055.M500PcdSetTmo(3); 1056.
1057.ResetInfo(MInfo);
1058.memcpy(SerBuffer,_data,16); 1059.MInfo.nBytesToSend=16;
1060./*上面为写卡命令的入口参数?要写入的数据16字节*/
1061.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);/*开始写入*/ 1062./*要写卡?必须先送命令?再送数据*/
1063.if(status&0x80)/*如果返回状态最高位为1*/ 1064.{
1065.status=MI_NOTAGERR;/*则是无卡在此场*/ 1066.}
1067.else/*如果返回状态最高位为0*/ 1068.{
1069.if(MInfo.nBitsReceived!=4)/*如果返回比特数不是4*/ 1070.{
1071.status=MI_BITCOUNTERR;/*则置比特计数错标志*/ 1072.}
1073.else/*如果返回比特数是4*/ 1074.{
1075.SerBuffer[0]&=0x0f;
1076.if((SerBuffer[0]&0x0a)==0)/*如果返回数据第一个字节最后四位是0*/ 1077.{
1078.status=MI_WRITEERR;/*写卡失败标志*/ 1079.}
1080.else/*如果返回数据第一个字节最后四位不是0*/ 1081.{
1082.if(SerBuffer[0]==0x0a)/*如果返回数据第一个字节最后四位是A?为什么?*/ 1083.{
1084.status=MI_OK;/*则写卡成功*/ 1085.} 1086.else 1087.{
1088.status=MI_CODEERR;/*否则是数据校验出错*/ 1089.} 1090.} 1091.} 1092.}
1093.M500PcdSetTmo(1);/*延时?方式1?*/ 1094.}
1095.returnstatus;/*返回状态值*/ 1096.} 1097.
1098.///////////////////////////////////////////////////////////////////////
1099.//ResetRfCard
1100./*重新配置RF读卡器*/
1101.///////////////////////////////////////////////////////////////////////
1102.charM500PcdRfReset(unsignedcharms) 1103.{
1104.charidatastatus=MI_OK; 1105.
1106.if(ms)/*如果有重启信号1*/ 1107.{
1108.ClearBitMask(RegTxControl,0x03);/*全部清零?不再有输出*/ 1109.delay_1ms(2);
1110.SetBitMask(RegTxControl,0x03);/*让TX1/TX2脚都能输出*/ 1111.}
1112.else/*如果没有重启信号0*/ 1113.{
1114.ClearBitMask(RegTxControl,0x03);/*关闭输出*/ 1115.}
1116.returnstatus;/*返回状态值*/ 1117.} 1118.
1119.#pragmanoaregs 1120.
1121./*延时子程序集*/ 1122.
1123.///////////////////////////////////////////////////////////////////////
1124.//Delay50us
1125.///////////////////////////////////////////////////////////////////////
1126.voiddelay_50us(unsignedchar_50us) 1127.{
1128.while(_50us--) 1129.{
1130._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1131._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1132._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1133._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1134._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1135._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1136._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
1137._nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); 1138.} 1139.} 1140.
1141.///////////////////////////////////////////////////////////////////////
1142.//Delay1ms
1143.///////////////////////////////////////////////////////////////////////
1144.voiddelay_1ms(unsignedchar_1ms) 1145.{
1146.#ifndefNO_TIMER2 1147.RCAP2LH=RCAP2_1ms; 1148.T2LH=RCAP2_1ms; 1149.
1150.TR2=TRUE;
1151.while(_1ms--) 1152.{
1153.while(!TF2); 1154.TF2=FALSE; 1155.}
1156.TR2=FALSE; 1157.#else
1158.while(_1ms--) 1159.{
1160.delay_50us(20); 1161.}
1162.#endif 1163.} 1164.
1165.///////////////////////////////////////////////////////////////////////
1166.//Delay10ms
1167.///////////////////////////////////////////////////////////////////////
1168.voiddelay_10ms(unsignedint_10ms) 1169.{
1170.#ifndefNO_TIMER2 1171.RCAP2LH=RCAP2_10ms; 1172.T2LH=RCAP2_10ms; 1173.
1174.TR2=TRUE;
1175.while(_10ms--) 1176.{
1177.while(!TF2); 1178.TF2=FALSE; 1179.}
1180.TR2=FALSE; 1181.#else
1182.while(_10ms--) 1183.{
1184.delay_50us(19); 1185.if(CmdValid) 1186.return;
1187.delay_50us(20); 1188.if(CmdValid) 1189.return;
1190.delay_50us(20); 1191.if(CmdValid) 1192.return;
1193.delay_50us(20); 1194.if(CmdValid) 1195.return;
1196.delay_50us(20); 1197.if(CmdValid) 1198.return;
1199.delay_50us(20); 1200.if(CmdValid) 1201.return;
1202.delay_50us(20); 1203.if(CmdValid)