輸入模塊:AS608,矩陣鍵盤
處理器:STC90C52
輸出設備:LCD12864,電磁鎖,繼電器
總流程:當AS608探測到有手指接觸時,判斷是否符合已儲存的指紋數據,符合輸出電平開鎖,否則12864顯示錯誤。或者當輸入數字密碼相符合也可開鎖,內部存有開鎖密碼,和管理員密碼(設置指紋庫和開門密碼),密碼和指紋ID號存儲在EEPROM中防止掉電丟失。
制作出來的實物圖如下:
P80413-164021.jpg (7.41 MB, 下載次數: 156)
下載附件
背面
2018-11-25 20:59 上傳
P80413-163154.jpg (6.74 MB, 下載次數: 140)
下載附件
正面
2018-11-25 20:58 上傳
1527504485772.jpg (6.21 MB, 下載次數: 155)
下載附件
52單片機最小系統
2018-11-25 20:58 上傳
1527504448671.jpg (3.04 MB, 下載次數: 148)
下載附件
電磁鎖
2018-11-25 20:58 上傳
1527504401556.jpg (6.92 MB, 下載次數: 135)
下載附件
LCD12864
2018-11-25 20:58 上傳
1527504349181.jpg (4.34 MB, 下載次數: 151)
下載附件
AS608
2018-11-25 20:57 上傳
1527504284455.jpg (8.2 MB, 下載次數: 138)
下載附件
矩陣鍵盤
2018-11-25 20:57 上傳
單片機程序源碼:
- #include <reg51.h>
- #include <intrins.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define jzaj P1
- uchar x,Administrators,out=0,k=0,h,b,reset1=0;
- uchar password[6]={1,2,3,4,5,6};
- uchar password1[6];
- uchar password2[6]={1,2,3,4,5,6};
- uchar adminpassword[6]={6,6,6,6,6,6};
- uchar adminpassword1[6];
- uchar adminpassword2[6]={6,6,6,6,6,6};
- sbit kai=P0^5;
- sbit kai1=P0^6;
- sbit kai2=P0^7;
- uchar code DIS1[] = {" 歡迎使用 "}; //一個漢字占用兩個字符空間,故漢字只能占用偶數地址
- uchar code DIS2[] = {" 云部落指紋鎖 "};
- uchar code DIS3[] = {" 密碼吻合 "};
- uchar code DIS14[] = {" 密碼錯誤 "};
- uchar code DIS4[] = {"已識別 ID: "};
- uchar code DIS5[] = {" 沒有找到 "};
- uchar code DIS6[] = {"請輸入管理員密碼"};
- uchar code DIS7[] = {"1.添加指紋 "};
- uchar code DIS8[] = {"2.清空指紋 "};
- uchar code DIS9[] = {"3.開鎖密碼 "};
- uchar code DIS10[] = {"4.管理密碼 "};
- uchar code DIS11[] = {" 請輸入指紋 "};
- uchar code DIS12[] = {" 請再次輸入指紋"};
- uchar code DIS13[] = {"添加成功ID: "};
- uchar code DIS15[] = {" 清空成功 "};
- uchar code DIS16[] = {" 清空失敗 "};
- uchar code DIS17[] = {" 確認清空? "};
- uchar code DIS18[] = {" 請輸入新密碼 "};
- uchar code DIS19[] = {" 確認修改? "};
- uchar code DIS20[] = {" 修改成功 "};
- uchar code DIS21[] = {" 復位成功 "};
- /************* 12864LCD引腳定義 *************/
- #define LCD_data P2 //數據口
- sbit LCD_RS = P0^0; //寄存器選擇輸入
- sbit LCD_RW = P0^1; //液晶讀/寫控制
- sbit LCD_EN = P0^2; //液晶使能控制
- sbit LCD_PSB = P0^3; //串/并方式控制
- sbit LCD_RST = P0^4; //液晶復位端口
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- void delay(int ms)
- {
- while(ms--)
- {
- uchar i;
- for(i=0;i<150;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*******************************************************************/
- /* */
- /*檢查LCD忙狀態 */
- /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(LCD_data&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*寫指令數據到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /*******************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- LCD_data = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數據到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- LCD_data = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化設定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
-
- LCD_RST = 0; //液晶復位
- delay(3);
- LCD_RST = 1;
- delay(3);
-
- lcd_wcmd(0x34); //擴充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //顯示開,關光標
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delay(5);
- }
- /*********************************************************/
- /* */
- /* 設定顯示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if (X==1)
- {X=0x80;}
- else if (X==2)
- {X=0x90;}
- else if (X==3)
- {X=0x88;}
- else if (X==4)
- {X=0x98;}
- pos = X+Y ;
-
- lcd_wcmd(pos); //顯示地址
- }
- /*********************************************************
- * *
- * 清屏函數 *
- * *
- *********************************************************/
- void clr_screen()
- {
- lcd_wcmd(0x34); //擴充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x01); //清屏
- delay(5);
- }
- //////////////////////////////////////////////////////////////////////////
- void kaisuo();
- //////////////////////////////////////////////////////////////////////////
- sfr ISP_DATA = 0xe2;
- sfr ISP_ADDRH = 0xe3;
- sfr ISP_ADDRL = 0xe4;
- sfr ISP_CMD = 0xe5;
- sfr ISP_TRIG = 0xe6;
- sfr ISP_CONTR = 0xe7;
- void cc(uint addr);
- void xcx(uint addr,uchar dat);
- uchar dcx(uint addr);
- void Q0();
- /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:擦除某一扇區(每個扇區 512 字節)
- 入口: addr = 某一扇區首地址
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
- void cc(uint addr)
- {
- // 打開 IAP 功能 (ISP_CONTR.7)=1: 允許編程改變 Flash, 設置 Flash 操作等待時間
- // 0x83( 晶振 <5M) 0x82(晶振 <10M) 0x81(晶振 <20M) 0x80(晶振 <40M)
- ISP_CONTR = 0x81;
- ISP_CMD = 0x03; // 用戶可以對 "Data Flash/EEPROM區"進行扇區擦除
- ISP_ADDRL = addr; // ISP/IAP 操作時的地址寄存器低八位,
- ISP_ADDRH = addr>>8; // ISP/IAP 操作時的地址寄存器高八位。
- EA =0;
- ISP_TRIG = 0x46; // 在 ISPEN(ISP_CONTR.7)=1 時,對 ISP_TRIG先寫入 46h,
- ISP_TRIG = 0xB9; // 再寫入 B9h,ISP/IAP命令才會生效。
- _nop_();
- Q0(); // 關閉 ISP/IAP
- }
- /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:寫一字節
- 入口: addr = 扇區單元地址 , dat = 待寫入數據
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
- void xcx(uint addr,uchar dat)
- {
- ISP_CONTR = 0x81;
- ISP_CMD = 0x02; // 用戶可以對 "Data Flash/EEPROM區"進行字節編程
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- ISP_DATA = dat; // 數據進 ISP_DATA
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- Q0(); // 關閉 ISP/IAP
- }
- /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:讀一字節
- 入口: addr = 扇區單元地址
- 出口: dat = 讀出的數據
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
- uchar dcx(uint addr)
- {
- uchar dat;
- ISP_CONTR = 0x81;
- ISP_CMD = 0x01; // 用戶可以對 "Data Flash/EEPROM區 "進行字節讀
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- dat = ISP_DATA; // 取出數據
- Q0(); // 關閉 ISP/IAP
- return dat;
- }
- /* ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:關閉 ISP/IAP操作
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ */
- void Q0()
- {
- ISP_CONTR = 0; // 關閉 IAP功能
- ISP_CMD = 0; // 待機模式,無 ISP操作
- ISP_TRIG = 0; // 關閉 IAP功能 , 清與 ISP有關的特殊功能寄存器
- }
- void wolegequ()
- {
- uchar i;
- cc(0x2200); // 擦除第 2 個扇區
- for(i=0;i<6;i++)
- {
- xcx(0x2200+i,password2[i]); // 對 EEPROM區 2200h 寫入
- }
- cc(0x2400); // 擦除第 2 個扇區
- for(i=0;i<6;i++)
- {
- xcx(0x2400+i,adminpassword2[i]); // 對 EEPROM區 2200h 寫入
- }
- EA=1;
- }
- //////////////////////////////////////////////////////////////////////////
- volatile unsigned char FPM10A_RECEICE_BUFFER[32];
- unsigned int finger_id=0 ;
- 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_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_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
- 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中的特征碼存放到指定的位置
- //發送包頭
- 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_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_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer2[i]);
- }
- }
- 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]);
- }
- }
- //搜索全部用戶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]);
- }
- }
- //保存指紋
- void FPM10A_Cmd_Save_Finger( unsigned int storeID )
- {
- unsigned long temp = 0;
- unsigned char i;
- FPM10A_Save_Finger[5] =(storeID&0xFF00)>>8;
- 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 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_Find_Fingerprint()
- {
- unsigned int find_fingerid = 0,i;
- unsigned char id_show[3];
-
-
- FPM10A_Cmd_Get_Img(); //獲得指紋圖像命令
- FPM10A_Receive_Data(12); //接收反饋數據緩沖
- if(FPM10A_RECEICE_BUFFER[9]==0) //根據反饋回來的第9位數據來判斷模塊上有無指紋,有則繼續執行無則退出
- {
- FINGERPRINT_Cmd_Img_To_Buffer1(); //講圖像轉換成特征碼存放在Buffer1中
- FPM10A_Receive_Data(12);
- FPM10A_Cmd_Search_Finger(); //搜索全部用戶999枚
- FPM10A_Receive_Data(16);
- if(FPM10A_RECEICE_BUFFER[9] == 0) //搜索到
- {
- clr_screen();
- lcd_pos(2,0); //設置顯示“已識別”
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS4[i]);
-
- }
- find_fingerid = FPM10A_RECEICE_BUFFER[10]*256 + FPM10A_RECEICE_BUFFER[11];
- id_show[0]=find_fingerid/100+0x30;
- id_show[1]=find_fingerid%100/10+0x30;
- id_show[2]=find_fingerid%100%10+0x30;
- lcd_pos(2,13); //設置顯示ID號
- for(i=0;i<3;i++)
- {
- lcd_wdat(id_show[i]);
- }
- delay(1000);
- kaisuo();
- }
- else
- { clr_screen();
- lcd_pos(2,0); //設置顯示“沒有找到”
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS5[i]);
- }
- delay(1000);
- }
- clr_screen();
- }
- }
- void HSjzaj(); ///////////////////////////聲明函數以便調用
- //刪除所有存貯的指紋庫
- void FPM10A_Delete_All_Fingerprint()
- {
- char i;
- clr_screen();
- lcd_pos(1,0); //
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS17[i]);
- }
- delay(1000);
- x=0;
- HSjzaj();
- if(x==1)
- {
- FINGERPRINT_Cmd_Delete_All_Model();
- FPM10A_Receive_Data(12);
- if(FPM10A_RECEICE_BUFFER[9]==0)
- {
- lcd_pos(2,0); //設置顯示位置為第一行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS15[i]);
- }
- delay(1000);
- finger_id=0;
- cc(0x2000); // 擦除第 1 個扇區( 2000h~21FFh)
- xcx(0x2002,finger_id); // 對 EEPROM區 2002h 寫入
- EA=1;
- }
- else
- {
- lcd_pos(2,0); //設置顯示位置為第一行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS16[i]);
-
- }
- delay(1000);
- }
- }
- clr_screen();
- }
- //添加指紋
- void FPM10A_Add_Fingerprint()
- {
- uchar i;
- volatile unsigned char id_show[3];
- clr_screen();
- lcd_pos(1,0); //設置顯示位置為第一行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS11[i]);
- }
- delay(2000);
- FPM10A_Cmd_Get_Img(); //獲得指紋圖像
- FPM10A_Receive_Data(12);
- if(FPM10A_RECEICE_BUFFER[9]==0)
- {
- FINGERPRINT_Cmd_Img_To_Buffer1();
- FPM10A_Receive_Data(12);
- lcd_pos(2,0); //設置顯示位置為第一行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS12[i]);
- }
- delay(2000);
- FPM10A_Cmd_Get_Img(); //獲得指紋圖像
- FPM10A_Receive_Data(12);
- if(FPM10A_RECEICE_BUFFER[9]==0)
- {
- FINGERPRINT_Cmd_Img_To_Buffer2();
- FPM10A_Receive_Data(12);
- FPM10A_Cmd_Reg_Model();//轉換成特征碼
- FPM10A_Receive_Data(12);
- id_show[0]=finger_id/100+0x30; //加0x30,轉換成字符串
- id_show[1]=finger_id%100/10+0x30;
- id_show[2]=finger_id%100%10+0x30;
- clr_screen();
- lcd_pos(1,0); //設置顯示位置為第一行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS13[i]);
- delay(0);
- }
- lcd_pos(3,12); //設置顯示位置為第一行
- for(i=0;i<3;i++)
- {
- lcd_wdat(id_show[i]);
- }
- delay(1000);
- FPM10A_Cmd_Save_Finger(finger_id++);
- cc(0x2000); // 擦除第 1 個扇區( 2000h~21FFh)
- xcx(0x2002,finger_id); // 對 EEPROM區 2002h 寫入
- EA=1;
- FPM10A_Receive_Data(12);
- }
- }
- }
- //確認指令
- void confirm()
- {
- uchar i,p=0;
- clr_screen();
- for(i=0;i<6;i++)
- {
- if(password1[i]==password[i])
- {
- delay(0);
- }
- else
- {
- p=1;
- }
- }
- if(p==0)
- {
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS3[i]); //密碼正確
- }
- delay(1000);
- kaisuo();
- }
- else
- {
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS14[i]); //密碼錯誤
- }
- delay(1000);
- }
- for(i=0;i<6;i++)
- {
- password1[i]=0; //將密碼1寄存器置零
- }
- clr_screen();
- }
- //矩陣鍵盤
- void HSjzaj()
- {
- uchar c=10; ///
- jzaj=0x0f;
- if(jzaj!=0x0f)
- {
- delay(50);
- if(jzaj!=0x0f)
- {
- switch(jzaj)
- {
- case (0x07): b=0;break;
- case (0x0b): b=1;break;
- case (0x0d): b=2;break;
- case (0x0e): b=3;break;
- }
- jzaj=0xf0;
- switch(jzaj)
- {
- case (0xe0): b=b+0;break;
- case (0xd0): b=b+4;break;
- case (0xb0): b=b+8;break;
- case (0x70): b=b+12;break;
- }
- switch(b)
- {
- case (0): c=1;break;
- case (1): c=2;break;
- case (2): c=3;break;
- case (3): Administrators=1;break;
- case (4): c=4;break;
- case (5): c=5;break;
- case (6): c=6;break;
- case (7): out=1;break;
- case (8): c=7;break;
- case (9): c=8;break;
- case (10): c=9;break;
- case (11): reset1=1;break;
- case (12): c='*';break;
- case (13): c=0;break;
- case (14): c='#';break;
- case (15): x=1;break; //確認
- }
- if((0<=c&&c<=9)||c=='*'||c=='#') //只有C為0~9或#,*方可進入
- {
- if(h==0)
- {
- password1[k]=c;
- }
- else
- {
- adminpassword1[k]=c;
- }
- lcd_pos(4,k); //云部落指紋鎖
- lcd_wdat('*');
- delay(0);
- k++;
- if(k==7)
- {
- k=0;
- clr_screen(); //顯示6個*后清屏
- }
- }
- }
- }
- delay(50);
- }
- //修改管理員密碼
- void HSadminpassword()
- {
- uchar i=0;
- x=0;
- out=0;
- h=1;
- clr_screen();
- while(out==0)
- {
- lcd_pos(1,0); //請輸入新密碼
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS18[i]);
- }
- HSjzaj();
- lcd_pos(2,0);
- for(i=0;i<6;i++)
- {
- lcd_wdat(adminpassword1[i]+0x30);
- }
- lcd_pos(3,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS19[i]);
- }
- if(x==1)
- {
- for(i=0;i<6;i++)
- {
- adminpassword[i]=adminpassword1[i];
- }
- cc(0x2400); // 擦除第 3 個扇區
- for(i=0;i<6;i++)
- {
- xcx(0x2400+i,adminpassword[i]); // 對 EEPROM區 2400h 寫入
- }
- EA=1;
- clr_screen();
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS20[i]);
- }
- delay(1000);
- out=1;
- }
- }
- for(i=0;i<6;i++)
- {
- adminpassword1[i]=0; //將密碼1寄存器置零
- }
- clr_screen();
- }
- //修改密碼
- void HSpassword()
- {
- uchar i=0;
- x=0;
- out=0;
- h=0;
- clr_screen();
-
- while(out==0)
- {
- lcd_pos(1,0); //請輸入新密碼
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS18[i]);
- }
- HSjzaj();
- lcd_pos(2,0);
- for(i=0;i<6;i++)
- {
- lcd_wdat(password1[i]+0x30);
- }
- lcd_pos(3,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS19[i]);
- delay(0);
- }
- if(x==1)
- {
- for(i=0;i<6;i++)
- {
- password[i]=password1[i];
- }
- cc(0x2200); // 擦除第 2 個扇區
- for(i=0;i<6;i++)
- {
- xcx(0x2200+i,password[i]); // 對 EEPROM區 2200h 寫入
- }
- EA=1;
- clr_screen();
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS20[i]);
- }
- delay(1000);
- out=1;
- }
- }
- for(i=0;i<6;i++)
- {
- password1[i]=0; //將密碼1寄存器置零
- }
- clr_screen();
- }
-
- //管理員模式
- void HSAdministrators()
- {
- uchar i,p=0;
- h=1;
- clr_screen(); ///
- while(out==0)
- {
- lcd_pos(2,0); //請輸入管理密碼
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS6[i]);
- }
- HSjzaj();
- if(x==1)
- {
- x=0;
- k=0;
- for(i=0;i<6;i++)
- {
- if(adminpassword1[i]==adminpassword[i])
- {
- delay(0);
- }
- else
- {
- p=1;
- }
- }
- if(p==0)
- {
- clr_screen();
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS3[i]); //管理密碼正確
- }
- delay(1000);
- while(out==0)
- {
- clr_screen();
- lcd_pos(1,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS7[i]); //添加指紋
- delay(0);
- }
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS8[i]); //清空指紋
- delay(0);
- }
- lcd_pos(3,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS9[i]); //開鎖密碼
- delay(0);
- }
- lcd_pos(4,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS10[i]); //管理密碼
- delay(0);
- }
- b='*';
- HSjzaj();
- switch(b)
- {
- case (0): FPM10A_Add_Fingerprint();break; //添加指紋
- case (1): FPM10A_Delete_All_Fingerprint();break; //刪除所有存貯的指紋庫
- case (2): HSpassword();break; //修改開鎖密碼
- case (4): HSadminpassword();break; //修改管理員密碼
- }
- }
- }
- else
- {
- clr_screen();
- lcd_pos(2,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS14[i]); //管理密碼錯誤
- }
- delay(1000);
- }
- for(i=0;i<6;i++)
- {
- adminpassword1[i]=0; //將密碼1寄存器置零
- }
- clr_screen();
- }
- }
- }
- void kaisuo()
- {
- kai=0;
- kai1=0;
- kai2=0;
- delay(3000);
- kai=1;
- kai1=1;
- kai2=1;
- }
- /*********************************************************
- * *
- * 主函數 *
- * *
- *********************************************************/
- void main()
- {
- uchar i; ///
- delay(100); //上電,等待穩定
- lcd_init(); //初始化LCD
- Uart_Init(); //串口初始化
- finger_id = dcx(0x2002); // 開機讀取 EEPROM區 2002h 數據 ,還原關電前
- while(1)
- {
- for(i=0;i<6;i++)
- {
- adminpassword[i]=dcx(0x2400+i); //從6個扇區取出6位管理員密碼
- password[i]=dcx(0x2200+i); //從6個扇區取出6位開門密碼
- }
- out=0;
- lcd_pos(2,0); //歡迎使用
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS1[i]);
- }
- lcd_pos(3,0); //云部落指紋鎖
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS2[i]);
- }
- FPM10A_Find_Fingerprint(); //對比指紋(重點)
- HSjzaj(); //矩陣鍵盤輸入
- if(x==1) //“確認”標志位,按下進行輸入密碼后對比
- {
- x=0;
- h=0;
- confirm();
- k=0;
- }
- if(Administrators==1) //“管理員模式”標志位,按下進行管理員模式
- {
- Administrators=0;
- HSAdministrators();
- }
- if(reset1==1) //“復位”標志位,按下后管理員密碼和開門密碼還原
- {
- clr_screen();
- reset1=0;
- wolegequ();
- lcd_pos(3,0);
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS21[i]);
- }
- delay(1000);
- clr_screen();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
成品2.zip
(67.4 KB, 下載次數: 983)
2018-11-25 20:55 上傳
點擊文件名下載附件
總程序 下載積分: 黑幣 -5
|