- #include<reg52.h>
- #include <intrins.h>
- #include <string.h>
- //#include<SHIJIAN.H>
- typedef unsigned char u8; // 重命名類型u8簡化代碼編寫
- typedef unsigned int u16;
- #define LCD1602_DATA_PORT P0
- #define KEY_PORT P1 // 矩陣按鍵接在P1端口
- //#define DDD P2
- sbit DSIO = P3^4; // DS1302的SPI接口IO線,輸入輸出都走這里
- sbit CE = P3^5; // chip enable,讀寫ds1302前要使能,讀寫完要禁止
- sbit SCLK = P3^6; // serial clock,串行時鐘線
- 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};//口令驗證
- code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //協議包頭
- 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 }; //獲得模版總數
- 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號指紋
- 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]; // 用來存儲DS1302中7個時間的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) //忙檢測函數,判斷bit7是0,允許執行;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; //使能,用完就拉低,釋放總線
- }while(sta & 0x80);
- }
- static void Lcd1602WriteCmd(u8 cmd)
- {
- Lcd1602WaitNoBusy(); // 先等待LCD1602處于不忙狀態
- gLcd1602_E = 0; // 禁止LCD
- gLcd1602_RS = 0; // 選擇發送命令模式
- gLcd1602_RW = 0; // 選擇寫入模式
- LCD1602_DATA_PORT = cmd; // 將1字節命令字放入8位并行數據端口
- gLcd1602_E = 1; // 使能LED
- gLcd1602_E = 0; // 禁止LCD
- }
- static void Lcd1602WriteData(u8 dat)
- {
- Lcd1602WaitNoBusy(); // 先等待LCD1602處于不忙狀態
- gLcd1602_E = 0; // 禁止LCD
- gLcd1602_RS = 1; // 選擇發送數據模式
- gLcd1602_RW = 0; // 選擇寫入模式
- LCD1602_DATA_PORT = dat; // 將1字節命令字放入8位并行數據端口
- gLcd1602_E = 1; // 使能LED
- gLcd1602_E = 0; // 禁止LCD
- }
- void Lcd1602Init(void)
- {
- Lcd1602WriteCmd(0x38); // 按照數據手冊的初始化時序,先發送38H
- delay(5); // 延時5ms
- Lcd1602WriteCmd(0x38); // 按照數據手冊的初始化時序,先發送38H
- delay(5); // 延時5ms
- Lcd1602WriteCmd(0x38); // 按照數據手冊的初始化時序,先發送38H
- delay(5); // 延時5ms
- Lcd1602WriteCmd(0x38); // 顯示模式設置
- Lcd1602WriteCmd(0x08); // 關閉顯示
- Lcd1602WriteCmd(0x01); // 清屏(同時清數據指針)
- Lcd1602WriteCmd(0x06); // 讀寫后指針自動加1,寫1個字符后整屏顯示不移動
- Lcd1602WriteCmd(0x0c); // 開顯示,不顯示光標
- }
- void Lcd1602SetCursor(u8 x, u8 y) // 坐標顯示
- {
- 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); //當前字符的坐標
- while (*pStr != '\0')
- {
- Lcd1602WriteData(*pStr++);
- }
- }
- void Lcd1602DispBufInit(void)
- {
- strcpy(gDispBuf0,"00:00:00 ");
- //gDispBuf0[14] = 0xdf; // 顯示攝氏度的小圓圈
- //gDispBuf0[15] = 'C'; // 顯示攝氏度的大寫C
- //gDispBuf0[16] = '\0'; // 字符串結尾
- //strcpy(gDispBuf1, "00 00 00EEOK-00H");
- }
- void Lcd1602UpdateDisplay(void)
- {
- Lcd1602ShowStr(0, 0,"menjingxitong ");
- Lcd1602ShowStr(0, 1, gDispBuf0);
- }
- /*void write_hms(u8 add,u8 dat) //時分秒寫函數,add:輸入位置設置變量 dat:輸入時分秒數據
- {
- u8 sw,gw; //定義十位個位變量
- sw=dat/10;
- gw=dat%10;
- Lcd1602WriteCmd(0x80+0x40+add);//從第二行(add)位開始寫數據
- Lcd1602WriteData(0x30+sw); //寫入十位
- Lcd1602WriteData(0x30+gw); //寫入個位
- } */
- static void Ds1302WriteReg(u8 addr, u8 dat)
- {
- u8 i = 0;
- CE = 0;
- _nop_(); // 空指令,延時
- SCLK = 0; // 先將SCLK置低電平
- _nop_();
- CE = 1; // CE拉高以使能對DS1302的讀寫權限
- _nop_();
- for (i=0; i<8; i++) // 循環逐位發送addr的8個bit,注意低位在前
- {
- DSIO = addr & 0x01; // 數據從LSB低位開始傳送
- addr >>= 1; // 發完后addr右移一位原來的次低位變成新的低位
- SCLK = 1; // 拉高SCLK制造一個上升沿,通知DS1302讀取數據
- _nop_(); // 延時等待DS1302讀取DSIO線上的1位數據
- SCLK = 0; // 讀完后,拉低SCLK為下一個位的傳輸做準備
- _nop_();
- }
- // 循環結束后1字節的寄存器地址傳給DS1302
- for (i=0; i<8; i++) // 循環寫入8位數據,注意低位在前
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1; //制造上升沿通知DS1302讀取數據
- _nop_();
- SCLK = 0;
- _nop_();
- } // 循環結束后1字節值成功傳給DS1302
-
- CE = 0; // 寫入完畢拉低CE以禁止對DS1302的讀寫,防止意外改寫事故
- _nop_();
- }
- /*********************************************************************
- * 函 數 名 : Ds1302ReadReg
- * 函數功能 : 向DS1302中地址為addr的寄存器寫入數值dat
- * 參數列表 : addr - 待讀出的寄存器的地址
- * 函數輸出 : 讀出的寄存器addr的數值
- *********************************************************************/
- static u8 Ds1302ReadReg(u8 addr)
- {
- u8 i = 0, dat = 0, dat1 = 0;
- CE = 0; // CE設置為初始狀態
- _nop_();
- SCLK = 0; // SCLK設置為初始狀態
- _nop_();
- CE = 1; // 拉高CE使能對DS1302的寄存器讀寫權限
- _nop_();
- for (i=0; i<8; i++) // 循環發送8bit寄存器地址值
- {
- DSIO = addr & 0x01; // DS1302的SPI接口從LSB開始發送
- addr >>= 1;
- SCLK = 1; // 制造上升沿,DS1302在上升沿完成讀取動作
- _nop_();
- SCLK = 0; // 拉低SCLK為下個bit發送做準備
- _nop_();
- }
-
- for (i=0; i<8; i++) // 循環讀取8bit寄存器值數據
- {
- dat1 = DSIO;//從最低位開始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿時,放置數據
- _nop_();
- }
- CE = 0;
- _nop_(); //以下為DS1302復位的穩定時間,必須的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- /*********************************************************************
- * 函 數 名 : Ds1302WriteTime
- * 函數功能 : 將全局變量gTime中的時間寫入DS1302中以重置DS1302時間
- * 參數列表 : 無
- * 函數輸出 : 無
- *********************************************************************/
- static void Ds1302WriteTime(void)
- {
- u8 i = 0;
- Ds1302WriteReg(0x8E, 0x00); // 禁用WP以獲取寫時間寄存器的權限
- for (i=0; i<7; i++) // 依次寫入7個時間,順序依次:秒分時日月周年
- {
- Ds1302WriteReg(DS1302_WRITE_ADDR[i], gTime[i]);
- }
- Ds1302WriteReg(0x8E, 0x80); // 使能WP以禁止對時間寄存器的讀寫,防止意外改寫事故
- }
- /*********************************************************************
- * 函 數 名 : Ds1302InitTime
- * 函數功能 : 以給定的初始時間來重置DS1302時間值
- * 參數列表 : 無
- * 函數輸出 : 無
- *********************************************************************/
- void Ds1302InitTime(void)
- {
- // 先給個初始化時間
- gTime[0] = 0x50; // 初始化時間,秒,注意是BCD碼不是10進制也不是16進制
- gTime[1] = 0x59; // 初始化時間,分,注意是BCD碼不是10進制也不是16進制
- gTime[2] = 0x23; // 初始化時間,時,注意是BCD碼不是10進制也不是16進制
-
-
- //gTime[3] = 0x23; // 初始化時間,日,注意是BCD碼不是10進制也不是16進制
- //gTime[4] = 0x10; // 初始化時間,月,注意是BCD碼不是10進制也不是16進制
- //gTime[5] = 0x01; // 初始化時間,周,注意是BCD碼不是10進制也不是16進制
- //gTime[6] = 0x17; // 初始化時間,年,注意是BCD碼不是10進制也不是16進制,以2000為基數
- // 將給定時間寫入DS1302內部時間寄存器以完成初始化
- Ds1302WriteTime();
- }
- /*********************************************************************
- * 函 數 名 : Ds1302ReadTime
- * 函數功能 : 讀出DS1302內部時間放入全局變量gTime中
- * 參數列表 : 無
- * 函數輸出 : 無
- *********************************************************************/
- void Ds1302ReadTime(void)
- {
- u8 i = 0;
- for (i=0; i<7; i++)//讀取7個字節的時鐘信號:秒分時日月周年
- {
- gTime[i] = Ds1302ReadReg(DS1302_READ_ADDR[i]);
- // gTime[i] = 0x23;
- }
- }
- /*********************************************************************
- * 函 數 名 : Ds1302ReadTime
- * 函數功能 : 讀出DS1302內部時間放入全局變量gTime中
- * 參數列表 : 無
- * 函數輸出 : 無
- *********************************************************************/
- void Ds1302WorkTest(void)
- {
- // 第1步:從DS1302讀取時間存入gTime中
- Ds1302ReadTime();
- // 第2步:將gTime中的時間值格式化為字符串存入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'沒有被顯示
- Lcd1602ShowStr(0, 0, "men jin xi tong ");
- // 下面1行給16個字符,剛好完美顯示
- Lcd1602ShowStr(0, 1, "welcome ");
- // 最后別忘了打結,不然程序會反復執行,反復刷屏,看到的現象是
- // 屏幕顯示抖動。
- //Lcd1602WriteCmd(0x01);
- Uart_Init();
- delay(200);
- Ds1302InitTime();
- Lcd1602DispBufInit();
- gLcd1602_RW=0;
- Device_Check(); //校對指紋模塊是否接入正確,液晶做出相應的提示
- 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: // 時間
- 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, "*");
- }
- //確認鍵
- if(KEY_OK==0)
- {
- while(KEY_OK==0);//等待松開按鍵
- 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); //等待松開按?
- if(local_date<=2)
- {
- local_date++;
- if(local_date==3)
- local_date=0;
- }
- }
- delay(100); //延時判斷100MS檢測一次
- }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以獲取寫時間寄存器的權限
- 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以獲取寫時間寄存器的權限
- }
- 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波特率設置:FDFD,9600;FFFF,57600
- TR1=1; //允許T1計數
- EA=1;
- }
- void Uart_Send_Byte(unsigned char c)//UART Send a byte
- {
- SBUF = c;
- while(!TI); //發送完為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]);
- }
- }
- //發送指令
- void FPM10A_Cmd_Check(void)
- {
- int i=0;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- for(i=0;i<10;i++)
- {
- Uart_Send_Byte(FPM10A_Get_Device[i]);
- }
- }
- //接收反饋數據緩沖
- 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(); //發送通信協議包頭
- for(i=0;i<6;i++) //發送命令 0x1d
- {
- Uart_Send_Byte(FPM10A_Get_Img[i]);
- }
- }
- //講圖像轉換成特征碼存放在Buffer1中
- void FINGERPRINT_Cmd_Img_To_Buffer1(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- for(i=0;i<7;i++) //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
- }
- }
- //將圖像轉換成特征碼存放在Buffer2中
- void FINGERPRINT_Cmd_Img_To_Buffer2(void)
- {
- unsigned char i;
- for(i=0;i<6;i++) //發送包頭
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- for(i=0;i<7;i++) //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer2
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
- }
- }
- //搜索全部用戶999枚
- void FPM10A_Cmd_Search_Finger(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- 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(); //發送通信協議包頭
- 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++) //計算校驗和
- temp = temp + FPM10A_Save_Finger[i];
- FPM10A_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗數據
- FPM10A_Save_Finger[8]= temp & 0x0000FF;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- for(i=0;i<9;i++)
- Uart_Send_Byte(FPM10A_Save_Finger[i]); //發送命令 將圖像轉換成 特征碼 存放在 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);
- //按確認鍵開始錄入指紋信息
- 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調整狀態
- if(KEY_CANCEL == 0)
- {
- while(KEY_CANCEL==0);
- break;
- }
- FPM10A_Cmd_Get_Img(); //獲得指紋圖像
- FPM10A_Receive_Data(12);
- //判斷接收到的確認碼,等于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);
- //判斷接收到的確認碼,等于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();//轉換成特征碼
- 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);
- //判斷接收到的確認碼,等于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數
- 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 //沒有找到
- {
- //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);
- }
- //刪除所有存貯的指紋庫
- 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; //串口數組第九位可判斷是否通信正常
- Lcd1602ShowStr(0,1,"Loading "); //LCD1602_Display(0xc0,"Loading",0,7); //設備加載中界面
- for(i=0;i<8;i++) //進度條式更新,看起來美觀
- {
- Lcd1602WriteData(42); //42對應ASIC碼的 *
- delay(200); //控制進度條速度
- }
- Lcd1602ShowStr(0,1,"failure "); //LCD1602_Display(0xc0,"Docking failure",0,16); //液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋
- FPM10A_Cmd_Check(); //單片機向指紋模塊發送校對命令
- FPM10A_Receive_Data(12); //將串口接收到的數據轉存
- if(FPM10A_RECEICE_BUFFER[9]==0) //判斷數據低第9位是否接收到0
- {
- Lcd1602ShowStr(0,1,"success "); //LCD1602_Display(0xc0,"Docking success",0,16); //符合成功條件則顯示對接成功
- }
- }
- void Buzz_Times(unsigned char times)
- {
- unsigned char i=0;
- for(i=0;i<times;i++)
- {
- buzz=0;
- delay(1);
- buzz=1;
- delay(1);
- }
- }
復制代碼 |