|
基于MFRC500讀卡芯片的完整讀卡程序,帶4-3鍵盤輸入驅(qū)動(dòng)和128-64點(diǎn)陣液晶輸出
0.png (71.14 KB, 下載次數(shù): 67)
下載附件
2017-5-12 18:07 上傳
單片機(jī)源程序如下:
- /**************************************************************************** *
- * 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: 操作流程:先讀卡,等待鍵盤輸入,再寫卡 * *
- * 注意:鍵盤輸入后,卡不能抽走,不然數(shù)據(jù)流失! *
- * 注意:程序共有18個(gè)警告,因?yàn)橛行┖瘮?shù)暫時(shí)沒用到! *
- * 注意:暫沒小數(shù)顯示,由于以后考慮用以太網(wǎng)通訊,故沒加進(jìn)UATR通訊*
- * 留言:謝謝Hexing的幫助,如果大家對程序有什么意見可以隨時(shí)找我 *
- ****************************************************************************/
- #include "main.h"
- #include "m500a.h"
- #include "PORT.h"
- #include "delay.h"
- #include "LCD_Key.h"
- /*--------------公有變量定義---------------------------------------------------------*/
- bit KEY_SCAN_G; //鍵盤掃描標(biāo)志
- bit W_CARD_SCAN_G; //寫卡掃描標(biāo)志
- tWord Card_Money; //最大值這里只取9999,顯示4位數(shù)金額
- tByte LCD_Money[5]; //卡中金額顯示緩沖區(qū)
- tByte LCD_Key[6]=" "; //初始化按鍵顯示緩沖區(qū),保證數(shù)組最后字節(jié)存有結(jié)束符'\0'
- tByte temp; //臨時(shí)變量
- tByte tt1[2]; //存放卡類型號
- tByte Snr_RC500[4]; //存放rc500序列號
- tByte AbsoluteBlock = 8; //對絕對塊8進(jìn)行操作, 取值范圍為 0 <= AbsoluteBlock < 64
- tByte data cardserialno[4]; //存放卡號
- tByte idata blockdata[16]; //絕對塊8數(shù)據(jù)緩沖區(qū),注意其儲存模式 idata
- /*-------私有函數(shù)原型----------------------------------------------------------------*/
- void MCU_Init(void); //單片機(jī)初始化函數(shù)
- void BEEP_Ctrl(void); //蜂鳴器控制函數(shù)
- tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno); //卡激活函數(shù)
- tByte MF_Read (tByte AbsoluteBlock,tByte idata *blockdata); //讀卡函數(shù)
- tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata); //寫卡函數(shù)
- tByte data RC500_Disp[13];
- void hex_ten(unsigned char *RC500_St);
- /*=====================================================================================
- main函數(shù)開始
- ======================================================================================*/
- 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); //讀卡數(shù)據(jù)
- 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; //裝載千位數(shù)據(jù)
- 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; //個(gè)位
- LCD_Money[4]='\0'; //結(jié)束符
- LCD_KEY_Update(); //鍵盤和LCD刷新
- delay_nms(30); //每隔30毫秒掃描一次鍵盤
- }
-
- W_CARD_SCAN_G=1; //允許寫卡掃描
- while(W_CARD_SCAN_G)
- {
- blockdata[0]=Card_Money%256; //分解回字節(jié)數(shù)據(jù),準(zhǔn)備寫回到絕對塊8
- blockdata[1]=Card_Money/256;
- temp=MF_Active( AbsoluteBlock,cardserialno); //激活同一張卡
- if(temp!=MI_OK)
- {
- continue;
- }
- temp=MF_Write(AbsoluteBlock,blockdata); //寫數(shù)據(jù)入卡
- if(temp!=MI_OK)
- {
- continue;
- }
- W_CARD_SCAN_G=0; //清循環(huán)標(biāo)志,跳出while循環(huán)
- BEEP_Ctrl();
- put_char(4,30," ");//聲音提示3,表示寫卡完成,用戶可以取走卡
- delay_nms(1000);
- //注意:聲音提示后的1秒延遲期間,必須拿走卡,否則體統(tǒng)重新讀卡
- }
- }
- }
- /*============================================================================
- main函數(shù)結(jié)束
- =============================================================================*/
- //--------------------------------------------------------
- //激活卡函數(shù)
- //--------------------------------------------------------
- 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);
- }
- //對第八塊(絕對地址)進(jìn)行授權(quán), 也就是第三個(gè)扇區(qū)第一塊
- status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);//授權(quán)
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
-
- return MI_OK;
- }
- //--------------------------------------------------------
- //讀卡函數(shù)
- //--------------------------------------------------------
- tByte MF_Read(tByte AbsoluteBlock,tByte idata *blockdata)
- {
- tByte status1;
- status1=M500PiccRead(AbsoluteBlock, blockdata);
-
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
-
- return MI_OK;
- }
- //--------------------------------------------------------
- //寫卡函數(shù)
- //--------------------------------------------------------
- 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函數(shù)
- //------------------------------------------------------------------------
- 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
-
- }
- //-----------------------------------------------------------------------
- //蜂鳴器驅(qū)動(dòng)
- //---------------------------------------------------------------------
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于MFRC500讀卡芯片的完整讀卡程序,帶4-3鍵盤輸入驅(qū)動(dòng)和128-64點(diǎn)陣液晶輸出.rar
(41.95 KB, 下載次數(shù): 58)
2017-5-12 17:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|