標(biāo)題:
MFRC500讀卡芯片飯卡打卡系統(tǒng)單片機(jī)程序 帶4-3鍵盤輸入和LCD12864點(diǎn)陣液晶輸出
[打印本頁]
作者:
zqy181818
時(shí)間:
2017-5-12 17:24
標(biāo)題:
MFRC500讀卡芯片飯卡打卡系統(tǒng)單片機(jī)程序 帶4-3鍵盤輸入和LCD12864點(diǎn)陣液晶輸出
基于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的幫助,如果大家對(duì)程序有什么意見可以隨時(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]; //存放卡類型號(hào)
tByte Snr_RC500[4]; //存放rc500序列號(hào)
tByte AbsoluteBlock = 8; //對(duì)絕對(duì)塊8進(jìn)行操作, 取值范圍為 0 <= AbsoluteBlock < 64
tByte data cardserialno[4]; //存放卡號(hào)
tByte idata blockdata[16]; //絕對(duì)塊8數(shù)據(jù)緩沖區(qū),注意其儲(chǔ)存模式 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; //合并絕對(duì)塊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)備寫回到絕對(duì)塊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);
}
//對(duì)第八塊(絕對(duì)地址)進(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)
//---------------------------------------------------------------------
……………………
…………限于本文篇幅 余下代碼請(qǐ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
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1