找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3917|回复: 0
打印 上一主题 下一主题
收起左侧

MFRC500读卡芯片饭卡打卡系统单片机程序 带4-3键盘输入和LCD12864点阵液晶输出

[复制链接]
跳转到指定楼层
楼主
基于MFRC500读卡芯片的完整读卡程序,带4-3键盘输入驱动和128-64点阵液晶输出


单片机源程序如下:
  1. /****************************************************************************                                                                          *
  2. * File:         MAIN.C                                                      *                                                                           *
  3. * Version:      饭卡打卡系统简化版1.0                                       *                                                                           *
  4. * Created: 11.30                                                  *
  5. * Last Change: 5.15                                                   *                                                                          *
  6. * Author:       HeXing    $ 东邪西毒                                          *
  7. * QQ:           271885846 $ 343543175                                      *
  8. * EMail:        271885846@qq.com   huangwenshan@126.com                     *
  9. * Compiler:     KEIL C51 uVision2 V2.23                                     *                                                                           *
  10. * Description:  操作流程:先读卡,等待键盘输入,再写卡                         *                                                      *
  11. *               注意:键盘输入后,卡不能抽走,不然数据流失!                    *
  12. *               注意:程序共有18个警告,因为有些函数暂时没用到!               *
  13. *               注意:暂没小数显示,由于以后考虑用以太网通讯,故没加进UATR通讯*
  14. *               留言:谢谢Hexing的帮助,如果大家对程序有什么意见可以随时找我  *      
  15. ****************************************************************************/
  16. #include "main.h"
  17. #include "m500a.h"
  18. #include "PORT.h"
  19. #include "delay.h"
  20. #include "LCD_Key.h"

  21. /*--------------公有变量定义---------------------------------------------------------*/
  22. bit   KEY_SCAN_G;            //键盘扫描标志   
  23. bit   W_CARD_SCAN_G;         //写卡扫描标志
  24. tWord Card_Money;            //最大值这里只取9999,显示4位数金额
  25. tByte LCD_Money[5];          //卡中金额显示缓冲区
  26. tByte LCD_Key[6]="    ";     //初始化按键显示缓冲区,保证数组最后字节存有结束符'\0'              
  27. tByte temp;                  //临时变量
  28. tByte tt1[2];                //存放卡类型号            
  29. tByte Snr_RC500[4];          //存放rc500序列号
  30. tByte AbsoluteBlock = 8;     //对绝对块8进行操作, 取值范围为 0 <= AbsoluteBlock < 64
  31. tByte data cardserialno[4];  //存放卡号
  32. tByte idata blockdata[16];   //绝对块8数据缓冲区,注意其储存模式 idata

  33. /*-------私有函数原型----------------------------------------------------------------*/
  34. void  MCU_Init(void);                                           //单片机初始化函数
  35. void  BEEP_Ctrl(void);                                          //蜂鸣器控制函数
  36. tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno);  //卡激活函数
  37. tByte MF_Read  (tByte AbsoluteBlock,tByte idata *blockdata);    //读卡函数
  38. tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata);    //写卡函数
  39. tByte data RC500_Disp[13];
  40. void hex_ten(unsigned char *RC500_St);

  41. /*=====================================================================================
  42. main函数开始                                                                     
  43. ======================================================================================*/
  44. void main (void)
  45. {
  46.   MCU_Init();               
  47.   M500PCD_Init();      
  48.   KEYPAD_Init();
  49.   LCD_Init();
  50.   LCD_China_Disp();
  51.   BEEP_Ctrl();              //声音提示1,所有初始化完成,等待读卡
  52.    
  53.                               
  54.   while(1)
  55.    {     
  56.      temp=MF_Active( AbsoluteBlock,cardserialno);       //激活一张卡
  57.      if(temp!=MI_OK)
  58.        {           
  59.                 continue;                                       //跳到 while 入口                          
  60.        }
  61.      temp=MF_Read(AbsoluteBlock,blockdata);             //读卡数据   
  62.      if(temp!=MI_OK)
  63.        {
  64.         continue;   
  65.            }
  66.      BEEP_Ctrl();
  67.      hex_ten(cardserialno);                          //声音提示2,读卡成功,等待键盘扫描
  68.      put_char(4,30,RC500_Disp);
  69.                                                 
  70.      KEY_SCAN_G=1;                                      //允许键盘扫描                  
  71.      while(KEY_SCAN_G)                                 
  72.          {
  73.         Card_Money=blockdata[0]+blockdata[1]*256;       //合并绝对块8前两字节
  74.             LCD_Money[0]=Card_Money/1000+48;                //装载千位数据     
  75.         LCD_Money[1]=Card_Money%1000/100+48;            //百位
  76.         LCD_Money[2]=Card_Money%1000%100/10+48;         //十位
  77.         LCD_Money[3]=Card_Money%1000%100%10+48;         //个位
  78.             LCD_Money[4]='\0';                              //结束符
  79.                 LCD_KEY_Update();                               //键盘和LCD刷新
  80.         delay_nms(30);                                        //每隔30毫秒扫描一次键盘
  81.           }


  82.         
  83.      W_CARD_SCAN_G=1;                                        //允许写卡扫描     
  84.      while(W_CARD_SCAN_G)
  85.      {
  86.         blockdata[0]=Card_Money%256;                     //分解回字节数据,准备写回到绝对块8
  87.         blockdata[1]=Card_Money/256;
  88.         temp=MF_Active( AbsoluteBlock,cardserialno);     //激活同一张卡
  89.         if(temp!=MI_OK)
  90.         {         
  91.                   continue;
  92.         }
  93.         temp=MF_Write(AbsoluteBlock,blockdata);          //写数据入卡  
  94.             if(temp!=MI_OK)
  95.         {
  96.           continue;
  97.             }
  98.         W_CARD_SCAN_G=0;                //清循环标志,跳出while循环
  99.         BEEP_Ctrl();
  100.         put_char(4,30,"            ");//声音提示3,表示写卡完成,用户可以取走卡
  101.         delay_nms(1000);
  102.                                //注意:声音提示后的1秒延迟期间,必须拿走卡,否则体统重新读卡
  103.            }

  104.    }

  105. }
  106. /*============================================================================
  107. main函数结束                                                                    
  108. =============================================================================*/
  109. //--------------------------------------------------------
  110. //激活卡函数
  111. //--------------------------------------------------------        
  112. tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno)
  113. {  
  114.     tByte status1;
  115.     tByte *sak1;

  116.          status1 = M500PiccRequest(PICC_REQALL, tt1);//寻卡
  117.           if (status1!=MI_OK)
  118.         {
  119.            return(FM1715_REQERR);
  120.         }

  121.     status1=M500PiccAnticoll(0,cardserialno);//防碰撞
  122.     if (status1!=MI_OK)
  123.         {
  124.        return(FM1715_REQERR);           
  125.         }
  126.         
  127.            status1=M500PiccSelect(cardserialno,sak1);//选择卡
  128.           if (status1!=MI_OK)
  129.         {
  130.        return(FM1715_REQERR);           
  131.         }   
  132.      //对第八块(绝对地址)进行授权, 也就是第三个扇区第一块
  133.     status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);//授权
  134.           if (status1!=MI_OK)
  135.         {        
  136.        return(FM1715_REQERR);        
  137.         }
  138.             
  139.         return MI_OK;
  140. }

  141. //--------------------------------------------------------
  142. //读卡函数
  143. //--------------------------------------------------------
  144. tByte MF_Read(tByte AbsoluteBlock,tByte idata *blockdata)
  145. {  
  146.     tByte status1;
  147.     status1=M500PiccRead(AbsoluteBlock, blockdata);
  148.   
  149.         if (status1!=MI_OK)
  150.         {           
  151.             return(FM1715_REQERR);               
  152.         }
  153.         
  154.     return MI_OK;
  155. }

  156. //--------------------------------------------------------
  157. //写卡函数
  158. //--------------------------------------------------------
  159. tByte MF_Write(tByte AbsoluteBlock,tByte idata *blockdata)
  160. {   
  161.     tByte status1;
  162.     status1 = M500PiccWrite(AbsoluteBlock,blockdata);

  163.           if (status1!=MI_OK)
  164.         {
  165.            return(FM1715_REQERR);         
  166.         }

  167.         return MI_OK;
  168. }

  169. //------------------------------------------------------------------------
  170. //MCU_Init函数
  171. //------------------------------------------------------------------------
  172. void MCU_Init(void)
  173. {
  174.     RC500RST    = FALSE;
  175.     RC500_CS    = TRUE;        // Enable the CS for RC500                        
  176.     IT0 = 1;                            // Config ext0 as edge trigger for RC500
  177.     EX0 = 1;                            // Enable ext0 interrupt for RC500
  178.     EA = TRUE;                        // Enable all interrupts
  179.         
  180. }
  181. //-----------------------------------------------------------------------
  182. //蜂鸣器驱动
  183. //---------------------------------------------------------------------
  184. ……………………

  185. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于MFRC500读卡芯片的完整读卡程序,带4-3键盘输入驱动和128-64点阵液晶输出.rar (41.95 KB, 下载次数: 57)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表