📄 finger.c
字号:
#include "Include.h"
extern unsigned char NowKey; //当前按键
extern unsigned int Tc; //超时计时器
extern unsigned char Timer; //超时计数
extern unsigned char Timer2; //超时计数2
//extern unsigned char BellTimer;
extern unsigned char 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:超时
unsigned char SendCommand(unsigned char BaoBS,unsigned char Number,unsigned char *p)
{
unsigned char i = 0; //发送一个数据包:'M'+'X'+BaoBS+Number+&p+SUM
unsigned char Sum = 0;
unsigned char* 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:操作成功
// 其它:通讯错误
unsigned char EmptyFinger(void)
{
unsigned char 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:操作成功
// 其它:通讯错误
unsigned char WriteFingerFlash(unsigned char *p,unsigned char Number,unsigned char AddrH,unsigned char 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:操作成功
// 其它:通讯错误
unsigned char ReadFingerFlash(unsigned char *p,unsigned char Number,unsigned char AddrH,unsigned char AddrL)
{
unsigned char 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -