📄 finger.c
字号:
#include "Include.h"
extern uchar NowKey;//当前按键
extern uint Tc;//超时计时器
extern uchar Timer;//超时计数
extern uchar Timer2;//超时计数2
extern uchar BellTimer;
extern uchar Rx_Cnt;//串口接收计数器
extern bit ReceiveOK;//数据包接收完成标志位
sbit FINGER_POWER=P1^0;//模块电源控制,低电平有效
unsigned char FingerRecord[26];//指纹记录数组,每位代表对应编号指纹有无
unsigned char xdata CommBuf[MAX_BUF_NUMBER];//串口缓冲
unsigned char xdata SCC;//串口接收和校验
//打开模块电源
void FingerOn(void)
{
FINGER_POWER=0;
DelayNuS(10);}
//关闭模块电源
void FingerOff(void)
{ FINGER_POWER=1;
DelayNuS(10);}
//初始化
void FingerInit(void)
{ UARTInit();
FingerOff();
memset(FingerRecord,0,sizeof(FingerRecord));}//初始化记录
//复位UART变量
void Clear_Uart_Variable(void)
{ ReceiveOK = 0;Rx_Cnt = 0;}
//发送命令
//内含编码
//入口参数:
// BaoBS:包标识
// Number:包内容长度
// p:待发包内容
//返回值:
// 1:操作成功
// 0:参数错误
// 2:超时
uchar SendCommand(uchar BaoBS,uchar Number,uchar *p)
{
uchar i = 0;
uchar Sum = 0;
uchar* pt = p;
if(Number>MAX_LR_NUMBER)return FALSE;//参数错误
//发送包头
UARTSendByte('M');
Sum += 'M';
UARTSendByte('X');
Sum += 'X';
//发送包标识
UARTSendByte(BaoBS);
Sum += BaoBS;
//发送包长度
UARTSendByte(Number);
Sum += Number;
//发送包内容
for(i = 0;i<Number;i++)
{ UARTSendByte(*p);
Sum += *p;
p++;}
//发送校验和
UARTSendByte(Sum);
return 0;}
//清空指纹
//返回值:
// OK:操作成功
// 其它:通讯错误
uchar EmptyFinger(void)
{
uchar Command = C_EMPTY_FINGER;
Clear_Uart_Variable();
SendCommand(C_COMMAND,1,&Command);
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
{ if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]));
else return ANSWER_NUMBER_E;}
else return C_GET_FAIL;
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
{ if((C_ANSWER==CommBuf[2])&&(C_EMPTY_FINGER==CommBuf[4]))return OK;
else return ANSWER_NUMBER_E;}
else{return C_GET_FAIL;}
return FALSE;}
//写Flash
//入口参数:
// p:待写数据存放地址
// Number:读取个数
// AddrH:地址高字节
// AddrL:地址低字节
//返回值:
// OK:操作成功
// 其它:通讯错误
uchar WriteFingerFlash(uchar *p,uchar Number,uchar AddrH,uchar AddrL)
{ CommBuf[0] = C_WRITE_FLASH;
CommBuf[1] = AddrH;
CommBuf[2] = AddrL;
CommBuf[3] = Number;
memcpy(&CommBuf[4],p,Number);
Clear_Uart_Variable();
SendCommand(C_COMMAND,Number+4,CommBuf);
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
{ if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]));
else return ANSWER_NUMBER_E;}
else return C_GET_FAIL;
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4]) //数据包和校验判断
{ if((C_ANSWER==CommBuf[2])&&(C_WRITE_FLASH==CommBuf[4]))return OK;
else return ANSWER_NUMBER_E;}
else return C_GET_FAIL;
return FALSE;}
//读Flash
//入口参数:
// p:读取数据存放地址
// Number:读取个数
// AddrH:地址高字节
// AddrL:地址低字节
//返回值:
// OK:操作成功
// 其它:通讯错误
uchar ReadFingerFlash(uchar *p,uchar Number,uchar AddrH,uchar AddrL)
{
uchar Command = C_READ_FLASH;
CommBuf[0] = C_READ_FLASH;
CommBuf[1] = AddrH;
CommBuf[2] = AddrL;
CommBuf[3] = Number;
//发送读Flash指令
Clear_Uart_Variable();
SendCommand(C_COMMAND,4,CommBuf);
//等待接收正确接收返回
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
{ if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]));
else return ANSWER_NUMBER_E;}
else return C_GET_FAIL;
//等待返回数据
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4]) //数据包和校验判断
{ if((C_ANSWER==CommBuf[2])&&(C_READ_FLASH==CommBuf[4]))
{ memcpy(p,&CommBuf[5],Number);//复制数据
return OK;}
else return ANSWER_NUMBER_E;}
else return C_GET_FAIL;
return FALSE;}
//查找某一地址的记录为空与否
//入口参数:
//AddrH:高地址位
//AddrH:低地址位
//返回值:
//OK:有指纹
//NOFINGER:无指纹
//其他:不成功
uchar Find_Finger(void)
{ FingerOn();
CommBuf[0] = C_READ_INFO;//0x4B查询指纹库信息
CommBuf[1] = 0;//高地址
CommBuf[2] = 0;//低地址
Clear_Uart_Variable();
SendCommand(C_COMMAND,3,CommBuf);//1.发送查询是否存在指定编号的指纹命令
//等待接收正确接收返回
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
{ if((0x30==CommBuf[2])&&(0x01==CommBuf[4]));//2。正确接收
else return ANSWER_NUMBER_E;}
else return C_GET_FAIL;
//等待返回数据
Tc = 2;
while(!ReceiveOK&&Tc);
Clear_Uart_Variable();
if(0==Tc) return FALSE;
if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
{if((C_ANSWER==CommBuf[2])&&(C_READ_INFO==CommBuf[4]))//3。正确接收
{ switch (CommBuf[5])
{case ANSWER_HAVE_FINGER://37
break;
case ANSWER_NUMBER_E://35
return ANSWER_NUMBER_E;
case ANSWER_NO_FINGER://38
return NOFINGER;}
return OK;}
else{return ANSWER_NUMBER_E;}}
else return C_GET_FAIL;
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -