⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于MFRC500读卡芯片的完整读卡程序
💻 C
字号:
/****************************************************************************                                                                          *
* File:         MAIN.C                                                      *                                                                           *
* Version:      饭卡打卡系统简化版1.0                                       *                                                                           *
* Created:      2007.11.30                                                  *
* Last Change:  2008.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
	
}
//-----------------------------------------------------------------------
//蜂鸣器驱动
//---------------------------------------------------------------------
void BEEP_Ctrl (void)
{
    BEEP = OFF;
    delay_nms(50);
    BEEP = ON;
}

//--------------------------------------------------
void hex_ten(unsigned char *RC500_St)		
 { 
     RC500_Disp[0]=RC500_St[0]/100+48;
     RC500_Disp[1]=RC500_St[0]%100/10+48;
     RC500_Disp[2]=RC500_St[0]%100%10+48;
	 RC500_Disp[3]=RC500_St[1]/100+48;
     RC500_Disp[4]=RC500_St[1]%100/10+48;
     RC500_Disp[5]=RC500_St[1]%100%10+48;
     RC500_Disp[6]=RC500_St[2]/100+48;
     RC500_Disp[7]=RC500_St[2]%100/10+48;
     RC500_Disp[8]=RC500_St[2]%100%10+48;
     RC500_Disp[9]=RC500_St[3]/100+48;
     RC500_Disp[10]=RC500_St[3]%100/10+48;
     RC500_Disp[11]=RC500_St[3]%100%10+48;
	 RC500_Disp[12]=0;
 } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -