1204.return;
1205.delay_50us(20); 1206.if(CmdValid) 1207.return;
1208.delay_50us(20); 1209.if(CmdValid) 1210.return;
1211.delay_50us(19); 1212.if(CmdValid) 1213.return; 1214.}
1215.#endif 1216.} 1217.
1218.///////////////////////////////////////////////////////////////////////
1219./*RC500中断处理总程序*/
1220.///////////////////////////////////////////////////////////////////////
1221.voidRC500ISR(void)interrupt0using1 1222.{
1223.staticunsignedcharidatairqBits; 1224.staticunsignedcharidatairqMask; 1225.staticunsignedcharidatanbytes; 1226.staticunsignedcharidatacnt; 1227.
1228.IE0=0;/*用的是INT0脚*/ 1229.WriteRawIO(0,0x80);
1230.if(MpIsrInfo&&MpIsrOut) 1231.{
1232.while(ReadRawIO(RegPrimaryStatus)&0x08)/*第四位表示是否有中断请求?03H?*/ 1233.{
1234.irqMask=ReadRawIO(RegInterruptEn);/*IRQMASK=中断使能寄存器内容?06H?*/
1235.irqBits=ReadRawIO(RegInterruptRq)&irqMask;/*IRQBITS=中断使能+中断请求寄存器内容?07H?*/
1236.MpIsrInfo->irqSource|=irqBits;
1237.if(irqBits&0x01)/*如果缓冲器FIFO未满成立*/ 1238.{
1239.nbytes=64-ReadRawIO(RegFIFOLength);
1240.if((MpIsrInfo->nBytesToSend-MpIsrInfo->nBytesSent)=nbytes) 1241.{
1242.nbytes=MpIsrInfo->nBytesToSend-MpIsrInfo->nBytesSent;
1243.WriteRawIO(RegInterruptEn,0x01); 1244.}
1245.for(cnt=0;cntnbytes;cnt++) 1246.{
1247.WriteRawIO(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]); 1248.MpIsrInfo->nBytesSent++; 1249.}
1250.WriteRawIO(RegInterruptRq,0x01); 1251.}
1252.if(irqBits&0x10)/*如果有发送中断请求*/ 1253.{
1254.WriteRawIO(RegInterruptRq,0x10);/*则置发送中断请求*/
1255.WriteRawIO(RegInterruptEn,0x82);/*缓冲区FIFO满中断使能*/ 1256.if(MpIsrInfo->cmd==PICC_ANTICOLL1) 1257.{
1258.WriteIO(RegChannelRedundancy,0x02); 1259.WriteRawIO(0,0x80); 1260.} 1261.}
1262.if(irqBits&0x0E)/*如果有接收中断请求?*/ 1263.{
1264.nbytes=ReadRawIO(RegFIFOLength); 1265.for(cnt=0;cntnbytes;cnt++) 1266.{
1267.MpIsrOut[MpIsrInfo->nBytesReceived]=ReadRawIO(RegFIFOData); 1268.MpIsrInfo->nBytesReceived++; 1269.}
1270.WriteRawIO(RegInterruptRq,0x0A&irqBits); 1271.}
1272.if(irqBits&0x04)/*如果有IDLE中断请求*/ 1273.{
1274.WriteRawIO(RegInterruptEn,0x20);/*则置计时器中断使能和请求*/ 1275.WriteRawIO(RegInterruptRq,0x20); 1276.irqBits&=~0x20;
1277.MpIsrInfo->irqSource&=~0x20;
1278.WriteRawIO(RegInterruptRq,0x04); 1279.}
1280.if(irqBits&0x20)/*如果有计时器中断请求*/ 1281.{
1282.WriteRawIO(RegInterruptRq,0x20);
1283.MpIsrInfo->status=MI_NOTAGERR;/*则表明无卡在此场中*/ 1284.} 1285.} 1286.}
1287.} 1288.
1289.///////////////////////////////////////////////////////////////////////
1290./*RS232异步串行通信接收和发送中断子程序*/
1291.///////////////////////////////////////////////////////////////////////
1292.voidisr_UART(void)interrupt4using1 1293.{
1294.unsignedcharlen,i; 1295.unsignedintj=0; 1296.
1297.if(RI) 1298.{
1299.len=SBUF;/*LEN为数据个数*/ 1300.RI=0;
1301.for(i=0;i 1303.while(!RI) 1304.{ 1305.j++; 1306.if(j>1000) 1307.{ 1308.break; 1309.} 1310.} 1311.if(j<1000) 1312.{ 1313.RevBuffer[i]=SBUF;/*接收来自上位机PC的数据*/ 1314.RI=0; 1315.j=0; 1316.} 1317.else 1318.{ 1319.break; 1320.} 1321.} 1322.if(i==len) 1323.{ 1324.REN=0; 1325.CmdValid=1; 1326.} 1327.} 1328.elseif(!RI&&TI) 1329.{ 1330.TI=0; 1331.len=RevBuffer[0];/*LEN为数据个数*/ 1332.for(i=0;i 1334.SBUF=RevBuffer[i];/*发送单片机里的已知数据*/ 1335.while(!TI); 1336.TI=0; 1337.} 1338.REN=1; 1339.} 1340.} 1341. 1342./////////////////////////////////////////////////////////////////////// 1343./*MFRC500软硬件配置总程序*/ 1344./////////////////////////////////////////////////////////////////////// 1345.charMfConfig(void) 1346.{ 1347.charstatus=MI_OK; 1348. 1349.M500PcdConfig();/*配置RC500读写器的引脚?重启时序*/ 1350.M500PcdMfOutSelect(2);/*?*/ 1351.returnstatus; 1352.} 1353. 1354./////////////////////////////////////////////////////////////////////// 1355./*系统初始化---单片机和RC500芯片*/ 1356./////////////////////////////////////////////////////////////////////// 1357.voidinit(void) 1358.{ 1359.RC500RST=0; 1360.ET2=0;//禁止定时器2中断 1361.T2CON=0x04;//启动定时器2(tr2=1) 1362.PCON=0x80; 1363.SCON=0x70;//8位uart,波特率可变 1364.TMOD=0x21;//TMOD=0x21;两个定时器均为自动重载方式 1365. 1366.TH1=BAUD_9600; 1367.TL1=TH1; 1368.TR1=TRUE;//串行口波特率发生器---定时器1 1369. 1370.TH0=0x60;//定时器0初始化 1371.TL0=0x60; 1372.TR0=0; 1373. 1374.ET0=0;//定时器0中断禁止---用作一般定时器 1375.ET1=0;//定时器1中断禁止---用作波特率发生器 1376.EA=1;//总中断允许 1377.EX0=1;//外部中断0允许----rc500的irq 1378.IT0=1;//外部中断0触发类型--下降沿触发 1379.TR2=0;//关闭定时器2(tr2=1) 1380.ES=TRUE;//串行口中断允许 1381.CmdValid=0; 1382. 1383.SPEAKER=1; 1384.delay_10ms(30); 1385.SPEAKER=0; 1386.delay_10ms(30); 1387.SPEAKER=1; 1388. 1389.reset_7289(); 1390.MfConfig();/*调用RC500软硬件配置总程序*/ 1391.} 1392. 1393./////////////////////////////////////////////////////////////////////// 1394.//IC卡处理函数 1395./////////////////////////////////////////////////////////////////////// 1396.voidcmd_execution(void) 1397.{ 1398.unsignedcharcmd; 1399.unsignedcharstatus; 1400. 1401.cmd=RevBuffer[0];/*来自上位机的命令存于REVBUFFER[0]*/ 1402.switch(cmd) 1403.{ 1404.case1:/*终止卡的操作*/ 1405.status=M500PiccHalt(); 1406. 1407.RevBuffer[0]=1; 1408.RevBuffer[1]=status;/*返回给上位机的内容*/ 1409.break; 1410.case2://Request,Anticoll,Select,returnCardType(2bytes)+CardSeri