STM8 RC522 IC卡修改密码程序

合集下载

STM8-RC522-读写IC卡程序

STM8-RC522-读写IC卡程序

#include "stm8s.h"#include "uart.h"void Delay(u32 nCount);extern u8 RxBuffer[RxBufferSize];extern u8 UART_RX_NUM;unsigned char CT[2];//卡类型unsigned char SN[4]; //卡号unsigned char write[16] ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; unsigned char read[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};#define countof(a) (sizeof(a) / sizeof(*(a)))#define BufferSize (countof(Tx_Buffer)-1)u8 Tx_Buffer[] = "STM8S RFID TEST";u8 Rx_Buffer[BufferSize];u32 FLASH_ID ;void cardNo2String(u8 *cardNo, u8 *str);void main(void){unsigned char status;/*设置内部时钟16M为主时钟*/CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);status = memcmp(read,write,16);GPIO_DeInit(GPIOA);GPIO_DeInit(GPIOC);Uart_Init();GPIO_Init( GPIOA, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);InitRc522();UART2_SendString(Tx_Buffer,BufferSize);while(1){status = PcdRequest(PICC_REQALL,CT); /*扫描卡*/status = PcdAnticoll(SN); /*防冲撞*/if (status==MI_OK){GPIO_LOW(GPIOA, GPIO_PIN_4); //寻卡成功UART2_SendString("The card Id is:",15); //串口发送卡号cardNo2String(SN, Tx_Buffer);UART2_SendString(Tx_Buffer, 17);Reset_RC522();}else{GPIO_HIGH(GPIOA, GPIO_PIN_4);}}}void Delay(u32 nCount){while (nCount != 0){nCount--;}}void Hex2String(u8 hex,u8 *str){str[0] = (hex / 100) + '0';str[1] = (hex % 100 / 10) + '0';str[2] = (hex % 10) + '0';}void cardNo2String(u8 *cardNo, u8 *str){u8 Count = 0;for(Count = 0; Count < 4; Count++){Hex2String(cardNo[Count], str + Count * 4);if(Count == 3){str[15] = '\n';}else{str[Count * 4 + 3] = ':';}}}void delay_ns(u32 ns){u32 i;for(i=0;i<ns;i++){asm("nop");asm("nop");asm("nop");}}u8 SPIWriteByte(u8 Byte){u8 tmp;while (SPI_GetFlagStatus( SPI_FLAG_TXE) == RESET); SPI_SendData(Byte);if (SPI_GetFlagStatus(SPI_FLAG_RXNE)){tmp = SPI_ReceiveData();}return tmp;}void SPI2_Init(void){SPI_DeInit();SPI_Init(SPI_FIRSTBIT_MSB, //帧模式,先发送MSB还是LSBSPI_BAUDRATEPRESCALER_8, //波特率分频值SPI_MODE_MASTER, //模式,主从模式SPI_CLOCKPOLARITY_LOW, //时钟极性,空闲时SCK为高/空闲时SCK为低SPI_CLOCKPHASE_1EDGE, //数据采样的边沿选择SPI_DATADIRECTION_2LINES_FULLDUPLEX, //双线单向数据模式,使用C6/C7两条线,数据传输方向位单向SPI_NSS_SOFT, //软件从设备0x07);SPI_Cmd(ENABLE);}void InitRc522(void){SPI2_Init();PcdReset();PcdAntennaOff();PcdAntennaOn();M500PcdConfigISOType( 'A' );}void Reset_RC522(void){PcdReset();PcdAntennaOff();PcdAntennaOn();}///////////////////////////////////////////////////////////////////////功能:寻卡//参数说明: req_code[IN]:寻卡方式// 0x52 = 寻感应区内所有符合14443A标准的卡// 0x26 = 寻未进入休眠状态的卡// pTagType[OUT]:卡片类型代码// 0x4400 = Mifare_UltraLight// 0x0400 = Mifare_One(S50)// 0x0200 = Mifare_One(S70)// 0x0800 = Mifare_Pro(X)// 0x4403 = Mifare_DESFire//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRequest(u8 req_code,u8 *pTagType){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x10)){*pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:防冲撞//参数说明: pSnr[OUT]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAnticoll(u8 *pSnr){char status;u8 i,snr_check=0;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){*(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80);return status;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdSelect(u8 *pSnr){char status;u8 i;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18)){ status = MI_OK; }else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:验证卡片密码//参数说明: auth_mode[IN]: 密码验证模式// 0x60 = 验证A密钥// 0x61 = 验证B密钥// addr[IN]:块地址// pKey[IN]:密码// pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;memcpy(&ucComMF522Buf[2], pKey, 6);memcpy(&ucComMF522Buf[8], pSnr, 4);status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))){ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:读取M1卡一块数据//参数说明: addr[IN]:块地址// p [OUT]:读出的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRead(u8 addr,u8 *p ){char status;u8 unLen;u8 i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_READ;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x90)){for (i=0; i<16; i++){ *(p +i) = ucComMF522Buf[i]; }}else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:写数据到M1卡一块//参数说明: addr[IN]:块地址// p [IN]:写入的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdWrite(u8 addr,u8 *p ){char status;u8 unLen;u8 i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_WRITE;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){for (i=0; i<16; i++){ucComMF522Buf[i] = *(p +i);}CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}///////////////////////////////////////////////////////////////////////功能:命令卡片进入休眠状态//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdHalt(void){u8 status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_HALT;ucComMF522Buf[1] = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);return MI_OK;}///////////////////////////////////////////////////////////////////////用MF522计算CRC16函数/////////////////////////////////////////////////////////////////////void CalulateCRC(u8 *pIn ,u8 len,u8 *pOut ){u8 i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<len; i++){ WriteRawRC(FIFODataReg, *(pIn +i)); }WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do{n = ReadRawRC(DivIrqReg);i--;}while ((i!=0) && !(n&0x04));pOut [0] = ReadRawRC(CRCResultRegL);pOut [1] = ReadRawRC(CRCResultRegM);}///////////////////////////////////////////////////////////////////////功能:复位RC522//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdReset(void){GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);delay_ns(10);GPIO_LOW(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);delay_ns(10);GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);delay_ns(10);WriteRawRC(CommandReg,PCD_RESETPHASE);delay_ns(10);WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40);//必须要return MI_OK;}////////////////////////////////////////////////////////////////////////设置RC632的工作方式//////////////////////////////////////////////////////////////////////char M500PcdConfigISOType(u8 type){if (type == 'A') //ISO14443_A{ClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);WriteRawRC(RxSelReg,0x86);WriteRawRC(RFCfgReg,0x7F);WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);PcdAntennaOn();}else{return 1;}return MI_OK;}///////////////////////////////////////////////////////////////////////功能:读RC632寄存器//参数说明:Address[IN]:寄存器地址//返回:读出的值u8 ReadRawRC(u8 Address){u8 ucAddr;u8 ucResult=0;GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);ucAddr = ((Address<<1)&0x7E)|0x80;SPIWriteByte(ucAddr);ucResult=SPIReadByte();GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);return ucResult;}///////////////////////////////////////////////////////////////////////功能:写RC632寄存器//参数说明:Address[IN]:寄存器地址// value[IN]:写入的值/////////////////////////////////////////////////////////////////////void WriteRawRC(u8 Address, u8 value){u8 ucAddr;GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);ucAddr = ((Address<<1)&0x7E);SPIWriteByte(ucAddr);SPIWriteByte(value);GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);}///////////////////////////////////////////////////////////////////////功能:置RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:置位值/////////////////////////////////////////////////////////////////////void SetBitMask(u8 reg,u8 mask){char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask}///////////////////////////////////////////////////////////////////////功能:清RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:清位值/////////////////////////////////////////////////////////////////////void ClearBitMask(u8 reg,u8 mask){char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & ~mask); // clear bit mask}//功能:通过RC522和ISO14443卡通讯//参数说明:Command[IN]:RC522命令字// pIn [IN]:通过RC522发送到卡片的数据// InLenByte[IN]:发送数据的字节长度// pOut [OUT]:接收到的卡片返回数据// *pOutLenBit[OUT]:返回数据的位长度/////////////////////////////////////////////////////////////////////char PcdComMF522(u8 Command,u8 *pIn ,u8 InLenByte,u8 *pOut ,u8 *pOutLenBit){char status = MI_ERR;u8 irqEn = 0x00;u8 waitFor = 0x00;u8 lastBits;u8 n;u16 i;switch (Command){case PCD_AUTHENT:irqEn = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn = 0x77;waitFor = 0x30;break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x80); //清所有中断位WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80); //清FIFO缓存for (i=0; i<InLenByte; i++){WriteRawRC(FIFODataReg, pIn [i]);}WriteRawRC(CommandReg, Command);// n = ReadRawRC(CommandReg);if (Command == PCD_TRANSCEIVE){SetBitMask(BitFramingReg,0x80); //开始传送}//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 10000;do{n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitFor)); ClearBitMask(BitFramingReg,0x80);if (i!=0){if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK;if (n & irqEn & 0x01){status = MI_NOTAGERR;}if (Command == PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg);lastBits = ReadRawRC(ControlReg) & 0x07;if (lastBits){*pOutLenBit = (n-1)*8 + lastBits;}else{*pOutLenBit = n*8;}if (n == 0){n = 1;}if (n > MAXRLEN){n = MAXRLEN;}for (i=0; i<n; i++){pOut[i] = ReadRawRC(FIFODataReg);}}}else{status = MI_ERR;}}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE);return status;}///////////////////////////////////////////////////////////////////////开启天线//每次启动或关闭天险发射之间应至少有1ms的间隔/////////////////////////////////////////////////////////////////////void PcdAntennaOn(void){u8 i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}///////////////////////////////////////////////////////////////////////关闭天线/////////////////////////////////////////////////////////////////////void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}///////////////////////////////////////////////////////////////////////功能:扣款和充值//参数说明: dd_mode[IN]:命令字// 0xC0 = 扣款// 0xC1 = 充值// addr[IN]:钱包地址// pValue[IN]:4字节增(减)值,低位在前//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdValue(u8 dd_mode,u8 addr,u8 *pValue){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];//u8 i;ucComMF522Buf[0] = dd_mode;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){status = MI_ERR;}if (status == MI_OK){memcpy(ucComMF522Buf, pValue, 4);//for (i=0; i<16; i++)//{ ucComMF522Buf[i] = *(pValue+i); }CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);unLen = 0;status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if (status != MI_ERR){ status = MI_OK; }}if (status == MI_OK){ucComMF522Buf[0] = PICC_TRANSFER;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}。

