門禁系統(tǒng)源程序_第1頁
門禁系統(tǒng)源程序_第2頁
門禁系統(tǒng)源程序_第3頁
門禁系統(tǒng)源程序_第4頁
門禁系統(tǒng)源程序_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

#include"reg52.h"#include"main.h"#include"uart.h"#include"timer.h"#include"rc522.h"#include"ctrl.h"#include"lcd12864.h"#include"beep.h"#include"key.h"#include"EEPROM.h"voidinit_all(void) //初始化{ EA=0; //關(guān)總中止 init_timer();//定時器初始化 init_uart();//串口初始化 init_rc522();//RC522初始化 lcd_init(); //LCD初始化 EEPROM_READ(0,Card_SN_BUF,4);//EEPROM初始化,取出統(tǒng)計卡號 EEPROM_READ(7,KEY_BUF,8);//EEPROM初始化,取出統(tǒng)計密碼 send_bytes(Card_SN_BUF,4); EA=1; //開總中止}voidmain(void) //主函數(shù){ INT8Ukey;Delay_ms(50);//讓硬件穩(wěn)定 init_all(); //執(zhí)行初始化函數(shù) relay_OFF();//關(guān)繼電器 LED_BLINK_1();//ledtest beep1(); //beeptest display(0,0,0); //顯示初始化 while(1) { key=key_scan();//按鍵操作 if(key==12)if(states>0)states--; elsestates=0; //上一功效 if(key==13)if(++states>3)states=3; //下一功效 ctrl_process();//進入RC522操作 }}#include"reg52.h"#include"string.h"#include"main.h"#include"uart.h"#include"rc522.h"#include"ctrl.h"#include"beep.h"#include"lcd12864.h"#include"timer.h"#include"EEPROM.h"#include"key.h"INT8Ustates=0;//狀態(tài)機INT8UCard_type[2], //卡片類型Card_SN[4]={0},//IC卡號 Card_SN_BUF[4]={0xff,0xff,0xff,0xff},//卡號登記緩沖區(qū) KEY_BUF[8]={'0','0','0','0','0','0','0','0'};INT8UbPass=0;bWarn=0; voiduart_over(void) //串口數(shù)據(jù)還原{ UartCount=0; UartStart=FALSE; UartComp=FALSE;}voidpass(void){beep1();Delay_ms();//讓卡片離開LED_BLINK_1();}voidwarn(void){LED_BLINK_2();}INT8UIC_READ(void){INT8UID_ASC[8],i; if(PcdRequest(PICC_REQIDL,Card_type)!=MI_OK)//尋天線區(qū)內(nèi)未進入休眠狀態(tài)卡,返回卡片類型2字節(jié) { if(PcdRequest(PICC_REQIDL,Card_type)!=MI_OK)//尋天線區(qū)內(nèi)未進入休眠狀態(tài)卡,返回卡片類型2字節(jié) { returnFALSE; } } if(PcdAnticoll(Card_SN)!=MI_OK)//防沖撞,返回卡序列號4字節(jié) { bWarn=1; returnFALSE; } bPass=1; send_bytes(Card_type,2); send_bytes(Card_SN,4); for(i=0;i<4;i++)//卡ID號轉(zhuǎn)化成ASCII { if(Card_SN[i]/16>9) ID_ASC[i*2]=Card_SN[i]/16+'7'; elseID_ASC[i*2]=Card_SN[i]/16+'0';if(Card_SN[i]%16>9) ID_ASC[i*2+1]=Card_SN[i]%16+'7'; elseID_ASC[i*2+1]=Card_SN[i]%16+'0'; } display2(3,0,"ID:",4);//顯示卡號 display2(3,2,ID_ASC,8); returnTRUE;}voidctrl_process(void){ INT8Ui,key_count,key_value=16,table[8]="--------",statesbuf; if(states!=statesbuf)//狀態(tài)改變,清屏 { display_clear_line(2); display_clear_line(3); statesbuf=states; }switch(states) {case0: //IC卡讀卡輸入 display(1,0,1); if(IC_READ()) { if((Card_SN[0]==Card_SN_BUF[0]) &&(Card_SN[1]==Card_SN_BUF[1]) &&(Card_SN[2]==Card_SN_BUF[2]) &&(Card_SN[3]==Card_SN_BUF[3])) { relay_ON();//燈開關(guān) display(2,0,5); } else display(2,0,6); relay_OFF(); } break;case1: display(1,0,2);//密碼輸入 display2(3,0,table,8); key_count=0;while(1) { key_value=key_scan(); if(key_value==12) { states--; return; } if(key_value==13) { states++; return; } if(key_value>=0&&key_value<=9)//有按鍵輸入 { table[key_count++]=key_value+'0'; display2(3,0,table,8); } if(key_value==11)//退格 { table[--key_count]='-'; display2(3,0,table,8); } if(key_count==8) { if(table[0]==KEY_BUF[0]&& table[1]==KEY_BUF[1]&& table[2]==KEY_BUF[2]&& table[3]==KEY_BUF[3]&& table[4]==KEY_BUF[4]&& table[5]==KEY_BUF[5]&& table[6]==KEY_BUF[6]&& table[7]==KEY_BUF[7]) //密嗎正確 { bPass=1; relay_ON();//燈開關(guān)display(2,0,5); relay_OFF(); break; } else //密碼錯誤 { relay_OFF(); beep1() ; bWarn=1; display(2,0,6); break; } } } break; case2: display(1,0,3);//IC卡登記 if(IC_READ()) { for(i=0;i<4;i++) Card_SN_BUF[i]=Card_SN[i]; EEPROM_WRITE(0,Card_SN,4);//寫入EEPROM } break; case3: display(1,0,4);//密碼設(shè)置 display2(3,0,table,8); key_count=0; while(1) { key_value=key_scan(); if(key_value==12) { states--; return; } if(key_value>=0&&key_value<=9)//有按鍵輸入 { table[key_count++]=key_value+'0'; display2(3,0,table,8); } if(key_value==11)//退格 { table[--key_count]='-'; display2(3,0,table,8); } if(key_count==8&&key_value==15)//按下確定鍵 { for(i=0;i<8;i++) KEY_BUF[i]=table[i]; EEPROM_WRITE(7,KEY_BUF,8);//寫入EEPROM break; }} break; default:break; } if(bPass) //處理成功 { bPass=0; pass(); } if(bWarn) //處理失敗 { bWarn=0; warn(); }} #include"reg52.h"#include"intrins.h"#include"main.h"#include"rc522.h"#include"string.h"voiddelay_ns(unsignedintns){ unsignedinti; for(i=0;i<ns;i++) { nop(); nop(); nop(); }}//------------------------------------------//讀SPI數(shù)據(jù)//------------------------------------------unsignedcharSPIReadByte(void){ unsignedcharSPICount;//Counterusedtoclockoutthedata unsignedcharSPIData; SPIData=0; for(SPICount=0;SPICount<8;SPICount++)//Preparetoclockinthedatatoberead { SPIData<<=1;//Rotatethedata CLR_SPI_CK;//nop();//nop();//RaisetheclocktoclockthedataoutoftheMAX7456 if(STU_SPI_MISO) { SPIData|=0x01; } SET_SPI_CK;//nop();//nop();//Droptheclockreadyforthenextbit }//andloopback return(SPIData);//Finallyreturnthereaddata}//------------------------------------------//寫SPI數(shù)據(jù)//------------------------------------------voidSPIWriteByte(unsignedcharSPIData){ unsignedcharSPICount;//Counterusedtoclockoutthedata for(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; } }///////////////////////////////////////////////////////////////////////功能:讀RC632存放器//參數(shù)說明:Address[IN]:存放器地址//返回:讀出值/////////////////////////////////////////////////////////////////////unsignedcharReadRawRC(unsignedcharAddress){ unsignedcharucAddr;unsignedcharucResult=0; CLR_SPI_CS;ucAddr=((Address<<1)&0x7E)|0x80; SPIWriteByte(ucAddr); ucResult=SPIReadByte(); SET_SPI_CS; returnucResult;}///////////////////////////////////////////////////////////////////////功能:寫RC632存放器//參數(shù)說明:Address[IN]:存放器地址//value[IN]:寫入值/////////////////////////////////////////////////////////////////////voidWriteRawRC(unsignedcharAddress,unsignedcharvalue){unsignedcharucAddr; CLR_SPI_CS;ucAddr=((Address<<1)&0x7E); SPIWriteByte(ucAddr); SPIWriteByte(value); SET_SPI_CS;}///////////////////////////////////////////////////////////////////////功能:清RC522存放器位//參數(shù)說明:reg[IN]:存放器地址//mask[IN]:清位值/////////////////////////////////////////////////////////////////////voidClearBitMask(unsignedcharreg,unsignedcharmask){chartmp=0x00;tmp=ReadRawRC(reg);WriteRawRC(reg,tmp&~mask);//clearbitmask}///////////////////////////////////////////////////////////////////////功能:置RC522存放器位//參數(shù)說明:reg[IN]:存放器地址//mask[IN]:置位值/////////////////////////////////////////////////////////////////////voidSetBitMask(unsignedcharreg,unsignedcharmask){chartmp=0x00;tmp=ReadRawRC(reg);WriteRawRC(reg,tmp|mask);//setbitmask}///////////////////////////////////////////////////////////////////////用MF522計算CRC16函數(shù)/////////////////////////////////////////////////////////////////////voidCalulateCRC(unsignedchar*pIndata,unsignedcharlen,unsignedchar*pOutData){unsignedchari,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);}///////////////////////////////////////////////////////////////////////功能:經(jīng)過RC522和ISO14443卡通訊//參數(shù)說明:Command[IN]:RC522命令字//pInData[IN]:經(jīng)過RC522發(fā)送到卡片數(shù)據(jù)//InLenByte[IN]:發(fā)送數(shù)據(jù)字節(jié)長度//pOutData[OUT]:接收到卡片返回數(shù)據(jù)//*pOutLenBit[OUT]:返回數(shù)據(jù)位長度/////////////////////////////////////////////////////////////////////charPcdComMF522(unsignedcharCommand,unsignedchar*pInData,unsignedcharInLenByte,unsignedchar*pOutData,unsignedint*pOutLenBit){charstatus=MI_ERR;unsignedcharirqEn=0x00;unsignedcharwaitFor=0x00;unsignedcharlastBits;unsignedcharn;unsignedinti;switch(Command){casePCD_AUTHENT: irqEn=0x12; waitFor=0x10; break; casePCD_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;//依照時鐘頻率調(diào)整,操作M1卡最大等候時間25ms i=;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);//stoptimernowWriteRawRC(CommandReg,PCD_IDLE);returnstatus;}///////////////////////////////////////////////////////////////////////功能:尋卡//參數(shù)說明:req_code[IN]:尋卡方式//0x52=尋感應區(qū)內(nèi)全部符合14443A標準卡//0x26=尋未進入休眠狀態(tài)卡//pTagType[OUT]:卡片類型代碼//0x4400=Mifare_UltraLight//0x0400=Mifare_One(S50)//0x0200=Mifare_One(S70)//0x0800=Mifare_Pro(X)//0x4403=Mifare_DESFire//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdRequest(unsignedcharreq_code,unsignedchar*pTagType){ charstatus; unsignedintunLen; unsignedcharucComMF522Buf[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; } returnstatus;}///////////////////////////////////////////////////////////////////////功能:防沖撞//參數(shù)說明:pSnr[OUT]:卡片序列號,4字節(jié)//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdAnticoll(unsignedchar*pSnr){charstatus;unsignedchari,snr_check=0;unsignedintunLen;unsignedcharucComMF522Buf[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);returnstatus;}///////////////////////////////////////////////////////////////////////功能:選定卡片//參數(shù)說明:pSnr[IN]:卡片序列號,4字節(jié)//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdSelect(unsignedchar*pSnr){charstatus;unsignedchari;unsignedintunLen;unsignedcharucComMF522Buf[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; }returnstatus;}///////////////////////////////////////////////////////////////////////功能:驗證卡片密碼//參數(shù)說明:auth_mode[IN]:密碼驗證模式//0x60=驗證A密鑰//0x61=驗證B密鑰//addr[IN]:塊地址//pKey[IN]:密碼//pSnr[IN]:卡片序列號,4字節(jié)//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdAuthState(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pKey,unsignedchar*pSnr){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=auth_mode;ucComMF522Buf[1]=addr; memcpy(&ucComMF522Buf[2],pKey,6); memcpy(&ucComMF522Buf[8],pSnr,6);status=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if((status!=MI_OK)||(!(ReadRawRC(Status2Reg)&0x08))){ status=MI_ERR; }returnstatus;}///////////////////////////////////////////////////////////////////////功能:讀取M1卡一塊數(shù)據(jù)//參數(shù)說明:addr[IN]:塊地址//pData[OUT]:讀出數(shù)據(jù),16字節(jié)//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdRead(unsignedcharaddr,unsignedchar*pData){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[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); }else{ status=MI_ERR; }returnstatus;}///////////////////////////////////////////////////////////////////////功能:寫數(shù)據(jù)到M1卡一塊//參數(shù)說明:addr[IN]:塊地址//pData[IN]:寫入數(shù)據(jù),16字節(jié)//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdWrite(unsignedcharaddr,unsignedchar*pData){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[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);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; }}returnstatus;}///////////////////////////////////////////////////////////////////////功能:命令卡片進入休眠狀態(tài)//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdHalt(void){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_HALT;ucComMF522Buf[1]=0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);returnMI_OK;}///////////////////////////////////////////////////////////////////////功能:復位RC522//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdReset(void){ SET_RC522RST;delay_ns(10); CLR_RC522RST;delay_ns(10); SET_RC522RST;delay_ns(10);WriteRawRC(CommandReg,PCD_RESETPHASE);delay_ns(10);WriteRawRC(ModeReg,0x3D);//和Mifare卡通訊,CRC初始值0x6363WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E); WriteRawRC(TxAutoReg,0x40);//必須要returnMI_OK;}////////////////////////////////////////////////////////////////////////設(shè)置RC632工作方式//////////////////////////////////////////////////////////////////////charM500PcdConfigISOType(unsignedchartype){if(type=='A')//ISO14443_A{ClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);//3FWriteRawRC(RxSelReg,0x86);//84WriteRawRC(RFCfgReg,0x7F);//4F WriteRawRC(TReloadRegL,30);//tmoLength);//TReloadVal='h6a=tmoLength(dec) WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); delay_ns(1000);PcdAntennaOn();}else{return-1;}returnMI_OK;}///////////////////////////////////////////////////////////////////////開啟天線//每次開啟或關(guān)閉天險發(fā)射之間應最少有1ms間隔/////////////////////////////////////////////////////////////////////voidPcdAntennaOn(void){unsignedchari;i=ReadRawRC(TxControlReg);if(!(i&0x03)){SetBitMask(TxControlReg,0x03);}}///////////////////////////////////////////////////////////////////////關(guān)閉天線/////////////////////////////////////////////////////////////////////voidPcdAntennaOff(void){ ClearBitMask(TxControlReg,0x03);}voidinit_rc522(void){PcdReset();PcdAntennaOff();PcdAntennaOn();M500PcdConfigISOType('A');}///////////////////////////////////////////////////////////////////////功能:扣款和充值//參數(shù)說明:dd_mode[IN]:命令字//0xC0=扣款//0xC1=充值//addr[IN]:錢包地址//pValue[IN]:4字節(jié)增(減)值,低位在前//返回:成功返回MI_OK//////////////////////////////////////////////////////////////////////*charPcdValue(unsignedchardd_mode,unsignedcharaddr,unsignedchar*pValue){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];//unsignedchari; 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;}}returnstatus;}*////////////////////////////////////////////////////////////////////////功能:備份錢包//參數(shù)說明:sourceaddr[IN]:源地址//goaladdr[IN]:目標地址//返回:成功返回MI_OK//////////////////////////////////////////////////////////////////////*charPcdBakValue(unsignedcharsourceaddr,unsignedchargoaladdr){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_RESTORE;ucComMF522Buf[1]=sourceaddr;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){ucComMF522Buf[0]=0;ucComMF522Buf[1]=0;ucComMF522Buf[2]=0;ucComMF522Buf[3]=0;CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); if(status!=MI_ERR){status=MI_OK;}}if(status!=MI_OK){returnMI_ERR;}ucComMF522Buf[0]=PICC_TRANSFER;ucComMF522Buf[1]=goaladdr;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;}returnstatus;}*/#include<reg52.h>#include<intrins.h>#include"main.h"#defineucharunsignedchar#defineuintunsignedint/*LCD12864端口定義*/#defineLCD_dataP0//數(shù)據(jù)口sbitLCD_RS=P2^5;//存放器選擇輸入sbitLCD_RW=P2^6;//液晶讀/寫控制sbitLCD_EN=P2^7;//液晶使能控制sbitLCM_RST=P3^2;//sbitLCD_PSB=P0^4;//串/并方式控制,部分液晶不需要ucharcodedis0[]="IC卡門禁系統(tǒng)";ucharcodedis1[]="1.IC卡輸入";ucharcodedis2[]="2.密碼輸入:8位";ucharcodedis3[]="3.IC卡登記";ucharcodedis4[]="4.密碼設(shè)置:8位";ucharcodedis5[]="成功";ucharcodedis6[]="失敗";voiddelay(intms) //延時xms{while(ms--) {uchari; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } }} voiddelayNOP()//延時4us{_nop_();_nop_();_nop_();_nop_();}/*******************************************************************//**//*因為引腳定義DB0..DB7是從P1.7...P1.0排列*//*所以次序需要調(diào)換一下*//**//*******************************************************************/INT8Uswapbit(INT8Uudata){INT8Uii,tmp=0;for(ii=0;ii<8;ii++){tmp<<=1;if(udata&0x01){tmp|=0x01;}udata>>=1;}returntmp;}/*******************************************************************//**//*檢驗LCD忙狀態(tài)*//*lcd_busy為1時,忙,等候。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。*//**//*******************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(LCD_data&0x80);LCD_EN=0;return(result);}/*******************************************************************//**//*寫指令數(shù)據(jù)到LCD*//*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。*//**//*******************************************************************/voidwrite_cmd(unsignedcharWCLCM,BuysC){unsignedintK=0;while(lcd_busy()&&K--);//預防沒插LCD時候停在這LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();LCD_data=swapbit(WCLCM);delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//**//*寫顯示數(shù)據(jù)到LCD*//*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。*//**//*******************************************************************/voidlcd_wdat(unsignedcharWDLCM){unsignedintK=0;while(lcd_busy()&&K--);//預防沒插LCD時候停在這LCD_RS=1;LCD_RW=0;LCD_EN=0;LCD_data=swapbit(WDLCM);delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//**//*LCD初始化設(shè)定*//**//*******************************************************************/voidlcd_init(){//LCD_PSB=1;//并口方式 ,部分液晶不需要//LCM_RST=0;write_cmd(0x36);//擴充指令操作delay(5);write_cmd(0x30);//基本指令操 delay(5);write_cmd(0x0C);//顯示開,關(guān)光標delay(5);write_cmd(0x01);//去除LCD顯示內(nèi)容delay(5);} /*********************************************************//**//*設(shè)定顯示位置*//**//*********************************************************/voidlcd_pos(ucharX,ucharY){ucharpos;if(X==0){X=0x80;}elseif(X==1){X=0x90;}elseif(X==2){X=0x88;}elseif(X==3){X=0x98;}pos=X+Y;write_cmd(pos);//顯示地址}/*********************************************************//* *//*顯示主程序 *//**//*********************************************************/voiddisplay_all(){uchari; lcd_pos(0,0);//第一行顯示數(shù)字0~9 i=0;while(dis0[i]!='\0'){lcd_wdat(dis0[i]);//顯示字母i++;} lcd_pos(1,0);//第二行顯示字母 i=0;while(dis1[i]!='\0'){lcd_wdat(dis1[i]);//顯示字母i++;} lcd_pos(2,0);//第三行顯示文字 i=0;while(dis2[i]!='\0'){lcd

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論