OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2822|回复: 5

关于指纹识别代码简化问题

[复制链接]

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-9-22
在线时间
42 小时
发表于 2018-4-17 22:51:15 | 显示全部楼层 |阅读模式
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); //读参数 等我全部做好会打包放出来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-9-22
在线时间
42 小时
 楼主| 发表于 2018-4-17 22:51:16 | 显示全部楼层
解决了,在录指纹或者删除指纹前加一句PS_ReadSysPara(&AS608Para);  //读参数
等我全部做好会打包放出来
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-18 01:23:14 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2017-10-17
在线时间
18 小时
发表于 2018-4-18 13:19:39 | 显示全部楼层
你先好好仿真看看代码
回复

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-9-22
在线时间
42 小时
 楼主| 发表于 2018-4-18 14:38:41 | 显示全部楼层
回复

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-9-22
在线时间
42 小时
 楼主| 发表于 2018-4-18 14:39:39 | 显示全部楼层
Lixiansong 发表于 2018-4-18 13:19
你先好好仿真看看代码

对,我还没放弃,等大佬同时也在尝试继续调
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表