IC一卡通加密方法

IC一卡通加密方法

1.修改IC卡密码由三个部分组成:第一是修改IC卡密码;第二是修改发卡器密码;第三是修改设备读卡器(消费机、考勤机、门禁机)密码;2.用《IC一卡通软件》修改IC卡密码操作流程如下:进入“卡管理”菜单里的“IC卡初始化”,界面如下图:然后按键盘“ctrl+robin”(其中robin为键盘上的五个字母键,按的时候按住ctrl键不松手的时候,再依次按一下r o b i n五个字母键),界面将自动变为如下:在“功能选择”中选“密码修改”即可输入原密码(新的IC卡默认的密码为12个F),再输入新密码即可(新密码是所要修改后的密码)。

“星号显示”如果打上勾时,所输入的安符将以*号代替,如果不勾则显示的是所输入的字符。

在“扇区选择”中如果勾上“所有扇区”,则是整IC卡即16个扇区都加密,如果只选择某个扇区进行加密则只能相应的IC卡扇区加密。

确认完以上操作无误后即可点击“批量开始”,此时可大批量地对IC进行加密操作。

注:如果加密成功,在每列小方格的第四个方格将会是变为绿色,反之则变为红色。

3.对IC卡加密完成后,必须要将读卡器的密码修改成与IC卡的新密码一致,否则将无法读取修改后的IC卡。

具体操作如下:在正常安装完本一卡通后,进入本软件的操作界面,按住组合键“Ctrl + Shift + F12”就会弹出一界面(注:在按此组合键时,一定不要打开一卡通的任何窗口,否则将不会弹出此界面),如下::此界面是代理商自定义加密密码的对话框,为12位字符,包括英文字符(区分大小写)。

新安装的一卡通系统默认密码为无,所以只需要确认新密码,连输两次无误后点“确定”即可。

此时会在安装目录下产生一个Key.dat的文件,如果到客户那边安装只需将Key.dat复制到安装目录下,并在进入主界面后,按CTRL+SHIFT+F12,调出此加密界面,就会在该系统中生成以前输入的密码,不需再次输入密码(调出后再关闭加密窗口,再重新调出,如果旧密码不再是灰色,就说明加密成功)。

51单片机RC522射频卡驱动

51单片机RC522射频卡驱动

/*-----------------------------------------------.H文件-----------------------------------------*/#ifndef __RC522_H_#define __RC522_H_///////////////////////////////////////////////////////////////////////MF522命令字/////////////////////////////////////////////////////////////////////#define PCD_IDLE 0x00 //取消当前命令#define PCD_AUTHENT 0x0E //验证密钥#define PCD_RECEIVE 0x08 //接收数据#define PCD_TRANSMIT 0x04 //发送数据#define PCD_TRANSCEIVE 0x0C //发送并接收数据#define PCD_RESETPHASE 0x0F //复位#define PCD_CALCCRC 0x03 //CRC计算///////////////////////////////////////////////////////////////////////Mifare_One卡片命令字/////////////////////////////////////////////////////////////////////#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态#define PICC_REQALL 0x52 //寻天线区内全部卡#define PICC_ANTICOLL1 0x93 //防冲撞#define PICC_ANTICOLL2 0x95 //防冲撞#define PICC_AUTHENT1A 0x60 //验证A密钥#define PICC_AUTHENT1B 0x61 //验证B密钥#define PICC_READ 0x30 //读块#define PICC_WRITE 0xA0 //写块#define PICC_DECREMENT 0xC0 //扣款#define PICC_INCREMENT 0xC1 //充值#define PICC_RESTORE 0xC2 //调块数据到缓冲区#define PICC_TRANSFER 0xB0 //保存缓冲区中数据#define PICC_HALT 0x50 //休眠///////////////////////////////////////////////////////////////////////MF522 FIFO长度定义/////////////////////////////////////////////////////////////////////#define DEF_FIFO_LENGTH 64 //FIFO size=64byte#define MAXRLEN 18///////////////////////////////////////////////////////////////////////MF522寄存器定义/////////////////////////////////////////////////////////////////////// PAGE 0#define RFU00 0x00#define CommandReg 0x01#define ComIEnReg 0x02 #define DivlEnReg 0x03 #define ComIrqReg 0x04 #define DivIrqReg 0x05 #define ErrorReg 0x06 #define Status1Reg 0x07 #define Status2Reg 0x08 #define FIFODataReg 0x09 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define RFU0F 0x0F // PAGE 1#define RFU10 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxAutoReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define DemodReg 0x19 #define RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F// PAGE 2#define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B#define TReloadRegH 0x2C#define TReloadRegL 0x2D#define TCounterValueRegH 0x2E#define TCounterValueRegL 0x2F// PAGE 3#define RFU30 0x30#define TestSel1Reg 0x31#define TestSel2Reg 0x32#define TestPinEnReg 0x33#define TestPinValueReg 0x34#define TestBusReg 0x35#define AutoTestReg 0x36#define VersionReg 0x37#define AnalogTestReg 0x38#define TestDAC1Reg 0x39#define TestDAC2Reg 0x3A#define TestADCReg 0x3B#define RFU3C 0x3C#define RFU3D 0x3D#define RFU3E 0x3E#define RFU3F0x3F///////////////////////////////////////////////////////////////////// //和MF522通讯时返回的错误代码///////////////////////////////////////////////////////////////////// #define MI_OK 0#define MI_NOTAGERR (-1)#define MI_ERR (-2)#define SHAQU10X01#define KUAI40X04#define KUAI70X07#define REGCARD0xa1#define CONSUME0xa2#define READCARD0xa3#define ADDMONEY0xa4//void delay_ns(uint16 ns);void delay10us(void);void delay1ms(void);uint8 SPIReadByte(void);void SPIWriteByte(uint8 SPIData);char PcdRequest(uint8 req_code,uint8 *pTagType);char PcdAnticoll(uint8 *pSnr);char PcdSelect(unsigned char *pSnr);char PcdAuthState(uint8 auth_mode,uint8 addr,uint8 *pKey,uint8 *pSnr);char PcdRead(uint8 addr,uint8 *pData);char PcdWrite(uint8 addr,uint8 *pData);char PcdHalt(void);void CalulateCRC(uint8 *pIndata,uint8 len,uint8 *pOutData);char PcdReset(void);char M500PcdConfigISOType(uint8 type);uint8 ReadRawRC(uint8 Address);void WriteRawRC(uint8 Address, uint8 value);void SetBitMask(uint8 reg,uint8 mask);void ClearBitMask(uint8 reg,uint8 mask);char PcdComMF522(uint8 Command,uint8 *pInData,uint8 InLenByte,uint8 *pOutData,uint16 *pOutLenBit);void PcdAntennaOn(void);void PcdAntennaOff(void);void InitRc522(void);void delay1ms500us(void);sbit SPI_CS = P1^3;sbit SPI_CK = P1^4;sbit SPI_MOSI = P1^5;sbit SPI_MISO = P1^6;sbit SPI_RST = P1^7;#define SET_SPI_CS SPI_CS=1#define CLR_SPI_CS SPI_CS=0#define SET_SPI_CK SPI_CK=1#define CLR_SPI_CK SPI_CK=0#define SET_SPI_MOSI SPI_MOSI=1#define CLR_SPI_MOSI SPI_MOSI=0#define SET_SPI_MISO SPI_MISO#define SET_RC522RST SPI_RST=1#define CLR_RC522RST SPI_RST=0#endif/*-----------------------------------------------.c文件-----------------------------------------*/#include "rc522.h"/*void delay_ns(uint16 ns){uint16 xdata i;for(i=0;i<ns;i++){nop();nop();nop();}}*/void delay10us(void) //误差0us{unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}void delay1ms(void) //误差0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}void delay1ms500us(void) //误差0us{uint8 xdata a,b;for(b=115;b>0;b--)for(a=5;a>0;a--);}uint8 SPIReadByte(void){uint8 xdata SPICount; // Counter used to clock out the datauint8 xdata SPIData;SPIData = 0;for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read{SPIData <<=1; // Rotate the data CLR_SPI_CK; nop();nop(); // Raise the clock to clock the data out of the MAX7456if(SET_SPI_MISO){SPIData|=0x01;}SET_SPI_CK; nop();nop(); // Drop the clock ready for the next bit} // and loop back return (SPIData); // Finally return the read data}void SPIWriteByte(uint8 SPIData){uint8 xdata SPICount; // Counter used to clock out the datafor (SPICount = 0; SPICount < 8; SPICount++){if (SPIData & 0x80){SET_SPI_MOSI;}else{CLR_SPI_MOSI;} nop();nop();CLR_SPI_CK;nop();nop();SET_SPI_CK;nop();nop();SPIData <<= 1;}}///////////////////////////////////////////////////////////////////////功能:寻卡//参数说明: req_code[IN]:寻卡方式// 0x52 = 寻感应区内所有符合14443A标准的卡// 0x26 = 寻未进入休眠状态的卡// pTagType[OUT]:卡片类型代码// 0x4400 = Mifare_UltraLight// 0x0400 = Mifare_One(S50)// 0x0200 = Mifare_One(S70)// 0x0800 = Mifare_Pro(X)// 0x4403 = Mifare_DESFire//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRequest(uint8 req_code,uint8 *pTagType){char xdata status;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x10)){*pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:防冲撞//参数说明: pSnr[OUT]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAnticoll(uint8 *pSnr){char xdata status;uint8 xdata i,snr_check=0;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){*(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80);return status;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdSelect(uint8 *pSnr){char xdata status;uint8 xdata i;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18)){ status = MI_OK; }else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:验证卡片密码//参数说明: auth_mode[IN]: 密码验证模式// 0x60 = 验证A密钥// 0x61 = 验证B密钥// addr[IN]:块地址// pKey[IN]:密码// pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAuthState(uint8 auth_mode,uint8 addr,uint8 *pKey,uint8 *pSnr){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;for (i=0; i<6; i++){ ucComMF522Buf[i+2] = *(pKey+i); }for (i=0; i<6; i++){ ucComMF522Buf[i+8] = *(pSnr+i); }// memcpy(&ucComMF522Buf[2], pKey, 6);// memcpy(&ucComMF522Buf[8], pSnr, 4);status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))){ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:读取M1卡一块数据//参数说明: addr[IN]:块地址// pData[OUT]:读出的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRead(uint8 addr,uint8 *pData){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_READ;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x90))// { memcpy(pData, ucComMF522Buf, 16); }{for (i=0; i<16; i++){ *(pData+i) = ucComMF522Buf[i]; }}else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:写数据到M1卡一块//参数说明: addr[IN]:块地址// pData[IN]:写入的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdWrite(uint8 addr,uint8 *pData){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_WRITE;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){//memcpy(ucComMF522Buf, pData, 16);for (i=0; i<16; i++){ucComMF522Buf[i] = *(pData+i);}CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}///////////////////////////////////////////////////////////////////////功能:命令卡片进入休眠状态//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdHalt(void){char xdata status;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_HALT;ucComMF522Buf[1] = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);return MI_OK;}///////////////////////////////////////////////////////////////////////用MF522计算CRC16函数/////////////////////////////////////////////////////////////////////void CalulateCRC(uint8 *pIndata,uint8 len,uint8 *pOutData){uint8 xdata i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<len; i++){ WriteRawRC(FIFODataReg, *(pIndata+i)); }WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do{n = ReadRawRC(DivIrqReg);i--;}while ((i!=0) && !(n&0x04));pOutData[0] = ReadRawRC(CRCResultRegL);pOutData[1] = ReadRawRC(CRCResultRegM);}///////////////////////////////////////////////////////////////////////功能:复位RC522//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdReset(void){//PORTD|=(1<<RC522RST);SET_RC522RST;delay10us();//PORTD&=~(1<<RC522RST);CLR_RC522RST;delay10us();//PORTD|=(1<<RC522RST);SET_RC522RST;delay10us();WriteRawRC(CommandReg,PCD_RESETPHASE);delay10us();WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40);//必须要return MI_OK;}////////////////////////////////////////////////////////////////////////设置RC632的工作方式//////////////////////////////////////////////////////////////////////char M500PcdConfigISOType(uint8 type){if (type == 'A') //ISO14443_A{ClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);//3FWriteRawRC(RxSelReg,0x86);//84WriteRawRC(RFCfgReg,0x7F); //4FWriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay1ms();PcdAntennaOn();}else{ return -1; }return MI_OK;}///////////////////////////////////////////////////////////////////////功能:读RC632寄存器//参数说明:Address[IN]:寄存器地址//返回:读出的值/////////////////////////////////////////////////////////////////////uint8 ReadRawRC(uint8 Address){uint8 xdata ucAddr;uint8 xdata ucResult=0;CLR_SPI_CS;ucAddr = ((Address<<1)&0x7E)|0x80;SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;return ucResult;}///////////////////////////////////////////////////////////////////// //功能:写RC632寄存器//参数说明:Address[IN]:寄存器地址// value[IN]:写入的值///////////////////////////////////////////////////////////////////// void WriteRawRC(uint8 Address, uint8 value){uint8 xdata ucAddr;CLR_SPI_CS;ucAddr = ((Address<<1)&0x7E);SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;}///////////////////////////////////////////////////////////////////// //功能:置RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:置位值///////////////////////////////////////////////////////////////////// void SetBitMask(uint8 reg,uint8 mask){char xdata tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask}///////////////////////////////////////////////////////////////////// //功能:清RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:清位值///////////////////////////////////////////////////////////////////// void ClearBitMask(uint8 reg,uint8 mask){char xdata tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & ~mask); // clear bit mask}///////////////////////////////////////////////////////////////////// //功能:通过RC522和ISO14443卡通讯//参数说明:Command[IN]:RC522命令字// pInData[IN]:通过RC522发送到卡片的数据// InLenByte[IN]:发送数据的字节长度// pOutData[OUT]:接收到的卡片返回数据// *pOutLenBit[OUT]:返回数据的位长度/////////////////////////////////////////////////////////////////////char PcdComMF522(uint8 Command,uint8 *pInData,uint8 InLenByte,uint8 *pOutData,uint16 *pOutLenBit){char xdata status = MI_ERR;uint8 xdata irqEn = 0x00;uint8 xdata waitFor = 0x00;uint8 xdata lastBits;uint8 xdata n;uint16 xdata i;switch (Command){case PCD_AUTHENT:irqEn = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn = 0x77;waitFor = 0x30;break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x80);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<InLenByte; i++){ WriteRawRC(FIFODataReg, pInData[i]); }WriteRawRC(CommandReg, Command);if (Command == PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 2000;do{n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitFor));ClearBitMask(BitFramingReg,0x80);if (i!=0){if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK;if (n & irqEn & 0x01){ status = MI_NOTAGERR; }if (Command == PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg);lastBits = ReadRawRC(ControlReg) & 0x07;if (lastBits){ *pOutLenBit = (n-1)*8 + lastBits; }else{ *pOutLenBit = n*8; }if (n == 0){ n = 1; }if (n > MAXRLEN){ n = MAXRLEN; }for (i=0; i<n; i++){ pOutData[i] = ReadRawRC(FIFODataReg); } }}else{ status = MI_ERR; }}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE);return status;}///////////////////////////////////////////////////////////////////////开启天线//每次启动或关闭天险发射之间应至少有1ms的间隔///////////////////////////////////////////////////////////////////// void PcdAntennaOn(void){uint8 xdata i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}///////////////////////////////////////////////////////////////////// //关闭天线///////////////////////////////////////////////////////////////////// void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}///////////////////////////////////////////////////////////////////// //rc522初始化///////////////////////////////////////////////////////////////////// void InitRc522(void){PcdReset();PcdAntennaOff();delay1ms500us();PcdAntennaOn();M500PcdConfigISOType( 'A' );}。

门禁密码修改方法教程

门禁密码修改方法教程

门禁密码修改方法教程门禁密码修改方法教程门禁密码是保护个人安全和财产安全的重要手段之一。

定期更改门禁密码可以有效增加安全性。

以下是门禁密码修改的方法教程,详细介绍了几种常见的修改密码的方式。

一、使用机械键盘密码1. 找到门禁机旁边的机械键盘控制台。

2. 输入原密码,按下"确认"键,以便进入密码修改界面。

3. 输入新密码,按下"确认"键,再次输入新密码,以确保输入正确。

4. 按下"确认"键,完成密码修改操作。

5. 测试新密码是否生效,确认后即可使用新密码进行进出门禁。

二、使用门禁软件修改密码1. 找到门禁软件图标,双击打开软件。

2. 在软件界面上找到"密码修改"或"设置"选项,点击进入。

3. 输入原密码,进行身份验证。

4. 输入新密码,并再次确认新密码。

5. 点击"保存"或"确认"按钮,完成密码修改操作。

6. 关闭软件,测试新密码是否生效。

三、通过门禁系统管理员修改密码1. 找到门禁系统管理员的联系方式,例如电话或电子邮件。

2. 联系管理员,说明需要修改密码的原因,并提供必要的身份验证信息。

3. 管理员根据安全标准和验证程序,协助你修改密码。

4. 注意在电话或邮件中不要透露个人信息或密码。

5. 测试新密码是否生效,确认后即可使用新密码进行进出门禁。

四、通过门禁生产厂家或服务提供商修改密码1. 找到门禁设备的生产厂家或服务提供商的联系方式,例如电话、邮箱或官方网站。

2. 联系生产厂家或服务提供商,说明需要修改密码的原因,并提供必要的身份验证信息。

3. 根据生产厂家或服务提供商的要求,提供相关信息,并按照指导进行操作。

4. 等待生产厂家或服务提供商的回复,他们将帮助你修改密码。

5. 在收到修改密码的指导后,根据要求进行操作,测试新密码是否生效。

需要注意的是,修改门禁密码时应当保持严格的安全性,避免泄露个人信息和密码。

门禁密码修改方法教程

门禁密码修改方法教程

门禁密码修改方法教程
门禁密码修改方法教程请参考以下步骤:
1. 找到门禁系统中的主机或控制面板。

通常情况下,它们安装在楼栋或大门的入口处。

2. 使用管理员权限的门禁卡或密码进行系统登录。

具体的操作方式可能因系统不同而有所不同。

如果您不确定如何进行登录,请查看门禁系统的用户手册或咨询相关人员。

3. 进入系统后,在菜单中寻找“密码管理”、“用户设置”或类似
选项。

不同的系统可能会使用不同的术语,但通常都会提供修改密码的功能。

4. 选择您要修改密码的用户账号。

如果系统支持多个用户,您可能需要在列表中选择自己的账号。

5. 输入原始密码。

这是为了确认您有权限修改密码。

如果您忘记了原始密码,请参考系统手册或联系管理员进行重置。

6. 输入新密码。

请设置一个强密码,包括字母、数字和特殊字符,以增加安全性。

最好避免使用常见的密码,如出生日期或手机号码。

7. 确认新密码。

为了避免输入错误,请再次输入您刚刚设置的新密码进行确认。

8. 保存并退出。

在修改密码完成后,系统通常会要求您保存更改并退出菜单。

请按照屏幕上的指示操作。

9. 测试新密码。

使用您的新密码进行门禁系统的登录,确保密码修改成功。

请注意,以上步骤仅作为一般指导,具体的操作方式可能因门
禁系统的不同而有所差异。

如果您遇到困难或有任何问题,请参考门禁系统的用户手册或联系相关人员获取进一步的帮助。

ic卡加密

ic卡加密

IC卡加密
1.首先进入公共系统
在公共系统界面中按ctrl+shift+f1组合键
默认的密码是12个F,这里的操作是给数据库写入新的密码用于卡加密,输入新的12位密码确定
2.进入设备管理接口软件中
正常连接考勤机、发卡器或消费机,切换到Ic卡操作选项页面。

按ctrl+shift+f1组合键后,进入
出现“修改制定扇区密码”和“修改整张卡密码”的选项
如果没有按成功界面为
会没有那两个选项
2.使用“修改制定扇区密码”和“修改整张卡密码”的选项为ic卡加密,“修改制定扇区
密码”则是只给上面选择到的扇区进行了加密
加密的密码为刚才在公共模块写入的密码,加密后卡片就不能在空密码的机器上进行刷卡了3.在设备管理接口中给设备进行加密
在设备管理接口中按组合键ctrl+shift+f1
然后右键点击要加密的设备选择设置密码
然后输入和卡同样的密码进行设备加密
默认密码为12个F,加密成功后,除了加过同样密码的卡片扇区可以正常刷卡读取,别的未加密或加密不同的卡片或扇区无法正常读取,刷卡会无反应
4.如果是s600系列的消费机,则在设备管理接口中进行扇区设置也会把刚才在公共模块设置的密码写入设备中。

IC卡密码配置说明全文

IC卡密码配置说明全文

可编辑修改精选全文完整版IC卡密码配置说明一、说明1.1 IC卡密码IC卡用做消费用途时,必须保证IC卡内数据的安全性,防止被其他人随意读写卡内数据,修改其卡内金额。

IC卡读写时要验证IC卡密码,只有验证通过才能对IC卡内的数据进行读写。

从IC卡厂家采购回来的IC卡都有密码。

但密码默认是“255 255 255 255 255 255”(FF FF FF FF FF FF),所以,在IC卡用作消费用途前,应把出厂的默认密码修改,这样才能保证消费系统的安全性。

注意:由于IC卡密码是IC卡读写的依据,所以必须小心处理IC卡密码的更改。

强烈建议:IC卡密码只需要定义一个就足够,无需要根据不同的使用单位定义多个IC卡密码。

否则,容易把各单位的密码混淆,用户单位再购买卡时若加密了与原来不同的密码时将无法使用。

不同单位的IC卡密码相同也不影响使用,只要另一个密码(单位密码)不相同就行(请参见下面“单位密码”部分说明)。

1.2 单位密码由于IC卡密码是IC卡读写的依据,频繁的更改密码或定义多个IC卡密码并不是一个好的方案。

对于消费系统供应商来说,最好只定义一个IC卡密码,然后再根据不同的使用单位,让使用单位定义其单位密码。

当使用单位A 定义了属于该单位独有的单位密码后,那么,单位A 发的IC消费卡,则不能在其他单位使用。

