本帖最后由 sdb194200 于 2019-9-19 15:58 編輯
1568850881(1).jpg (482.23 KB, 下載次數: 90)
下載附件
2019-9-19 15:55 上傳
//實現門禁卡功能
//刷卡實現LCD燈亮 + 12864LCD屏幕顯示相應內容 屏幕效果如下:
1568850945(1).jpg (81.13 KB, 下載次數: 84)
下載附件
刷卡提示
2019-9-19 15:56 上傳
1568850962(1).jpg (75.93 KB, 下載次數: 83)
下載附件
刷卡成功
2019-9-19 15:56 上傳
- //
- //===========================================================================//
- /********************************************************************
- //MSP430F149單片機 + RC522 +M1
- //實現門禁卡功能
- //刷卡實現LCD燈亮 + 12864LCD屏幕顯示相應內容
- //調試環境:IAR + MSP430F149 +RC522
- //作者:孫登波 119104010574
- //時間:2019.09.10
- ********************************************************************/
- #include "msp430x14x.h"
- #include "PIN_DEF.H"
- #include "RC522.H"
- #include "UART0_Func.c"
- #include "ctype.h"
- #include "BoardConfig.h"
- #include "lcd.h"
- #include "led8run.h"
- unsigned char UID[5],Temp[4] ;
- unsigned char RF_Buffer[18] ;
- unsigned char Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} ; // Mifare One 缺省密碼
- char MBRX[30] ;
- char MBKeyTP[30] ;
- char Event ;
- unsigned char DISP_MODE,i ; // 編輯控件顯示模式
- unsigned char des_on = 0 ; // DES加密標志
- void Key_TP_Task(void) ;
- //***************************************************************************//
- // //
- // 初始化主時鐘: MCLK = XT1×(FLL_FACTOR+1) //
- // //
- //***************************************************************************//
- void Init_CLK(void)
- {
- unsigned int qq;
- WDTCTL = WDTPW + WDTHOLD ; // 關看門狗
- BCSCTL1 &= ~XT2OFF; //打開XT2高速晶體振蕩器
- do
- {
- IFG1 &= ~OFIFG; //Clear oscFault flag清除振蕩器失效標志
- for(qq=0xff;qq>0;qq--);
- }while((IFG1&OFIFG)); //oscFault flag still set
- BCSCTL2 |= SELM_2; //MCLK=XT2
- //BCSCTL2 |= DIVM_0; //控制MCLK不分頻,默認
- BCSCTL2 |= SELS; //SMCLK=XT2
- //BCSCTL2 |= DIVS_0; //控制SMCLK不分頻,默認
- }
- void Delay(unsigned int time)
- {
- unsigned int i,k ;
- for(i=0;i<255;i++)
- for(k=0;k<time;k++)
- _NOP() ;
- }
- void Init_Port(void)
- {
- P4DIR = RF_LPCTL + RF_SS + RF_SCLK + RF_DATA_OUT ;
- P2DIR |= BIT0+RF_LPCTL + RF_SS + RF_SCLK + RF_DATA_OUT;
- P1DIR = RF_LPCTL + RF_SS + RF_SCLK + RF_DATA_OUT ;
- }
- void main( void )
- {
- unsigned char status;
- WDTCTL = WDTPW + WDTHOLD ; // 關看門狗
- BoardConfig(0xf0);
- Init_Port();
- InitUART();
- _EINT() ;
- loop:lcd_welcome();
- PcdReset();//復位RC522
- PcdAntennaOn();//開啟天線發射
- while(1)
- {
- status = PcdRequest(PICC_REQIDL, Temp); ////尋卡,輸出為卡類型
- if (status == MI_OK)
- status = PcdAnticoll(UID); //防沖撞處理,輸出卡片序列號,4字節
- if (status == MI_OK)
- status = PcdSelect(UID); //選擇卡片,輸入卡片序列號,4字節
- if (status == MI_OK)
- status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID); //在進行讀寫操作之前需要先進行認
- if (status == MI_OK)
- {
- led_run();
- lcd_success();
- Delay(2500);
- goto loop;
- }
- }
- }
復制代碼
這里要注意,為了使main函數的簡潔性,分別將LED和LCD函數構建成.h頭文件,直接實現在main中的調用。
關于goto loop的解釋: 在實際程序實現過程中發現,如果將開機歡迎界面寫入到while(1)函數中,會導致未刷卡的時候,屏幕一直在刷新。所以為了避免這種情況,將開機歡迎界面函數放在while(1)外,并且用goto函數實現跳出循環。有效地解決了這個問題。
如果有感興趣,想尋找到其他解決方法的師兄,可以先嘗試將開機畫面放回main()函數中,觀察實際運行情況,尋找更佳的解決辦法。 希望能找到更佳的解決辦法,因為goto函數不符合結構化程序設計要求,不到萬不得已不建議采用。 
具體程序見附件 主要實現刷卡燈亮(可以連續實現)
|