|
基于MFRC500讀卡芯片的完整讀卡程序,帶4-3鍵盤輸入驅動和128-64點陣液晶輸出
單片機源程序如下:
- /**************************************************************************** *
- * File: MAIN.C * *
- * Version: 飯卡打卡系統(tǒng)簡化版1.0 * *
- * Created: 11.30 *
- * Last Change: 5.15 * *
- * Author: HeXing $ 東邪西毒 *
- * QQ: 271885846 $ 343543175 *
- * EMail: 271885846@qq.com huangwenshan@126.com *
- * Compiler: KEIL C51 uVision2 V2.23 * *
- * Description: 操作流程:先讀卡,等待鍵盤輸入,再寫卡 * *
- * 注意:鍵盤輸入后,卡不能抽走,不然數據流失! *
- * 注意:程序共有18個警告,因為有些函數暫時沒用到! *
- * 注意:暫沒小數顯示,由于以后考慮用以太網通訊,故沒加進UATR通訊*
- * 留言:謝謝Hexing的幫助,如果大家對程序有什么意見可以隨時找我 *
- ****************************************************************************/
- #include "main.h"
- #include "m500a.h"
- #include "PORT.h"
- #include "delay.h"
- #include "LCD_Key.h"
- /*--------------公有變量定義---------------------------------------------------------*/
- bit KEY_SCAN_G; //鍵盤掃描標志
- bit W_CARD_SCAN_G; //寫卡掃描標志
- tWord Card_Money; //最大值這里只取9999,顯示4位數金額
- tByte LCD_Money[5]; //卡中金額顯示緩沖區(qū)
- tByte LCD_Key[6]=" "; //初始化按鍵顯示緩沖區(qū),保證數組最后字節(jié)存有結束符'\0'
- tByte temp; //臨時變量
- tByte tt1[2]; //存放卡類型號
- tByte Snr_RC500[4]; //存放rc500序列號
- tByte AbsoluteBlock = 8; //對絕對塊8進行操作, 取值范圍為 0 <= AbsoluteBlock < 64
- tByte data cardserialno[4]; //存放卡號
- tByte idata blockdata[16]; //絕對塊8數據緩沖區(qū),注意其儲存模式 idata
- /*-------私有函數原型----------------------------------------------------------------*/
- void MCU_Init(void); //單片機初始化函數
- void BEEP_Ctrl(void); //蜂鳴器控制函數
- tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno); //卡激活函數
- tByte MF_Read (tByte AbsoluteBlock,tByte idata *blockdata); //讀卡函數
- tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata); //寫卡函數
- tByte data RC500_Disp[13];
- void hex_ten(unsigned char *RC500_St);
- /*=====================================================================================
- main函數開始
- ======================================================================================*/
- void main (void)
- {
- MCU_Init();
- M500PCD_Init();
- KEYPAD_Init();
- LCD_Init();
- LCD_China_Disp();
- BEEP_Ctrl(); //聲音提示1,所有初始化完成,等待讀卡
-
-
- while(1)
- {
- temp=MF_Active( AbsoluteBlock,cardserialno); //激活一張卡
- if(temp!=MI_OK)
- {
- continue; //跳到 while 入口
- }
- temp=MF_Read(AbsoluteBlock,blockdata); //讀卡數據
- if(temp!=MI_OK)
- {
- continue;
- }
- BEEP_Ctrl();
- hex_ten(cardserialno); //聲音提示2,讀卡成功,等待鍵盤掃描
- put_char(4,30,RC500_Disp);
-
- KEY_SCAN_G=1; //允許鍵盤掃描
- while(KEY_SCAN_G)
- {
- Card_Money=blockdata[0]+blockdata[1]*256; //合并絕對塊8前兩字節(jié)
- LCD_Money[0]=Card_Money/1000+48; //裝載千位數據
- LCD_Money[1]=Card_Money%1000/100+48; //百位
- LCD_Money[2]=Card_Money%1000%100/10+48; //十位
- LCD_Money[3]=Card_Money%1000%100%10+48; //個位
- LCD_Money[4]='\0'; //結束符
- LCD_KEY_Update(); //鍵盤和LCD刷新
- delay_nms(30); //每隔30毫秒掃描一次鍵盤
- }
-
- W_CARD_SCAN_G=1; //允許寫卡掃描
- while(W_CARD_SCAN_G)
- {
- blockdata[0]=Card_Money%256; //分解回字節(jié)數據,準備寫回到絕對塊8
- blockdata[1]=Card_Money/256;
- temp=MF_Active( AbsoluteBlock,cardserialno); //激活同一張卡
- if(temp!=MI_OK)
- {
- continue;
- }
- temp=MF_Write(AbsoluteBlock,blockdata); //寫數據入卡
- if(temp!=MI_OK)
- {
- continue;
- }
- W_CARD_SCAN_G=0; //清循環(huán)標志,跳出while循環(huán)
- BEEP_Ctrl();
- put_char(4,30," ");//聲音提示3,表示寫卡完成,用戶可以取走卡
- delay_nms(1000);
- //注意:聲音提示后的1秒延遲期間,必須拿走卡,否則體統(tǒng)重新讀卡
- }
- }
- }
- /*============================================================================
- main函數結束
- =============================================================================*/
- //--------------------------------------------------------
- //激活卡函數
- //--------------------------------------------------------
- tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno)
- {
- tByte status1;
- tByte *sak1;
- status1 = M500PiccRequest(PICC_REQALL, tt1);//尋卡
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- status1=M500PiccAnticoll(0,cardserialno);//防碰撞
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
-
- status1=M500PiccSelect(cardserialno,sak1);//選擇卡
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- //對第八塊(絕對地址)進行授權, 也就是第三個扇區(qū)第一塊
- status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);//授權
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
-
- return MI_OK;
- }
- //--------------------------------------------------------
- //讀卡函數
- //--------------------------------------------------------
- tByte MF_Read(tByte AbsoluteBlock,tByte idata *blockdata)
- {
- tByte status1;
- status1=M500PiccRead(AbsoluteBlock, blockdata);
-
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
-
- return MI_OK;
- }
- //--------------------------------------------------------
- //寫卡函數
- //--------------------------------------------------------
- tByte MF_Write(tByte AbsoluteBlock,tByte idata *blockdata)
- {
- tByte status1;
- status1 = M500PiccWrite(AbsoluteBlock,blockdata);
-
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- return MI_OK;
- }
- //------------------------------------------------------------------------
- //MCU_Init函數
- //------------------------------------------------------------------------
- void MCU_Init(void)
- {
- RC500RST = FALSE;
- RC500_CS = TRUE; // Enable the CS for RC500
- IT0 = 1; // Config ext0 as edge trigger for RC500
- EX0 = 1; // Enable ext0 interrupt for RC500
- EA = TRUE; // Enable all interrupts
-
- }
- //-----------------------------------------------------------------------
- //蜂鳴器驅動
- //---------------------------------------------------------------------
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于MFRC500讀卡芯片的完整讀卡程序,帶4-3鍵盤輸入驅動和128-64點陣液晶輸出.rar
(41.95 KB, 下載次數: 58)
2017-5-12 17:24 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|