就算其他单位的IC卡密码与单位A 的IC卡密码相同,但由于其单位密码不相同,单位之间的IC消费卡是不能混用的。

消费系统使用单位所定义的单位密码将存放在其消费系统的数据库中,只需要输入一次,以后将会保存。

注意:IC卡密码和单位密码一旦确定,就不能再修改了1.3 IC卡区号(IC卡型号:S50)每张IC卡内部都分为16个区,区号是从0 至15,一般使用的是1 至15 区,0区一般不用。

消费系统不需要使用IC卡内全部的区,一般只用8个区就足够了。

用户在使用IC卡时,可以选择任8个区来加密使用,其他区可留给其他系统使用。

门禁密码修改方法教程

门禁密码修改方法教程

门禁密码修改方法教程门禁系统是现代社会中常见的一种安全管理设备,它可以有效控制人员出入的权限,保障办公场所和住宅区的安全。

而门禁密码作为门禁系统中最常用的一种验证方式,其安全性和保密性就显得尤为重要。

在日常使用中,我们可能会因为各种原因需要修改门禁密码,下面就为大家介绍一下门禁密码修改的方法。

首先,我们需要确认自己对应的门禁系统类型,因为不同的门禁系统可能有不同的密码修改方式。

一般来说,门禁系统的密码修改方法可以分为两种,一种是通过门禁系统管理软件进行修改,另一种是通过门禁系统设备本身进行修改。

接下来,我们将分别介绍这两种方法的具体步骤。

如果你的门禁系统支持通过管理软件进行密码修改,那么首先你需要打开门禁系统的管理软件,并登录管理员账号。

在登录成功后,你可以找到“密码管理”或“用户管理”等相关选项,然后选择需要修改密码的用户账号,进行密码修改操作。

在进行密码修改时,建议选择一个复杂度较高的密码,包括数字、字母和特殊符号,以提高密码的安全性。

如果你的门禁系统不支持通过管理软件进行密码修改,那么你可以通过门禁系统设备本身进行密码修改。

一般来说,门禁系统设备会配备一个键盘或者触摸屏,你可以通过这些设备进行密码修改操作。

具体的步骤可能会因设备型号而有所不同,但一般来说,你可以在设备界面上找到“密码管理”或“用户管理”等相关选项,然后按照提示进行密码修改操作。

无论是通过管理软件还是通过设备本身进行密码修改,我们都需要注意以下几点,首先,要确保密码修改操作是在安全的环境下进行的,避免他人窥视或偷窥密码;其次,要牢记新密码,避免因忘记密码而导致不必要的麻烦;最后,要及时测试新密码是否生效,确保密码修改操作成功。

总的来说,门禁密码的安全性对于门禁系统的安全管理至关重要。

通过本文介绍的方法,相信大家已经对门禁密码的修改有了更清晰的认识,希望大家在日常使用中能够严格遵守门禁密码管理规定,确保门禁系统的安全运行。

如果大家在实际操作中遇到问题,可以及时咨询门禁系统的相关技术人员,以获得更详细的帮助和指导。

rc522读写程序

rc522读写程序

rc522读写程序
(原创版)
目录
1.RC522 读写程序简介
2.RC522 读写程序的工作原理
3.RC522 读写程序的具体应用
4.RC522 读写程序的发展前景
正文
一、RC522 读写程序简介
RC522 读写程序是一款基于射频识别技术(RFID)的软件,主要用于实现 RFID 卡片的读写功能。

RFID 技术是一种无线通信技术,可以通过无线电波实现信息的读取和写入。

RC522 读写程序通过发射无线电波,使得 RFID 卡片产生相应的电磁感应,从而实现数据的读取或写入。

二、RC522 读写程序的工作原理
RC522 读写程序的工作原理主要包括以下几个步骤:
1.发射无线电波:RC522 读写程序通过发射无线电波,激活 RFID 卡片内的天线电路。

2.接收反射信号:当 RFID 卡片被激活后,卡片内的天线电路会反射一部分无线电波回读写器。

3.解调信号:RC522 读写程序对接收到的反射信号进行解调,从而提取出 RFID 卡片内的数据。

4.数据读取或写入:RC522 读写程序根据需要,对 RFID 卡片内的数据进行读取或写入。

三、RC522 读写程序的具体应用
RC522 读写程序在现实生活中的应用非常广泛,例如:门禁系统、考勤系统、智能仓库管理等。

在这些应用场景中,RC522 读写程序可以实现对 RFID 卡片的快速读取和写入,提高工作效率,减少人工操作的错误。

四、RC522 读写程序的发展前景
随着物联网技术的不断发展,射频识别技术(RFID)也得到了越来越广泛的应用。

作为 RFID 技术的重要组成部分,RC522 读写程序在未来的发展前景十分广阔。

IC卡电梯软件操作速成.

IC卡电梯软件操作速成.

