📄 main.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 + -