初级会员

- 积分
- 178
- 金钱
- 178
- 注册时间
- 2017-9-22
- 在线时间
- 42 小时
|
1金钱
本帖最后由 血洗无涯 于 2018-4-17 22:56 编辑
#include "sys.h"
#include "delay.h"
#include "beep.h"
#include "usart2.h"
#include "AS608.h"
#include "timer.h"
#include "myiic.h"
#include "oled.h"
#include "key.h"
//ALIENTEK 战舰V3&精英 STM32开发板 扩展实验14
//ATK-AS608指纹识别模块实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @alientek
#define usart2_baund 57600//串口2波特率,根据指纹模块波特率更改
SysPara AS608Para;//指纹模块AS608参数
u16 ValidN;//模块内有效指纹个数
void Add_FR(void); //录指纹
void Del_FR(void); //删除指纹
void press_FR(void);//刷指纹
int main(void)
{
u8 ensure;
u8 key_num;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(); //初始化延时函数
usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
PS_StaGPIO_Init(); //初始化FR读状态引脚
BEEP_Init(); //初始化蜂鸣器
KEY_Init();
IIC_Init();
OLED_Init();
/*加载指纹识别实验界面*/
OLED_P8x16Str(0,0,"AS608 Ready");
while(PS_HandShake(&AS608Addr))//与AS608模块握手
{
delay_ms(400);
OLED_P8x16Str(0,2,"try connection");
delay_ms(800);
OLED_P6x8Str(0,5,"wait");
}
OLED_CLS();
OLED_P8x16Str(0,0,"AS608 Ready");
OLED_P6x8Str(0,2,"connection success");
ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
if(ensure!=0x00)
PS_ReadSysPara(&AS608Para); //读参数
while(1)
{
OLED_CLS();
OLED_P6x8Str(0,0,"AS608 Ready");
OLED_P6x8Str(0,2,"Press the finger");
OLED_P6x8Str(0,4,"1.delete FR");
OLED_P6x8Str(0,5,"3.add FR");
key_num=keyscan();
if(key_num)
{
if(key_num==1)Del_FR(); //删指纹
if(key_num==3)Add_FR(); //录指纹
}
if(PS_Sta) //检测PS_Sta状态,如果有手指按下
{
press_FR();//刷指纹
}
delay_ms(500);
}
}
//录指纹
void Add_FR(void)
{
u8 i,ensure ,processnum=0;
u16 ID;
while(1)
{
switch (processnum)
{
case 0:
i++;
OLED_CLS();
OLED_P6x8Str(0,2,"Press the finger");
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
ensure=PS_GenChar(CharBuffer1);//生成特征
BEEP=0;
if(ensure==0x00)
{
OLED_CLS();
OLED_P6x8Str(0,2,"normal");
i=0;
processnum=1;//跳到第二步
}
}
break;
case 1:
i++;
OLED_CLS();
OLED_P6x8Str(0,2,"Confirm again");
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
ensure=PS_GenChar(CharBuffer2);//生成特征
BEEP=0;
if(ensure==0x00)
{
OLED_CLS();
OLED_P6x8Str(0,2,"normal");
i=0;
processnum=2;//跳到第三步
}
}
break;
case 2:
OLED_CLS();
OLED_P6x8Str(0,2,"Compare...");
ensure=PS_Match();
if(ensure==0x00)
{
OLED_CLS();
OLED_P6x8Str(0,2,"success");
processnum=3;//跳到第四步
}
else
{
OLED_CLS();
OLED_P6x8Str(0,2,"fail");
OLED_P6x8Str(0,4,"try again");
i=0;
processnum=0;//跳回第一步
}
delay_ms(1200);
break;
case 3:
OLED_CLS();
OLED_P6x8Str(0,2,"Saving...");
ensure=PS_RegModel();
if(ensure==0x00)
{
OLED_CLS();
OLED_P6x8Str(0,2,"Save success");
processnum=4;//跳到第五步
}else {processnum=0;}
delay_ms(1200);
break;
case 4:
OLED_CLS();
OLED_P6x8Str(0,2,"input ID");
OLED_P6x8Str(0,4,"0=< ID <=299");
do
{
ID=keyscan();
}
while(!(ID<AS608Para.PS_max));//输入ID必须小于指纹容量的最大值
ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
if(ensure==0x00)
{
OLED_CLS();
OLED_P6x8Str(0,2,"Successful entry");
PS_ValidTempleteNum(&ValidN);//读库指纹个数
//LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
delay_ms(1500);
return ;
}else {processnum=0;}
break;
}
delay_ms(400);
if(i==5)//超过5次没有按手指则退出
{
OLED_CLS();
OLED_P6x8Str(0,2,"Sign out");
break;
}
}
}
//刷指纹
void press_FR(void)
{
SearchResult seach;
u8 ensure;
ensure=PS_GetImage();
if(ensure==0x00)//获取图像成功
{
BEEP=1;//打开蜂鸣器
ensure=PS_GenChar(CharBuffer1);
if(ensure==0x00) //生成特征成功
{
BEEP=0;//关闭蜂鸣器
ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);
if(ensure==0x00)//搜索成功
{
OLED_CLS();
OLED_P6x8Str(0,2,"Verification success");
}
}
BEEP=0;//关闭蜂鸣器
delay_ms(600);
}
}
//删除指纹
void Del_FR(void)
{
u8 ensure;
u16 num=0;
OLED_CLS();
OLED_P6x8Str(0,0,"Delete FR");
OLED_P6x8Str(0,4,"1.all delete");
OLED_P6x8Str(0,5,"2.one delete");
delay_ms(50);
num=keyscan();//获取返回的数值
if(num==1)
ensure=PS_Empty();//清空指纹库
if(num==2)
{
OLED_CLS();
OLED_P6x8Str(0,0,"Delete FR");
OLED_P6x8Str(0,1,"input ID");
OLED_P6x8Str(0,2,"0=< ID <=299");
num=keyscan();
ensure=PS_DeletChar(num,1);//删除单个指纹
}
if(ensure==0)
{
OLED_CLS();
OLED_P6x8Str(0,2,"Delete success");
}
delay_ms(1200);
PS_ValidTempleteNum(&ValidN);//读库指纹个数
//LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
}
****************************************华丽的分割线********************************
****************************************矩阵键盘********************************
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能PORTF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//KEY0-KEY3 矩阵键盘的行
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出 GPIO_Mode_Out_OD
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//KEY4-KEY7 矩阵键盘的列
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
u8 keyscan()
{
uint8_t temp;
uint8_t key=0;
GPIO_Write(GPIOF, 0xFE);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
switch(temp)
{
case 0xee: key=1; break;
case 0xde: key=2; break;
case 0xbe: key=3; break;
case 0x7e: key=4; break;
default:break;
}
while(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
}
}
}
GPIO_Write(GPIOF, 0xFD);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
switch(temp)
{
case 0xed: key=5; break;
case 0xdd: key=6; break;
case 0xbd: key=7; break;
case 0x7d: key=8; break;
default:break;
}
while(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
}
}
}
GPIO_Write(GPIOF, 0xFB);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
switch(temp)
{
case 0xeb: key=9; break;
case 0xdb: key=10; break;
case 0xbb: key=11; break;
case 0x7b: key=12; break;
default:break;
}
while(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
}
}
}
GPIO_Write(GPIOF, 0xF7);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
if(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
switch(temp)
{
case 0xe7: key=13; break;
case 0xd7: key=14; break;
case 0xb7: key=15; break;
case 0x77: key=16; break;
default:break;
}
while(temp!=0xf0)
{
temp = GPIO_ReadInputData(GPIOF);
temp = temp&0xf0;
}
}
}
return key;
}
问题:1.提示输入ID时,按键按下后程序不往下执行(也就是说无法通过while(!(ID<AS608Para.PS_max)); ),经检测按键确实获取到数值。
2.如果在 添加指纹 前调用PS_ReadSysPara(&AS608Para); 输入ID时,还没按按键直接通过了,并保存指纹,确实能识别指纹,但是并没有保存到指纹模块的flash中,
也就是说断电后上电指纹丢失。
3.还是在 添加指纹 前调用PS_ReadSysPara(&AS608Para);选择删除指纹后,直接快速选择了全部删除,并没有停止到选择单条删除还是全部删除。
|
最佳答案
查看完整内容[请看2#楼]
解决了,在录指纹或者删除指纹前加一句PS_ReadSysPara(&AS608Para); //读参数
等我全部做好会打包放出来
|