用户卡的使用,也可通过此设置控制外呼读卡器每层楼每张卡的不同权限;
3.7 关于初始化 IC 卡(加密 IC 卡)
相对于 ID 卡容易复制、破解现象,本系统使用安全性更高的
IC 卡进行多重加密。
温馨提示:建议使用厂家配给已经加密好的卡片,防止电梯卡被非法破解及复制。
四、 软件界面
系统界面包括系统标题,菜单栏,常用功能快捷键,如图
发卡 器驱 动安 装
系统软件注册
增加用 户卡
增加持卡用户
二、 系统安装、卸载和升级
2.1 软件安装对计算机的最低配置要求
CPU 内存 硬盘 显示 鼠标
Celeron 400MHz 或 Pentium 133 MHz 以上 最低配置要求 128MB (推荐 256MB 以上) 系统驱动器上需要 100MB 以上的可用空间 Super VGA(102 4× 768) 或更高分辨率的显示器(颜色设置为 Microsoft 鼠标或兼容的指点设备
件。 2.4 软件升级
软件升级不再另行通知、可联系厂家进行更新。
三、 首次使用须知
3.1 关于管理操作员和登录密码 。
操作员默认为超级用户, 初始密码为空, 无需填写即可登录, 如需修改密码,请到 菜单栏目中的 “操作员密码”进行更改。
添加操作管理员或者修改管理员的权限:菜单栏目中的“操作员管理”

单击下一步继续安装: 选择同意,点击下一步继续安装:
选择好安装目录 (建议不要安装在 C 盘,快速更改目录的方法: 将字母“C”改成“D” 或者其他 ),单击下一步,继续安装:
单击下一步继续安装:
软件系统安装完成: 点击“预装驱动”进行发卡器的驱动安装:
2.3 软件卸载 为了防止误操作将 IC 卡电梯管理软件系统卸载,已屏蔽在电脑的控制面板卸载系统软

电梯IC卡管理系统软件使用说明书4.1

电梯IC卡管理系统软件使用说明书4.1

电梯IC卡管理系统软件使用说明V 4.1苏州默纳克控制技术有限公司目录第一章软件的运行环境 (3)第二章软件安装 (3)一、安装电梯IC卡管理系统软件 (3)二、卸载电梯IC卡管理系统软件 (6)第三章管理软件的使用 (9)一、软件的组成 (9)二、登录 (9)三、修改密码 (9)四、系统用户管理 (10)五、单价设定 (11)六、电梯信息 (12)七、通信口设置 (14)八、设置备份位置 (14)九、业主卡制作 (15)(一)制作收费卡 (16)(二)补收费卡 (18)(三)卡片充值 (20)(四)制作时段卡 (20)(五)补时段卡 (23)(六)延长使用时间 (24)十、指纹采集 (25)(一)指纹采集 (25)(二)修改指纹 (27)十一、管理卡制作 (29)(一)管理人员卡 (29)(二)补管理人员卡 (31)(三)强制管理卡 (33)(四)设定按钮响应时间卡 (34)(五)制作设定控制器时间卡 (35)(六)制作读取用户数据卡 (37)(七)制作访客按钮相应时间卡 (38)(八)制作设定电梯运行时段卡 (39)(九)制作删除密码卡 (41)(十)制作日期管理设定卡 (42)(十一)制作分层管理卡 (44)(十二)读取刷卡记录 (45)十二、统计查询 (46)(一)收费统计 (46)(二)卡片信息查询 (47)(三)刷卡记录查询 (48)十三、卡片的作用 (49)常见问题 (51)其他注意事项 (51)第一章软件的运行环境运行电梯IC卡管理系统软件的推荐配置为:1、CPU:Pentiu mⅡ以上2、RAM:500MB或更多。

3、硬盘:1GB以上4、操作系统:windows2000 /2003/NT/xp5、显示器:1024*768第二章软件安装电梯IC卡管理系统软件的安装同大多数Windows应用程序的安装没什么区别,只需运行安装文件夹内的“setup.exe”然后按照提示一步步进行下去即可。

单片机密码开锁程序流程

单片机密码开锁程序流程

单片机密码开锁程序流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 初始化初始化单片机的相关硬件,如输入输出端口、定时器等。

电梯IC卡管理系统软件使用说明书4.2

电梯IC卡管理系统软件使用说明书4.2

电梯IC卡管理系统软件使用说明V 4.2苏州默纳克控制技术有限公司目录第一章软件的运行环境 (3)第二章软件安装 (3)一、安装电梯IC卡管理系统软件 (3)二、卸载电梯IC卡管理系统软件 (4)第三章管理软件的使用 (4)一、软件的组成 (4)二、登录 (5)三、修改密码 (5)四、系统用户管理 (5)五、单价设定 (7)六、电梯信息 (7)七、通信口设置 (9)八、设置备份位置 (10)九、业主卡制作 (11)(一)制作收费卡 (12)(二)补收费卡 (14)(三)卡片充值 (16)(四)制作时段卡 (16)(五)补时段卡 (18)(六)延长使用时间 (19)十、管理卡制作 (20)(一)管理人员卡 (20)(二)补管理人员卡 (21)(三)强制管理卡 (22)(四)设定按钮响应时间卡 (23)(五)制作设定控制器时间卡 (24)(六)制作读取用户数据卡 (24)(七)制作访客按钮相应时间卡 (25)(八)制作设定电梯运行时段卡 (25)(九)制作删除密码卡 (26)(十)制作日期管理设定卡 (27)(十一)制作分层管理卡 (28)十一、统计查询 (28)(一)收费统计 (28)(二)卡片信息查询 (29)(三)刷卡记录查询 (30)十二、卡片的作用 (31)常见问题 (33)其他注意事项 (33)第一章软件的运行环境运行电梯IC卡管理系统软件的推荐配置为:1、CPU:Pentiu mⅡ以上2、RAM:500MB或更多。

3、硬盘:1GB以上4、操作系统:windows2000 /2003/NT/xp5、显示器:1024*768第二章软件安装电梯IC卡管理系统软件的安装同大多数Windows应用程序的安装没什么区别,只需运行安装文件夹内的“setup.exe”然后按照提示一步步进行下去即可。

一、安装电梯IC卡管理系统软件1 、建议用户关掉所有其他Windows应用程序再安装该软件,运行“setup.exe”安装程序。

IC卡操作软件使用说明

IC卡操作软件使用说明

IC卡操作软件使用说明IC卡操作软件,在知道密码的情况下读写卡、修改数据、修改密码的工具软件,智能化傻瓜式操作,简单易用。

一、读写卡,修改数据,如果知道卡片密码的话可以在IC卡相应扇区填写密码,或者在统一密码区填写,如果已经取得卡片的Dump文件,可以点读Dump文件,或者把Dump文件拖拽进软件,软件可以智能判断密码。

1、点读Dump文件,如图2、放上Dump文件对应的IC卡,点读卡,就可以读出卡内数据,(一定要点读卡,不然列表中显示的是dump文件中的数据而不是卡内实时数据)。

3、列表中的数据可以根据需要进行修改,修改好以后,点写卡,写入卡中,也可以保存dump文件,下面演示修改数据,我们看到10到15扇区的0块数字0162,这是自定义卡号,我们对他修改,并且写卡,并对修改后的dump文件保存。

这样就完成了对ic卡数据的修改,如果写卡扇区提示失败的,则选KeyB然后写卡。

二、UID卡操作1、读UID卡,对UID卡来说,如果用设备破解,则不能破解,可以用该软件直接读取UID卡的数据和密码。

2、写UID卡,就把表中内容写入到卡中,另外0扇区0块前8位卡号可以随意更改,不用管校验,软件会替你算好并写入卡中。

3、可以用来复制卡。

读取dump文件,然后把uid卡放读写器上,点写UID卡即可完成UID卡的复制。

三、M1卡复制,CUID卡复制普通M1卡复制,0扇区0块是无法复制的,卡片复制可能能用,也可能不能用,方法:把卡片dump文件拖拽进软件,在写入密码前打对勾,然后写卡,看提示,写入成功就可以了。

CUID卡复制,拖拽打开dump文件,然后在写CUID/FUID卡前打对勾,写入密码前打对勾,然后写卡就可以了,要看提示,如果写入失败,再次写入就可以了。

四、格式化/清卡清卡,有的叫格式化,就是把有密码和数据的卡,通过DUMP文件,清除卡内数据和密码,恢复出厂设置。

可以清除M1卡、CUID卡、FUID卡等。

rc522读写程序

rc522读写程序

rc522读写程序
摘要:
1.引言
2.rc522 读写程序的介绍
3.rc522 读写程序的功能
4.rc522 读写程序的应用领域
5.rc522 读写程序的优缺点
6.总结
正文:
rc522 读写程序是一款用于非接触式智能卡读写操作的软件。

这款程序利用了rc522 射频模块,能够实现对MIFARE 类卡片的读写操作。

rc522 读写程序广泛应用于各种智能卡应用场景,如门禁系统、考勤系统、消费系统等。

rc522 读写程序的功能主要包括:读取卡片信息、写入数据到卡片、修改卡片密码等。

通过这些功能,用户可以方便地实现对智能卡片的操作。

此外,rc522 读写程序还支持多种智能卡片的读写操作,满足不同用户的需求。

rc522 读写程序广泛应用于我国的智能卡领域。

例如,在校园一卡通、企业一卡通、城市公共交通等领域,rc522 读写程序都发挥着重要作用。

通过这款程序,用户可以方便地实现对各类智能卡片的操作,提高工作效率。

rc522 读写程序具有以下优点:操作简单、功能齐全、兼容性强、稳定性高。

这款程序可以满足不同用户的需求,为智能卡应用提供有力支持。

然而,rc522 读写程序也存在一定的缺点,如对卡片类型的兼容性还有待提高。

总之,rc522 读写程序作为一款专业的智能卡读写软件,具有广泛的应用领域和较高的用户评价。

虽然在兼容性方面还存在一定的不足,但整体表现仍然值得肯定。

银行卡密码修改指南

银行卡密码修改指南

银行卡密码修改指南银行卡作为现代人们日常生活中的重要支付工具,保障账户安全对每个持卡人来说都至关重要。

为了确保账户资金安全,定期修改银行卡密码是一项不可忽视的任务。

本文将为您提供银行卡密码修改的详细指南。

一、密码修改前的准备工作在开始密码修改之前,您需要做以下准备工作:1.确保您持有该银行卡的有效身份证件;2.查阅银行卡发行银行的官方网站或咨询客服,了解该银行卡密码修改的具体要求和流程。

二、选择合适的密码一个安全可靠的密码对于银行卡非常重要。

以下是一些选择和设置合适密码的建议:1.避免使用过于简单的密码,如出生日期、重复数字、连续数字等,以免被他人猜测;2.密码应该包含大写字母、小写字母、数字和特殊字符的组合,以增加密码的复杂度;3.密码长度最好不少于8位,且尽量避免使用常用字词或个人信息;4.定期更换密码,建议每3-6个月修改一次。

三、密码修改的方式银行卡密码可以通过以下几种方式进行修改:1.柜台服务:您可以亲自前往银行柜台,携带有效身份证件和银行卡,填写密码修改申请表并进行密码修改。

2.ATM机:在大部分银行的自助终端机上,您可以选择密码修改功能,按照提示进行操作完成密码修改。

3.手机银行APP:如果您已经开通了手机银行服务,可以通过手机银行APP进行密码修改。

在APP中找到“密码修改”选项,按照提示操作即可完成密码修改。

四、密码修改的注意事项在进行密码修改时,需注意以下事项以确保操作的顺利完成:1.确保密码修改过程的环境安全,避免在公共场所或其他人可以窥视的地方进行密码修改;2.严禁将密码透露给他人,包括银行工作人员;3.密码修改后,请及时更新您在其他网站、应用或服务中所使用的相同或类似密码,避免密码泄露导致账户被盗。

五、密码修改后的验证密码修改完成后,为了确认密码修改成功,您需要进行一次账户验证。

可使用以下方式进行验证:1.柜台服务:可前往银行柜台进行密码验证;2.ATM机:在自助终端机上使用新密码进行账户余额查询或其他操作,验证密码修改的有效性;3.手机银行APP:登录手机银行APP,输入新密码进行账户余额查询或其他操作,验证密码修改的有效性。

门禁密码修改方法教程

门禁密码修改方法教程

门禁密码修改方法教程门禁密码是我们日常生活中经常需要使用的一种安全凭证,它可以保障我们的家庭和办公场所的安全。

但是,有时候我们可能会忘记密码,或者需要定期修改密码来增强安全性。

那么,接下来我将为大家介绍门禁密码修改的方法。

首先,我们需要确认自己有权限修改门禁密码。

通常情况下,只有管理员或者特定的操作人员才有权限进行门禁密码的修改。

如果您不确定自己是否有权限,建议您先联系相关的管理人员进行确认。

确认权限后,我们需要找到门禁系统的管理界面。

这通常是一个专门的管理软件或者网页界面,您可以在相关的设备或者管理人员处获取到对应的管理地址和登录信息。

接着,我们登录管理界面,在找到“密码管理”或者“用户管理”等相关选项。

在这个选项中,我们可以找到需要修改密码的用户,然后进行密码修改的操作。

在进行密码修改之前,我们需要注意一些安全性问题。

首先,密码的设置应该遵循一定的规范,比如密码长度、密码组成要求等。

其次,密码修改的操作应该在安全的网络环境下进行,避免密码被他人窃取或者监听。

在找到需要修改密码的用户后,我们点击“修改密码”或者“重置密码”等相关选项。

然后,输入新的密码并确认密码修改操作。

在输入新密码时,建议您选择一个既容易记忆又具有一定复杂性的密码,以增加密码的安全性。

密码修改完成后,我们需要进行测试验证。

这个步骤非常重要,它可以帮助我们确认密码修改操作是否成功,并且可以避免因密码错误导致的不必要的麻烦。

您可以使用新密码尝试开启门禁系统,或者请其他用户帮助进行测试。

最后,我们需要及时通知相关的用户密码修改的信息。

这可以避免因为密码不一致导致的误操作,也可以让相关用户及时了解到密码修改的情况,增强安全意识。

总结一下,门禁密码的修改是一项重要的安全操作,我们需要在确认权限、找到管理界面、设置安全密码、进行测试验证和通知相关用户等步骤中认真操作。

希望以上方法可以帮助到您,谢谢阅读!。

STM8RC522读写IC卡程序

STM8RC522读写IC卡程序

#include "stm8s.h"#include "uart.h"void Delay(u32 nCount);extern u8 RxBuffer[RxBufferSize];extern u8 UART_RX_NUM;unsigned char CT[2];//卡类型unsigned char SN[4]; //卡号unsigned char write[16] ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0 x0E,0x0F,0x10}; unsigned char read[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00}; unsigned char key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};#define countof(a) (sizeof(a) / sizeof(*(a)))#define BufferSize (countof(Tx_Buffer)-1)u8 Tx_Buffer[] = "STM8S RFID TEST";u8 Rx_Buffer[BufferSize];u32 FLASH_ID ;void cardNo2String(u8 *cardNo, u8 *str);void main(void){unsigned char status;/*设置内部时钟16M为主时钟*/CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);status = memcmp(read,write,16);GPIO_DeInit(GPIOA);GPIO_DeInit(GPIOC);Uart_Init();GPIO_Init( GPIOA, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); InitRc522();UART2_SendString(Tx_Buffer,BufferSize);while(1){status = PcdRequest(PICC_REQALL,CT); /*扫描卡*/status = PcdAnticoll(SN); /*防冲撞*/if (status==MI_OK){GPIO_LOW(GPIOA, GPIO_PIN_4); //寻卡成功UART2_SendString("The card Id is:",15); //串口发送卡号cardNo2String(SN, Tx_Buffer);UART2_SendString(Tx_Buffer, 17);Reset_RC522();}else{GPIO_HIGH(GPIOA, GPIO_PIN_4);}}}void Delay(u32 nCount){while (nCount != 0){nCount--;}}void Hex2String(u8 hex,u8 *str){str[0] = (hex / 100) + '0';str[1] = (hex % 100 / 10) + '0';str[2] = (hex % 10) + '0';}void cardNo2String(u8 *cardNo, u8 *str) {u8 Count = 0;for(Count = 0; Count < 4; Count++){Hex2String(cardNo[Count], str + Count * 4); if(Count == 3){str[15] = '\n';}else{str[Count * 4 + 3] = ':'; }}}void delay_ns(u32 ns) {u32 i;for(i=0;i<ns;i++){asm("nop");asm("nop");asm("nop");}}u8 SPIWriteByte(u8 Byte){u8 tmp;while (SPI_GetFlagStatus( SPI_FLAG_TXE) == RESET); SPI_SendData(Byte);if (SPI_GetFlagStatus(SPI_FLAG_RXNE)){tmp = SPI_ReceiveData();}return tmp;}void SPI2_Init(void){SPI_DeInit();SPI_Init(SPI_FIRSTBIT_MSB, //帧模式,先发送MSB还是LSBSPI_BAUDRATEPRESCALER_8, //波特率分频值SPI_MODE_MASTER, //模式,主从模式SPI_CLOCKPOLARITY_LOW, //时钟极性,空闲时SCK为高/空闲时SCK为低SPI_CLOCKPHASE_1EDGE, //数据采样的边沿选择SPI_DATADIRECTION_2LINES_FULLDUPLEX, //双线单向数据模式,使用C6/C7两条线,数据传输方向位单向SPI_NSS_SOFT, //软件从设备0x07);SPI_Cmd(ENABLE);}void InitRc522(void){SPI2_Init();PcdReset();PcdAntennaOff();PcdAntennaOn();M500PcdConfigISOType( 'A' );}void Reset_RC522(void){PcdReset();PcdAntennaOff();PcdAntennaOn();}/////////////////////////////////////////////////////////////////// ////功能:寻卡//参数说明: req_code[IN]:寻卡方式// 0x52 = 寻感应区内所有符合14443A标准的卡// 0x26 = 寻未进入休眠状态的卡// pTagType[OUT]:卡片类型代码// 0x4400 = Mifare_UltraLight// 0x0400 = Mifare_One(S50)// 0x0200 = Mifare_One(S70)// 0x0800 = Mifare_Pro(X)// 0x4403 = Mifare_DESFire//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdRequest(u8 req_code,u8 *pTagType){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x10)){*pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status;}/////////////////////////////////////////////////////////////////// ////功能:防冲撞//参数说明: pSnr[OUT]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdAnticoll(u8 *pSnr){char status;u8 i,snr_check=0;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){*(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80);return status;}/////////////////////////////////////////////////////////////////// ////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdSelect(u8 *pSnr){char status;u8 i;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18)){ status = MI_OK; }else{ status = MI_ERR; }return status;}/////////////////////////////////////////////////////////////////// ////功能:验证卡片密码//参数说明: auth_mode[IN]: 密码验证模式// 0x60 = 验证A密钥// 0x61 = 验证B密钥// addr[IN]:块地址// pKey[IN]:密码// pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;memcpy(&ucComMF522Buf[2], pKey, 6);memcpy(&ucComMF522Buf[8], pSnr, 4);status =PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))){ status = MI_ERR; }return status;}/////////////////////////////////////////////////////////////////// ////功能:读取M1卡一块数据//参数说明: addr[IN]:块地址// p [OUT]:读出的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdRead(u8 addr,u8 *p )char status;u8 unLen;u8 i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_READ;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x90)){for (i=0; i<16; i++){ *(p +i) = ucComMF522Buf[i]; }}else{ status = MI_ERR; }return status;}/////////////////////////////////////////////////////////////////// ////功能:写数据到M1卡一块//参数说明: addr[IN]:块地址// p [IN]:写入的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdWrite(u8 addr,u8 *p ){char status;u8 unLen;u8 i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_WRITE;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){for (i=0; i<16; i++){ucComMF522Buf[i] = *(p +i);}CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}/////////////////////////////////////////////////////////////////// ////功能:命令卡片进入休眠状态//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdHalt(void){u8 status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_HALT;ucComMF522Buf[1] = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);return MI_OK;}/////////////////////////////////////////////////////////////////// ////用MF522计算CRC16函数/////////////////////////////////////////////////////////////////// //void CalulateCRC(u8 *pIn ,u8 len,u8 *pOut ){u8 i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<len; i++){ WriteRawRC(FIFODataReg, *(pIn +i)); }WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do{n = ReadRawRC(DivIrqReg);i--;}while ((i!=0) && !(n&0x04));pOut [0] = ReadRawRC(CRCResultRegL);pOut [1] = ReadRawRC(CRCResultRegM);/////////////////////////////////////////////////////////////////// ////功能:复位RC522//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdReset(void){GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);delay_ns(10);GPIO_LOW(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);delay_ns(10);GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);delay_ns(10);WriteRawRC(CommandReg,PCD_RESETPHASE);delay_ns(10);WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40);//必须要return MI_OK;}/////////////////////////////////////////////////////////////////// /////设置RC632的工作方式/////////////////////////////////////////////////////////////////// ///char M500PcdConfigISOType(u8 type){if (type == 'A') //ISO14443_A{ClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);WriteRawRC(RxSelReg,0x86);WriteRawRC(RFCfgReg,0x7F);WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);PcdAntennaOn();else{return 1;}return MI_OK;}/////////////////////////////////////////////////////////////////// ////功能:读RC632寄存器//参数说明:Address[IN]:寄存器地址//返回:读出的值/////////////////////////////////////////////////////////////////// //u8 ReadRawRC(u8 Address){u8 ucAddr;u8 ucResult=0;GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);ucAddr = ((Address<<1)&0x7E)|0x80;SPIWriteByte(ucAddr);ucResult=SPIReadByte();GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);return ucResult;}/////////////////////////////////////////////////////////////////// ////功能:写RC632寄存器//参数说明:Address[IN]:寄存器地址// value[IN]:写入的值/////////////////////////////////////////////////////////////////// //void WriteRawRC(u8 Address, u8 value){u8 ucAddr;GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);ucAddr = ((Address<<1)&0x7E);SPIWriteByte(ucAddr);SPIWriteByte(value);GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);}/////////////////////////////////////////////////////////////////// ////功能:置RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:置位值/////////////////////////////////////////////////////////////////// //{char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask}/////////////////////////////////////////////////////////////////// ////功能:清RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:清位值/////////////////////////////////////////////////////////////////// //void ClearBitMask(u8 reg,u8 mask){char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & ~mask); // clear bit mask }/////////////////////////////////////////////////////////////////// ////功能:通过RC522和ISO14443卡通讯//参数说明:Command[IN]:RC522命令字// pIn [IN]:通过RC522发送到卡片的数据// InLenByte[IN]:发送数据的字节长度// pOut [OUT]:接收到的卡片返回数据// *pOutLenBit[OUT]:返回数据的位长度/////////////////////////////////////////////////////////////////// //char PcdComMF522(u8 Command,u8 *pIn ,u8 InLenByte,u8 *pOut ,u8 *pOutLenBit){char status = MI_ERR;u8 irqEn = 0x00;u8 waitFor = 0x00;u8 lastBits;u8 n;u16 i;switch (Command){case PCD_AUTHENT:irqEn = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn = 0x77;waitFor = 0x30;break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80); ClearBitMask(ComIrqReg,0x80); //清所有中断位WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); //清FIFO缓存for (i=0; i<InLenByte; i++){WriteRawRC(FIFODataReg, pIn [i]);}WriteRawRC(CommandReg, Command);// n = ReadRawRC(CommandReg);if (Command == PCD_TRANSCEIVE){SetBitMask(BitFramingReg,0x80); //开始传送}//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms i = 10000;do{n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitFor)); ClearBitMask(BitFramingReg,0x80);if (i!=0){if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK;if (n & irqEn & 0x01){status = MI_NOTAGERR;}if (Command == PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg);lastBits = ReadRawRC(ControlReg) & 0x07; if (lastBits){*pOutLenBit = (n-1)*8 + lastBits;}else{*pOutLenBit = n*8;}if (n == 0){n = 1;}if (n > MAXRLEN){n = MAXRLEN;}for (i=0; i<n; i++){pOut[i] = ReadRawRC(FIFODataReg); }}}else{status = MI_ERR;}}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE);return status;}/////////////////////////////////////////////////////////////////// ////开启天线//每次启动或关闭天险发射之间应至少有1ms的间隔/////////////////////////////////////////////////////////////////// //void PcdAntennaOn(void){u8 i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}/////////////////////////////////////////////////////////////////// ////关闭天线/////////////////////////////////////////////////////////////////// //void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}/////////////////////////////////////////////////////////////////// ////功能:扣款和充值//参数说明: dd_mode[IN]:命令字// 0xC0 = 扣款// 0xC1 = 充值// addr[IN]:钱包地址// pValue[IN]:4字节增(减)值,低位在前//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////// //char PcdValue(u8 dd_mode,u8 addr,u8 *pValue){char status;u8 unLen;u8 ucComMF522Buf[MAXRLEN];//u8 i;ucComMF522Buf[0] = dd_mode;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){status = MI_ERR;}if (status == MI_OK){memcpy(ucComMF522Buf, pValue, 4);//for (i=0; i<16; i++)//{ ucComMF522Buf[i] = *(pValue+i); }CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);unLen = 0;status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if (status != MI_ERR){ status = MI_OK; }}if (status == MI_OK){ucComMF522Buf[0] = PICC_TRANSFER;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status =PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
extern u8 RxBuffer[RxBufferSize];
extern u8 UART_RX_NUM;
unsigned char CT[2];//卡类型
unsigned char SN[4]; //卡号
unsigned char write[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};
/* Private functions ---------------------------------------------------------*/
#define ReadWriteAddr 11 //读写扇区
void main(void)
{
unsigned char status;
/* Infinite loop */
/* Infinite loop */
while (1)
{
}
}
#endif
unsigned char read[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define BufferSize (countof(Tx_Buffer)-1)
InitRc522();
UART1_SendString(Tx_Buffer,BufferSize);
while(1)
{
status = PcdRequest(PICC_REQALL,CT); /*扫描卡*/
status = PcdAnticoll(SN); /*防冲撞*/
if (status==MI_OK)
{
GPIO_LOW(GPIOA, GPIO_PIN_3); //寻卡成功
UART1_SendString("scan IC card success\n",21);
status = PcdSelect(SN); //选择要操作的卡
if (status==MI_OK)
{
if( MI_OK == PcdAuthState(0x60,ReadWriteAddr,key,SN) ) //验证A密码
{
status = PcdRead(ReadWriteAddr,read);
if(MI_OK == status)
{
read[0] = 0x01;
read[1] = 0x02;
read[2] = 0x03;
read[3] = 0x04;
read[4] = 0x05;
read[5] = 0x06;
status = PcdWrite(ReadWriteAddr,read);
{
nCount--;
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Private variab--------------------------------*/
u8 Tx_Buffer[] = "STM8S RFID TEST";
u8 Rx_Buffer[BufferSize];
u32 FLASH_ID ;
#include "stm8s.h"
#include "stm8s_clk.h"
#include "intrinsics.h"
#include "stm8s_uart1.h"
#include "uart.h"
#include "rc522.h"
#include "string.h"
void Delay(u32 nCount);
UART1_SendString("sucess \n",9);
}
}
}
}
else
{
GPIO_HIGH(GPIOA, GPIO_PIN_3);
}
Reset_RC522();
}
}
void Delay(u32 nCount)
{
/* Decrement nCount value */
while (nCount != 0)
/* Includes ------------------------------------------------------------------*/
/* Includes ------------------------------------------------------------------*/
/*设置内部时钟16M为主时钟*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
/*!<Set High speed internal clock */
status = memcmp(read,write,16);
Uart_Init();
GPIO_Init( GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval : None
*/
void assert_failed(u8* file, u32 line)
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
相关文档
最新文档