RC523已经可以正常读写M1卡了,按键控制,OLED显示数据,没有用串口显示但是ID读不出来,第一步寻卡直接失败了,找不到问题点在哪里,知道的大佬能提点一下。以下是代码。
单片机源程序如下:
- u8 xdata AAA=0;
- u8 xdata pUID[10]={0};
- void Pcd_Config(u8 type)//寄存器配置
- {
- PcdAntennaOff();
- if ('A' == type)
- {
- WriteRawRC(CommandReg,PCD_RESETPHASE);
- _nop_();
- WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363
- WriteRawRC(TReloadRegL,30);
- WriteRawRC(TReloadRegH,0);
- WriteRawRC(TModeReg,0x8D);
- WriteRawRC(TPrescalerReg,0x3E);
- WriteRawRC(TxAutoReg,0x40);
- ClearBitMask(Status2Reg,0x08);
- WriteRawRC(ModeReg,0x3D);//3F
- WriteRawRC(RxSelReg,0x86);//84
- WriteRawRC(RFCfgReg,0x7F); //4F
- WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
- WriteRawRC(TReloadRegH,0);
- WriteRawRC(TModeReg,0x8D);
- WriteRawRC(TPrescalerReg,0x3E);
- }
- else if ('B' == type)
- {
- ClearBitMask(Status2Reg, 0x08);
- WriteRawRC(ControlReg, 0x10);
- WriteRawRC(ModeReg, 0x3F); // For 0xFFFF crc
- WriteRawRC(TReloadRegL, 30);
- WriteRawRC(TReloadRegH, 0);
- WriteRawRC(TModeReg, 0x8D);
- WriteRawRC(TPrescalerReg, 0x3E);
- WriteRawRC(TxAutoReg, 0); // Force 100ASK = 0
-
- /**************************************发送部分*****************************/
- WriteRawRC(GsNReg, 0xFa); //0xF8
- WriteRawRC(CWGsCfgReg, 0x3F);
- WriteRawRC(ModGsCfgReg, 0x08); //08
- WriteRawRC(TxModeReg, 0x83); //03
- WriteRawRC(BitFramingReg, 0x00);
- WriteRawRC(AutoTestReg, 0x00);
-
- WriteRawRC(TypeBReg, 0xc0);
- WriteRawRC(ModWidthReg,0x68);
- WriteRawRC(DemodReg, 0x5D);
- WriteRawRC(RFCfgReg, 0x70); // 0x59 RegRxControl1//73,
- WriteRawRC(RxModeReg, 0x83); //03
- WriteRawRC(RxThresholdReg, 0x65);//0x75);
- /**************************************TYPEB特征参数设定*****************************/
- ClearBitMask(RxSelReg,0x3F); // TR0
- SetBitMask(RxSelReg, 0x08);
- ClearBitMask(TxModeReg, 0x80); // ?CRC
- ClearBitMask(RxModeReg, 0x80);
- ClearBitMask(Status2Reg, 0x08); // MFCrypto1On =0
- }
- PcdAntennaOn();
- }
- void typeB_Allot()
- {
- u8 status;
- static u16 xdata count=0;
- if(key4x4_Read_Byte==5)
- {
- count++;
- if(count>=200)
- {
- count=0;
- switch(key4x4_Read_Byte)
- {
- case 5:
- status=RCRequestTypeB();
- if(status==MI_OK)
- {
- key4x4_Read_Byte=6;
- }
- else
- {
- AAA=1;
- }
- break;
- case 6:
- status=RCATTRIBTypeB();
- if(status==MI_OK)
- {
- key4x4_Read_Byte=7;
- }
- else
- {
- AAA=2;
- }
- break;
- case 7:
- status=RCGetUIDTypeB(pUID);
- if(status==MI_OK)
- {
- key4x4_Read_Byte=8;
- }
- else
- {
- AAA=3;
- }
- break;
- case 8:
- // PcdHalt();//终止卡的操作,命令卡片进入休眠状态
- AAA=4;
- key4x4_Read_Byte=0;
- break;
- }
- }
- }
- }
- void OLED_Allot()
- {
- static u16 xdata count=0;
- if(OLED_Modify_Allow) //允许单片机修改XRAM
- {
- count++;
- switch(count)
- {
- case 5: OLED_Symbol_Ser(0,0,pUID[0]/16+'0',pUID[0]%16+'0');break;
- case 10:OLED_Symbol_Ser(0,1,pUID[1]/16+'0',pUID[1]%16+'0');break;
- case 15:OLED_Symbol_Ser(0,2,pUID[2]/16+'0',pUID[2]%16+'0');break;
- case 20:OLED_Symbol_Ser(0,3,pUID[3]/16+'0',pUID[3]%16+'0');break;
- case 25:OLED_Symbol_Ser(0,4,pUID[4]/16+'0',pUID[4]%16+'0');break;
- case 30:OLED_Symbol_Ser(0,5,pUID[5]/16+'0',pUID[5]%16+'0');break;
- case 35:OLED_Symbol_Ser(0,6,pUID[6]/16+'0',pUID[6]%16+'0');break;
- case 40:OLED_Symbol_Ser(0,7,pUID[7]/16+'0',pUID[7]%16+'0');break;
- case 45:OLED_Symbol_Ser(2,0,pUID[8]/16+'0',pUID[8]%16+'0');break;
- case 50:OLED_Symbol_Ser(2,2,pUID[9]/16+'0',pUID[9]%16+'0');break;
- case 55:OLED_Symbol_Ser(2,4,key4x4_Read_Byte+'0',AAA+'0');
- // case 60:OLED_Symbol_Ser(2,7,Read_Buffer[14]+'0',Read_Buffer[15]+'0');break;
- // case 65:OLED_Symbol_Ser(4,3,(AAA-1)/10+'0',(AAA-1)%10+'0');
- count=0;break;
- }
- OLED_Modify_Allow=0;
- }
- else //不允许修改RAM,只能显示数据到OLED
- {
- OLED_New_Show_Ser();
- }
- }
- void main()
- {
- P0M1=0;P0M0=0;
- P1M1=0;P1M0=0;
- P2M1=0;P2M0=0;
- P3M1=0;P3M0=0;
- P4M1=0;P4M0=0;
- P5M1=0;P5M0=0;
- IIC_Init();
- OLED_Init();
- // Pcd_Config('A');
- Pcd_Config('B');
- while(1)
- {
- OLED_Allot();
- key_Scan_Drive();
- typeA_Allot();
- typeB_Allot();
- }
- }
复制代码 |