找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4705|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MFRC500讀卡芯片飯卡打卡系統(tǒng)單片機(jī)程序 帶4-3鍵盤輸入和LCD12864點(diǎn)陣液晶輸出

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于MFRC500讀卡芯片的完整讀卡程序,帶4-3鍵盤輸入驅(qū)動(dòng)和128-64點(diǎn)陣液晶輸出


單片機(jī)源程序如下:
  1. /****************************************************************************                                                                          *
  2. * File:         MAIN.C                                                      *                                                                           *
  3. * Version:      飯卡打卡系統(tǒng)簡化版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. *               注意:鍵盤輸入后,卡不能抽走,不然數(shù)據(jù)流失!                    *
  12. *               注意:程序共有18個(gè)警告,因?yàn)橛行┖瘮?shù)暫時(shí)沒用到!               *
  13. *               注意:暫沒小數(shù)顯示,由于以后考慮用以太網(wǎng)通訊,故沒加進(jìn)UATR通訊*
  14. *               留言:謝謝Hexing的幫助,如果大家對程序有什么意見可以隨時(shí)找我  *      
  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;            //鍵盤掃描標(biāo)志   
  23. bit   W_CARD_SCAN_G;         //寫卡掃描標(biāo)志
  24. tWord Card_Money;            //最大值這里只取9999,顯示4位數(shù)金額
  25. tByte LCD_Money[5];          //卡中金額顯示緩沖區(qū)
  26. tByte LCD_Key[6]="    ";     //初始化按鍵顯示緩沖區(qū),保證數(shù)組最后字節(jié)存有結(jié)束符'\0'              
  27. tByte temp;                  //臨時(shí)變量
  28. tByte tt1[2];                //存放卡類型號            
  29. tByte Snr_RC500[4];          //存放rc500序列號
  30. tByte AbsoluteBlock = 8;     //對絕對塊8進(jìn)行操作, 取值范圍為 0 <= AbsoluteBlock < 64
  31. tByte data cardserialno[4];  //存放卡號
  32. tByte idata blockdata[16];   //絕對塊8數(shù)據(jù)緩沖區(qū),注意其儲存模式 idata

  33. /*-------私有函數(shù)原型----------------------------------------------------------------*/
  34. void  MCU_Init(void);                                           //單片機(jī)初始化函數(shù)
  35. void  BEEP_Ctrl(void);                                          //蜂鳴器控制函數(shù)
  36. tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno);  //卡激活函數(shù)
  37. tByte MF_Read  (tByte AbsoluteBlock,tByte idata *blockdata);    //讀卡函數(shù)
  38. tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata);    //寫卡函數(shù)
  39. tByte data RC500_Disp[13];
  40. void hex_ten(unsigned char *RC500_St);

  41. /*=====================================================================================
  42. main函數(shù)開始                                                                     
  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);             //讀卡數(shù)據(jù)   
  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前兩字節(jié)
  74.             LCD_Money[0]=Card_Money/1000+48;                //裝載千位數(shù)據(jù)     
  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;         //個(gè)位
  78.             LCD_Money[4]='\0';                              //結(jié)束符
  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;                     //分解回字節(jié)數(shù)據(jù),準(zhǔn)備寫回到絕對塊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);          //寫數(shù)據(jù)入卡  
  94.             if(temp!=MI_OK)
  95.         {
  96.           continue;
  97.             }
  98.         W_CARD_SCAN_G=0;                //清循環(huán)標(biāo)志,跳出while循環(huán)
  99.         BEEP_Ctrl();
  100.         put_char(4,30,"            ");//聲音提示3,表示寫卡完成,用戶可以取走卡
  101.         delay_nms(1000);
  102.                                //注意:聲音提示后的1秒延遲期間,必須拿走卡,否則體統(tǒng)重新讀卡
  103.            }

  104.    }

  105. }
  106. /*============================================================================
  107. main函數(shù)結(jié)束                                                                    
  108. =============================================================================*/
  109. //--------------------------------------------------------
  110. //激活卡函數(shù)
  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.      //對第八塊(絕對地址)進(jìn)行授權(quán), 也就是第三個(gè)扇區(qū)第一塊
  133.     status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);//授權(quán)
  134.           if (status1!=MI_OK)
  135.         {        
  136.        return(FM1715_REQERR);        
  137.         }
  138.             
  139.         return MI_OK;
  140. }

  141. //--------------------------------------------------------
  142. //讀卡函數(shù)
  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. //寫卡函數(shù)
  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函數(shù)
  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. //蜂鳴器驅(qū)動(dòng)
  183. //---------------------------------------------------------------------
  184. ……………………

  185. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于MFRC500讀卡芯片的完整讀卡程序,帶4-3鍵盤輸入驅(qū)動(dòng)和128-64點(diǎn)陣液晶輸出.rar (41.95 KB, 下載次數(shù): 58)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表