標(biāo)題:
做指紋識(shí)別系統(tǒng)時(shí),指紋模塊程序與其它程序不能同時(shí)運(yùn)行是咋回事?
[打印本頁(yè)]
作者:
18829482329
時(shí)間:
2018-5-10 15:44
標(biāo)題:
做指紋識(shí)別系統(tǒng)時(shí),指紋模塊程序與其它程序不能同時(shí)運(yùn)行是咋回事?
#include<reg52.h>
#include <intrins.h>
#include <string.h>
//#include<SHIJIAN.H>
typedef unsigned char u8; // 重命名類(lèi)型u8簡(jiǎn)化代碼編寫(xiě)
typedef unsigned int u16;
#define LCD1602_DATA_PORT P0
#define KEY_PORT P1 // 矩陣按鍵接在P1端口
//#define DDD P2
sbit DSIO = P3^4; // DS1302的SPI接口IO線(xiàn),輸入輸出都走這里
sbit CE = P3^5; // chip enable,讀寫(xiě)ds1302前要使能,讀寫(xiě)完要禁止
sbit SCLK = P3^6; // serial clock,串行時(shí)鐘線(xiàn)
sbit gLcd1602_E=P2^7;
sbit gLcd1602_RS=P2^6;
sbit gLcd1602_RW=P2^5;
sbit buzz=P1^5;
sbit KEY_DOWN=P3^2;
sbit KEY_OK=P3^3;
sbit KEY_CANCEL=P3^1;
sbit KEY_QIE=P3^0;
sbit KEY_JIA=P1^1;
sbit KEY_TIAO=P1^0;
char local_date=0,base_date=0;
u8 hour=0,minute=0,second=0,count=0;
u8 slnum=0,cishu=0;
code u8 SHIJIAN[60]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,
0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};
code unsigned char FPM10A_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗(yàn)證
code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //協(xié)議包頭
code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05}; //獲得指紋圖像
code unsigned char FPM10A_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數(shù)
code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
code unsigned char FPM10A_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9號(hào)指紋
code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1
code unsigned char FPM10A_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2
code unsigned char FPM10A_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版
code unsigned char FPM10A_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版
volatile unsigned char FPM10A_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置
code u8 DS1302_READ_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
code u8 DS1302_WRITE_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
xdata u8 gTime[7]; // 用來(lái)存儲(chǔ)DS1302中7個(gè)時(shí)間的BCD碼值
xdata u8 gDispBuf0[17]; // LCD1602上面一排的顯示buf
xdata u8 gDispBuf1[17];
volatile unsigned char FPM10A_RECEICE_BUFFER[32];
void Buzz_Times(unsigned char times);
void zhishideng(u8 val);
u8 KeyScan(void);
void Uart_Init(void);
void Uart_Send_Byte(unsigned char c);
unsigned char Uart_Receive_Byte();
void FPM10A_Cmd_Send_Pack_Head(void);
void FPM10A_Cmd_Check(void);
void FPM10A_Receive_Data(unsigned char ucLength);
void FPM10A_Cmd_Get_Img(void);
void FINGERPRINT_Cmd_Img_To_Buffer1(void);
void FINGERPRINT_Cmd_Img_To_Buffer2(void);
void FPM10A_Cmd_Search_Finger(void);
void FPM10A_Cmd_Reg_Model(void);
void FINGERPRINT_Cmd_Delete_All_Model(void);
void FPM10A_Cmd_Save_Finger( unsigned int storeID );
void FPM10A_Add_Fingerprint();
void FPM10A_Find_Fingerprint();
void FPM10A_Delete_All_Fingerprint();
void Device_Check(void);
static void fun1();
static void fun2();
void delay(u16 z)
{
u16 x,y,a;
for(x=z;x>0;x--)
for(y=142;y>0;y--);
for(a=2;a>0;a--);
}
//static void delay5ms(void);
static void Lcd1602WaitNoBusy(void) //忙檢測(cè)函數(shù),判斷bit7是0,允許執(zhí)行;1禁止
{
u8 sta = 0; //
LCD1602_DATA_PORT = 0xff;
gLcd1602_RS = 0;
gLcd1602_RW = 1;
do
{
gLcd1602_E = 1;
sta = LCD1602_DATA_PORT;
gLcd1602_E = 0; //使能,用完就拉低,釋放總線(xiàn)
}while(sta & 0x80);
}
static void Lcd1602WriteCmd(u8 cmd)
{
Lcd1602WaitNoBusy(); // 先等待LCD1602處于不忙狀態(tài)
gLcd1602_E = 0; // 禁止LCD
gLcd1602_RS = 0; // 選擇發(fā)送命令模式
gLcd1602_RW = 0; // 選擇寫(xiě)入模式
LCD1602_DATA_PORT = cmd; // 將1字節(jié)命令字放入8位并行數(shù)據(jù)端口
gLcd1602_E = 1; // 使能LED
gLcd1602_E = 0; // 禁止LCD
}
static void Lcd1602WriteData(u8 dat)
{
Lcd1602WaitNoBusy(); // 先等待LCD1602處于不忙狀態(tài)
gLcd1602_E = 0; // 禁止LCD
gLcd1602_RS = 1; // 選擇發(fā)送數(shù)據(jù)模式
gLcd1602_RW = 0; // 選擇寫(xiě)入模式
LCD1602_DATA_PORT = dat; // 將1字節(jié)命令字放入8位并行數(shù)據(jù)端口
gLcd1602_E = 1; // 使能LED
gLcd1602_E = 0; // 禁止LCD
}
void Lcd1602Init(void)
{
Lcd1602WriteCmd(0x38); // 按照數(shù)據(jù)手冊(cè)的初始化時(shí)序,先發(fā)送38H
delay(5); // 延時(shí)5ms
Lcd1602WriteCmd(0x38); // 按照數(shù)據(jù)手冊(cè)的初始化時(shí)序,先發(fā)送38H
delay(5); // 延時(shí)5ms
Lcd1602WriteCmd(0x38); // 按照數(shù)據(jù)手冊(cè)的初始化時(shí)序,先發(fā)送38H
delay(5); // 延時(shí)5ms
Lcd1602WriteCmd(0x38); // 顯示模式設(shè)置
Lcd1602WriteCmd(0x08); // 關(guān)閉顯示
Lcd1602WriteCmd(0x01); // 清屏(同時(shí)清數(shù)據(jù)指針)
Lcd1602WriteCmd(0x06); // 讀寫(xiě)后指針自動(dòng)加1,寫(xiě)1個(gè)字符后整屏顯示不移動(dòng)
Lcd1602WriteCmd(0x0c); // 開(kāi)顯示,不顯示光標(biāo)
}
void Lcd1602SetCursor(u8 x, u8 y) // 坐標(biāo)顯示
{
u8 addr = 0;
switch (y)
{
case 0: // 上面一行
addr = 0x00 + x; break;
case 1: // 下面一行
addr = 0x40 + x; break;
default:
break;
}
Lcd1602WriteCmd(addr | 0x80);
}
void Lcd1602ShowStr(u8 x, u8 y, u8 *pStr) //顯示字符串
{
Lcd1602SetCursor(x, y); //當(dāng)前字符的坐標(biāo)
while (*pStr != '\0')
{
Lcd1602WriteData(*pStr++);
}
}
void Lcd1602DispBufInit(void)
{
strcpy(gDispBuf0,"00:00:00 ");
//gDispBuf0[14] = 0xdf; // 顯示攝氏度的小圓圈
//gDispBuf0[15] = 'C'; // 顯示攝氏度的大寫(xiě)C
//gDispBuf0[16] = '\0'; // 字符串結(jié)尾
//strcpy(gDispBuf1, "00 00 00EEOK-00H");
}
void Lcd1602UpdateDisplay(void)
{
Lcd1602ShowStr(0, 0,"menjingxitong ");
Lcd1602ShowStr(0, 1, gDispBuf0);
}
/*void write_hms(u8 add,u8 dat) //時(shí)分秒寫(xiě)函數(shù),add:輸入位置設(shè)置變量 dat:輸入時(shí)分秒數(shù)據(jù)
{
u8 sw,gw; //定義十位個(gè)位變量
sw=dat/10;
gw=dat%10;
Lcd1602WriteCmd(0x80+0x40+add);//從第二行(add)位開(kāi)始寫(xiě)數(shù)據(jù)
Lcd1602WriteData(0x30+sw); //寫(xiě)入十位
Lcd1602WriteData(0x30+gw); //寫(xiě)入個(gè)位
} */
static void Ds1302WriteReg(u8 addr, u8 dat)
{
u8 i = 0;
CE = 0;
_nop_(); // 空指令,延時(shí)
SCLK = 0; // 先將SCLK置低電平
_nop_();
CE = 1; // CE拉高以使能對(duì)DS1302的讀寫(xiě)權(quán)限
_nop_();
for (i=0; i<8; i++) // 循環(huán)逐位發(fā)送addr的8個(gè)bit,注意低位在前
{
DSIO = addr & 0x01; // 數(shù)據(jù)從LSB低位開(kāi)始傳送
addr >>= 1; // 發(fā)完后addr右移一位原來(lái)的次低位變成新的低位
SCLK = 1; // 拉高SCLK制造一個(gè)上升沿,通知DS1302讀取數(shù)據(jù)
_nop_(); // 延時(shí)等待DS1302讀取DSIO線(xiàn)上的1位數(shù)據(jù)
SCLK = 0; // 讀完后,拉低SCLK為下一個(gè)位的傳輸做準(zhǔn)備
_nop_();
}
// 循環(huán)結(jié)束后1字節(jié)的寄存器地址傳給DS1302
for (i=0; i<8; i++) // 循環(huán)寫(xiě)入8位數(shù)據(jù),注意低位在前
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1; //制造上升沿通知DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0;
_nop_();
} // 循環(huán)結(jié)束后1字節(jié)值成功傳給DS1302
CE = 0; // 寫(xiě)入完畢拉低CE以禁止對(duì)DS1302的讀寫(xiě),防止意外改寫(xiě)事故
_nop_();
}
/*********************************************************************
* 函 數(shù) 名 : Ds1302ReadReg
* 函數(shù)功能 : 向DS1302中地址為addr的寄存器寫(xiě)入數(shù)值dat
* 參數(shù)列表 : addr - 待讀出的寄存器的地址
* 函數(shù)輸出 : 讀出的寄存器addr的數(shù)值
*********************************************************************/
static u8 Ds1302ReadReg(u8 addr)
{
u8 i = 0, dat = 0, dat1 = 0;
CE = 0; // CE設(shè)置為初始狀態(tài)
_nop_();
SCLK = 0; // SCLK設(shè)置為初始狀態(tài)
_nop_();
CE = 1; // 拉高CE使能對(duì)DS1302的寄存器讀寫(xiě)權(quán)限
_nop_();
for (i=0; i<8; i++) // 循環(huán)發(fā)送8bit寄存器地址值
{
DSIO = addr & 0x01; // DS1302的SPI接口從LSB開(kāi)始發(fā)送
addr >>= 1;
SCLK = 1; // 制造上升沿,DS1302在上升沿完成讀取動(dòng)作
_nop_();
SCLK = 0; // 拉低SCLK為下個(gè)bit發(fā)送做準(zhǔn)備
_nop_();
}
for (i=0; i<8; i++) // 循環(huán)讀取8bit寄存器值數(shù)據(jù)
{
dat1 = DSIO;//從最低位開(kāi)始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
_nop_();
}
CE = 0;
_nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
/*********************************************************************
* 函 數(shù) 名 : Ds1302WriteTime
* 函數(shù)功能 : 將全局變量gTime中的時(shí)間寫(xiě)入DS1302中以重置DS1302時(shí)間
* 參數(shù)列表 : 無(wú)
* 函數(shù)輸出 : 無(wú)
*********************************************************************/
static void Ds1302WriteTime(void)
{
u8 i = 0;
Ds1302WriteReg(0x8E, 0x00); // 禁用WP以獲取寫(xiě)時(shí)間寄存器的權(quán)限
for (i=0; i<7; i++) // 依次寫(xiě)入7個(gè)時(shí)間,順序依次:秒分時(shí)日月周年
{
Ds1302WriteReg(DS1302_WRITE_ADDR[i], gTime[i]);
}
Ds1302WriteReg(0x8E, 0x80); // 使能WP以禁止對(duì)時(shí)間寄存器的讀寫(xiě),防止意外改寫(xiě)事故
}
/*********************************************************************
* 函 數(shù) 名 : Ds1302InitTime
* 函數(shù)功能 : 以給定的初始時(shí)間來(lái)重置DS1302時(shí)間值
* 參數(shù)列表 : 無(wú)
* 函數(shù)輸出 : 無(wú)
*********************************************************************/
void Ds1302InitTime(void)
{
// 先給個(gè)初始化時(shí)間
gTime[0] = 0x50; // 初始化時(shí)間,秒,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
gTime[1] = 0x59; // 初始化時(shí)間,分,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
gTime[2] = 0x23; // 初始化時(shí)間,時(shí),注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
//gTime[3] = 0x23; // 初始化時(shí)間,日,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
//gTime[4] = 0x10; // 初始化時(shí)間,月,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
//gTime[5] = 0x01; // 初始化時(shí)間,周,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
//gTime[6] = 0x17; // 初始化時(shí)間,年,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制,以2000為基數(shù)
// 將給定時(shí)間寫(xiě)入DS1302內(nèi)部時(shí)間寄存器以完成初始化
Ds1302WriteTime();
}
/*********************************************************************
* 函 數(shù) 名 : Ds1302ReadTime
* 函數(shù)功能 : 讀出DS1302內(nèi)部時(shí)間放入全局變量gTime中
* 參數(shù)列表 : 無(wú)
* 函數(shù)輸出 : 無(wú)
*********************************************************************/
void Ds1302ReadTime(void)
{
u8 i = 0;
for (i=0; i<7; i++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):秒分時(shí)日月周年
{
gTime[i] = Ds1302ReadReg(DS1302_READ_ADDR[i]);
// gTime[i] = 0x23;
}
}
/*********************************************************************
* 函 數(shù) 名 : Ds1302ReadTime
* 函數(shù)功能 : 讀出DS1302內(nèi)部時(shí)間放入全局變量gTime中
* 參數(shù)列表 : 無(wú)
* 函數(shù)輸出 : 無(wú)
*********************************************************************/
void Ds1302WorkTest(void)
{
// 第1步:從DS1302讀取時(shí)間存入gTime中
Ds1302ReadTime();
// 第2步:將gTime中的時(shí)間值格式化為字符串存入gTimeStr中
gDispBuf0[0] = ((gTime[2] >> 4) & 0x0f) + '0'; // Hour的高4位
gDispBuf0[1] = ((gTime[2] >> 0) & 0x0f) + '0'; // Hour的低4位
// gDispBuf0[2] = ':'; // 分隔符
gDispBuf0[3] = ((gTime[1] >> 4) & 0x0f) + '0'; // Minute的高4位
gDispBuf0[4] = ((gTime[1] >> 0) & 0x0f) + '0'; // Minute的低4位
// gDispBuf0[5] = ':'; // 分隔符
gDispBuf0[6] = ((gTime[0] >> 4) & 0x0f) + '0'; // Second的高4位
gDispBuf0[7] = ((gTime[0] >> 0) & 0x0f) + '0'; // Second的低4位
// gDispBuf0[8] = '-';
}
void main(void)
{
Lcd1602Init();
// 上面1行給17個(gè)字符,超出的最后一個(gè)'g'沒(méi)有被顯示
Lcd1602ShowStr(0, 0, "men jin xi tong ");
// 下面1行給16個(gè)字符,剛好完美顯示
Lcd1602ShowStr(0, 1, "welcome ");
// 最后別忘了打結(jié),不然程序會(huì)反復(fù)執(zhí)行,反復(fù)刷屏,看到的現(xiàn)象是
// 屏幕顯示抖動(dòng)。
//Lcd1602WriteCmd(0x01);
Uart_Init();
delay(200);
Ds1302InitTime();
Lcd1602DispBufInit();
gLcd1602_RW=0;
Device_Check(); //校對(duì)指紋模塊是否接入正確,液晶做出相應(yīng)的提示
delay(2000);
while(1)
{
if(KEY_QIE==0)
{
while(KEY_QIE==0);
//shijian=1;
//cishu+=1;
if(cishu<2)
{
cishu+=1;
if(cishu==2)
cishu=0;
}
}
switch(cishu)
{
case 0: //指紋
fun1();
break;
case 1: // 時(shí)間
fun2();
break;
}
}
}
static void fun1()
{
//FPM10A_Cmd_Send_Pack_Head();
//FPM10A_Cmd_Check();
//FPM10A_Receive_Data(12);
//delay(2000);
Device_Check();
do
{
Lcd1602WriteCmd(0x01);
Lcd1602ShowStr(0, 0, " search finger ");
Lcd1602ShowStr(0, 1, " Add delete");
if(local_date==0)
{
Lcd1602ShowStr(1, 0, "*");
Lcd1602ShowStr(1, 1, " ");
Lcd1602ShowStr(9, 1, " ");
}
else if(local_date==1)
{
Lcd1602ShowStr(1, 0, " ");
Lcd1602ShowStr(1, 1, "*");
Lcd1602ShowStr(9, 1, " ");
}
else if(local_date==2)
{
Lcd1602ShowStr(1, 0, " ");
Lcd1602ShowStr(1, 1, " ");
Lcd1602ShowStr(9, 1, "*");
}
//確認(rèn)鍵
if(KEY_OK==0)
{
while(KEY_OK==0);//等待松開(kāi)按鍵
switch(local_date)
{
case 0: //搜索指紋
FPM10A_Find_Fingerprint();
break;
case 1: //添加指紋
FPM10A_Add_Fingerprint();
break;
case 2: //清空指紋
FPM10A_Delete_All_Fingerprint();
break;
}
}
//切換鍵
if(KEY_DOWN == 0)
{
while(KEY_DOWN == 0); //等待松開(kāi)按?
if(local_date<=2)
{
local_date++;
if(local_date==3)
local_date=0;
}
}
delay(100); //延時(shí)判斷100MS檢測(cè)一次
}while(KEY_QIE!=0);
}
static void fun2()
{
u8 i = 0;
Lcd1602WriteCmd(0x01);
Ds1302WorkTest();
Lcd1602UpdateDisplay();
if(KEY_TIAO==0)
{
while(KEY_TIAO==0);
Ds1302WriteReg(0x8E, 0x00); // 禁用WP以獲取寫(xiě)時(shí)間寄存器的權(quán)限
slnum++;
switch(slnum)
{
case 1:Lcd1602WriteCmd(0x80+0x40+7);
break;
case 2:Lcd1602WriteCmd(0x80+0x40+4);
break;
case 3:Lcd1602WriteCmd(0x80+0x40+1);
break;
}
Lcd1602WriteCmd(0x0f);
if(slnum==4)
{
slnum=0;
Lcd1602WriteCmd(0x0c);
}
//Ds1302WriteReg(0x8E, 0x80); // 禁用WP以獲取寫(xiě)時(shí)間寄存器的權(quán)限
}
if(KEY_JIA==0)
{
while(KEY_JIA==0);
switch(slnum)
{
case 1: second++;
if(second==60) second=0;
Ds1302WriteReg(DS1302_WRITE_ADDR[0], SHIJIAN[second]);
break;
case 2: minute++;
if(minute==60) minute=0;
Ds1302WriteReg(DS1302_WRITE_ADDR[1], SHIJIAN[minute]);
break;
case 3: hour++;
if(hour==24) hour=0;
Ds1302WriteReg(DS1302_WRITE_ADDR[2], SHIJIAN[hour]);
break;
}
} delay(100);
}
void Uart_Init(void)
{
SCON=0x50; //UART方式1:8位UART; REN=1:允許接收
PCON=0x00; //SMOD=0:波特率不加倍
TMOD=0x20; //T1方式2,用于UART波特率
TH1=0xFD;
TL1=0xFD; //UART波特率設(shè)置:FDFD,9600;FFFF,57600
TR1=1; //允許T1計(jì)數(shù)
EA=1;
}
void Uart_Send_Byte(unsigned char c)//UART Send a byte
{
SBUF = c;
while(!TI); //發(fā)送完為1
TI = 0;
}
unsigned char Uart_Receive_Byte()//UART Receive a byteg
{
unsigned char dat;
while(!RI); //接收完為1
RI = 0;
dat = SBUF;
return (dat);
}
void FPM10A_Cmd_Send_Pack_Head(void)
{
int i;
for(i=0;i<6;i++) //包頭
{
Uart_Send_Byte(FPM10A_Pack_Head[i]);
}
}
//發(fā)送指令
void FPM10A_Cmd_Check(void)
{
int i=0;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<10;i++)
{
Uart_Send_Byte(FPM10A_Get_Device[i]);
}
}
//接收反饋數(shù)據(jù)緩沖
void FPM10A_Receive_Data(unsigned char ucLength)
{
unsigned char i;
for (i=0;i<ucLength;i++)
FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();
}
//FINGERPRINT_獲得指紋圖像命令
void FPM10A_Cmd_Get_Img(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<6;i++) //發(fā)送命令 0x1d
{
Uart_Send_Byte(FPM10A_Get_Img[i]);
}
}
//講圖像轉(zhuǎn)換成特征碼存放在Buffer1中
void FINGERPRINT_Cmd_Img_To_Buffer1(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<7;i++) //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
{
Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
}
}
//將圖像轉(zhuǎn)換成特征碼存放在Buffer2中
void FINGERPRINT_Cmd_Img_To_Buffer2(void)
{
unsigned char i;
for(i=0;i<6;i++) //發(fā)送包頭
{
Uart_Send_Byte(FPM10A_Pack_Head[i]);
}
for(i=0;i<7;i++) //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer2
{
Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
}
}
//搜索全部用戶(hù)999枚
void FPM10A_Cmd_Search_Finger(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<11;i++)
{
Uart_Send_Byte(FPM10A_Search[i]);
}
}
//將BUFFER1跟BUFFER2合成特征模版
void FPM10A_Cmd_Reg_Model(void)
{
unsigned char i;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<6;i++)
{
Uart_Send_Byte(FPM10A_Reg_Model[i]);
}
}
//刪除指紋模塊里的所有指紋模版
void FINGERPRINT_Cmd_Delete_All_Model(void)
{
unsigned char i;
for(i=0;i<6;i++) //包頭
Uart_Send_Byte(FPM10A_Pack_Head[i]);
for(i=0;i<6;i++) //命令合并指紋模版
{
Uart_Send_Byte(FPM10A_Delete_All_Model[i]);
}
}
//保存指紋
void FPM10A_Cmd_Save_Finger( unsigned int storeID )
{
unsigned long temp = 0;
unsigned char i;
FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8; //0x00,0x0B,0x00,0x19.
FPM10A_Save_Finger[6] = (storeID&0x00FF);
for(i=0;i<7;i++) //計(jì)算校驗(yàn)和
temp = temp + FPM10A_Save_Finger[i];
FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗(yàn)數(shù)據(jù)
FPM10A_Save_Finger[8]= temp & 0x0000FF;
FPM10A_Cmd_Send_Pack_Head(); //發(fā)送通信協(xié)議包頭
for(i=0;i<9;i++)
Uart_Send_Byte(FPM10A_Save_Finger[i]); //發(fā)送命令 將圖像轉(zhuǎn)換成 特征碼 存放在 CHAR_buffer1
}
//添加指紋
void FPM10A_Add_Fingerprint()
{
unsigned char id_show[]={0,0,0};
u16 finger_id;
Lcd1602WriteCmd(0x01); //清屏
finger_id=0;
while(1)
{
Lcd1602ShowStr(0,0," Add finger ");
Lcd1602ShowStr(0,1," ID: ");
//按返回鍵直接回到主菜單
if(KEY_CANCEL == 0)
{
while(KEY_CANCEL==0);
break;
}
//按切換鍵指紋iD值加1
if(KEY_DOWN == 0)
{
while(KEY_DOWN==0);
if(finger_id == 1000)
{
finger_id = 0;
}
else
finger_id = finger_id + 1;
}
//指紋iD值顯示處理
Lcd1602WriteCmd(0xc0+10);
Lcd1602WriteData(finger_id/100+48);
Lcd1602WriteData(finger_id%100/10+48);
Lcd1602WriteData(finger_id%100%10+48);
//按確認(rèn)鍵開(kāi)始錄入指紋信息
if(KEY_OK == 0)
{
while(KEY_OK==0);
Lcd1602ShowStr(0,0," Please finger ");
//LCD1602_Display(0x80," Please finger ",0,16);
//LCD1602_Display(0xc0," ",0,16);
Lcd1602ShowStr(0,1," ");
//while(KEY_CANCEL == 1)
while(KEY_CANCEL == 1)
{
//按下返回鍵退出錄入返回fingerID調(diào)整狀態(tài)
if(KEY_CANCEL == 0)
{
while(KEY_CANCEL==0);
break;
}
FPM10A_Cmd_Get_Img(); //獲得指紋圖像
FPM10A_Receive_Data(12);
//判斷接收到的確認(rèn)碼,等于0指紋獲取成功
if(FPM10A_RECEICE_BUFFER[9]==0)
{
//Delay_Ms(100);
delay(100);
FINGERPRINT_Cmd_Img_To_Buffer1();
FPM10A_Receive_Data(12);
Lcd1602ShowStr(0,0,"Successful entry");
//LCD1602_Display(0x80,"Successful entry",0,16);
Buzz_Times(1);
delay(1000);
Lcd1602ShowStr(0,0," Please finger ");
Lcd1602ShowStr(0,1," ");
//LCD1602_Display(0x80," Please finger ",0,16);
//LCD1602_Display(0xc0," ",0,16);
while(1)
{
if(KEY_CANCEL == 0)
{
while(KEY_CANCEL==0);
break;
}
FPM10A_Cmd_Get_Img(); //獲得指紋圖像
FPM10A_Receive_Data(12);
//判斷接收到的確認(rèn)碼,等于0指紋獲取成功
if(FPM10A_RECEICE_BUFFER[9]==0)
{
delay(200);
Lcd1602ShowStr(0,0,"Successful entry");
Lcd1602ShowStr(0,1," ID is ");
//LCD1602_Display(0x80,"Successful entry",0,16);
//LCD1602_Display(0xc0," ID is ",0,16);
//指紋iD值顯示處理
Lcd1602WriteCmd(0xc0+10);
Lcd1602WriteData(finger_id/100+48);
Lcd1602WriteData(finger_id%100/10+48);
Lcd1602WriteData(finger_id%100%10+48);
FINGERPRINT_Cmd_Img_To_Buffer2();
FPM10A_Receive_Data(12);
FPM10A_Cmd_Reg_Model();//轉(zhuǎn)換成特征碼
FPM10A_Receive_Data(12);
FPM10A_Cmd_Save_Finger(finger_id);
FPM10A_Receive_Data(12);
Buzz_Times(1);
delay(1000);
finger_id=finger_id+1;
break;
}
}
break;
}
}
// ClrScreen(); //清空顯示屏
}
// Delay_Ms(500);
}
}
//搜索指紋
void FPM10A_Find_Fingerprint()
{
unsigned int find_fingerid = 0;
unsigned char id_show[]={0,0,0};
do
{
Lcd1602ShowStr(0,0," Please finger ");
Lcd1602ShowStr(0,1," ");
//LCD1602_Display(0x80," Please finger ",0,16);
//LCD1602_Display(0xc0," ",0,16);
FPM10A_Cmd_Get_Img(); //獲得指紋圖像
FPM10A_Receive_Data(12);
//判斷接收到的確認(rèn)碼,等于0指紋獲取成功
if(FPM10A_RECEICE_BUFFER[9]==0)
{
delay(100);
FINGERPRINT_Cmd_Img_To_Buffer1();
FPM10A_Receive_Data(12);
FPM10A_Cmd_Search_Finger();
FPM10A_Receive_Data(16);
if(FPM10A_RECEICE_BUFFER[9] == 0) //搜索到
{
Lcd1602ShowStr(0,0," Search success ");
Lcd1602ShowStr(0,1," ID is ");
//LCD1602_Display(0x80," Search success ",0,16);
//LCD1602_Display(0xc0," ID is ",0,16);
Buzz_Times(1);
//拼接指紋ID數(shù)
find_fingerid = FPM10A_RECEICE_BUFFER[10]*256 + FPM10A_RECEICE_BUFFER[11];
//指紋iD值顯示處理
Lcd1602WriteCmd(0xc0+10);
Lcd1602WriteData(find_fingerid/100+48);
Lcd1602WriteData(find_fingerid%100/10+48);
Lcd1602WriteData(find_fingerid%100%10+48);
//LCD1602_WriteCMD(0xc0+10);
//LCD1602_WriteDAT(find_fingerid/100+48);
//LCD1602_WriteDAT(find_fingerid%100/10+48);
//LCD1602_WriteDAT(find_fingerid%100%10+48);
delay(2000);
}
else //沒(méi)有找到
{
//LCD1602_Display(0x80," Search failed ",0,16);
//LCD1602_Display(0xc0," ",0,16);
Lcd1602ShowStr(0,0," Search failed ");
Lcd1602ShowStr(0,1," ");
Buzz_Times(3);
}
}
}while(KEY_CANCEL == 1);
}
//刪除所有存貯的指紋庫(kù)
void FPM10A_Delete_All_Fingerprint()
{
unsigned char i=0;
//LCD1602_Display(0x80," empty all ",0,16);
//LCD1602_Display(0xc0," Yes or no ? ",0,16);
Lcd1602ShowStr(0,0," empty all ");
Lcd1602ShowStr(0,1," Yes or no ? ");
do
{if(KEY_OK==0)
{
while(KEY_OK==0);
//LCD1602_Display(0x80," emptying ",0,16);
//LCD1602_Display(0xc0," ",0,16);
Lcd1602ShowStr(0,0," emptying ");
Lcd1602ShowStr(0,1," ");
delay(300);
Lcd1602WriteCmd(0xc0);
for(i=0;i<16;i++)
{
Lcd1602WriteData(42);
delay(100);
}
FINGERPRINT_Cmd_Delete_All_Model();
FPM10A_Receive_Data(12);
// LCD1602_Display(0x80," All empty ",0,16);
// LCD1602_Display(0xc0," ",0,16);
Lcd1602ShowStr(0,0," All empty ");
Lcd1602ShowStr(0,1," ");
Buzz_Times(3);
break;
}
}while(KEY_CANCEL==1);
}
void Device_Check(void)
{
unsigned char i=0;
FPM10A_RECEICE_BUFFER[9]=1; //串口數(shù)組第九位可判斷是否通信正常
Lcd1602ShowStr(0,1,"Loading "); //LCD1602_Display(0xc0,"Loading",0,7); //設(shè)備加載中界面
for(i=0;i<8;i++) //進(jìn)度條式更新,看起來(lái)美觀
{
Lcd1602WriteData(42); //42對(duì)應(yīng)ASIC碼的 *
delay(200); //控制進(jìn)度條速度
}
Lcd1602ShowStr(0,1,"failure "); //LCD1602_Display(0xc0,"Docking failure",0,16); //液晶先顯示對(duì)接失敗,如果指紋模塊插對(duì)的話(huà)會(huì)將其覆蓋
FPM10A_Cmd_Check(); //單片機(jī)向指紋模塊發(fā)送校對(duì)命令
FPM10A_Receive_Data(12); //將串口接收到的數(shù)據(jù)轉(zhuǎn)存
if(FPM10A_RECEICE_BUFFER[9]==0) //判斷數(shù)據(jù)低第9位是否接收到0
{
Lcd1602ShowStr(0,1,"success "); //LCD1602_Display(0xc0,"Docking success",0,16); //符合成功條件則顯示對(duì)接成功
}
}
void Buzz_Times(unsigned char times)
{
unsigned char i=0;
for(i=0;i<times;i++)
{
buzz=0;
delay(1);
buzz=1;
delay(1);
}
}
復(fù)制代碼
作者:
劉查理
時(shí)間:
2018-5-11 17:28
你這個(gè)問(wèn)題問(wèn)的讓人難以回答,能說(shuō)具體點(diǎn)嗎?你這個(gè)模塊我之前用過(guò),我看你程序里波特率設(shè)置是9600。這個(gè)指紋模塊波特率默認(rèn)是57600,如果你沒(méi)改過(guò)設(shè)置的話(huà)那就是你串口波特率沒(méi)設(shè)置對(duì)。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1