|
基于MFRC500读卡芯片的完整读卡程序,带4-3键盘输入驱动和128-64点阵液晶输出
单片机源程序如下:
- /**************************************************************************** *
- * File: MAIN.C * *
- * Version: 饭卡打卡系统简化版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]; //卡中金额显示缓冲区
- tByte LCD_Key[6]=" "; //初始化按键显示缓冲区,保证数组最后字节存有结束符'\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数据缓冲区,注意其储存模式 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前两字节
- 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; //分解回字节数据,准备写回到绝对块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; //清循环标志,跳出while循环
- BEEP_Ctrl();
- put_char(4,30," ");//声音提示3,表示写卡完成,用户可以取走卡
- delay_nms(1000);
- //注意:声音提示后的1秒延迟期间,必须拿走卡,否则体统重新读卡
- }
- }
- }
- /*============================================================================
- 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);
- }
- //对第八块(绝对地址)进行授权, 也就是第三个扇区第一块
- 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, 下载次数: 57)
|
评分
-
查看全部评分
|