输入模块:AS608,矩阵键盘
处理器:STC90C52
输出设备:LCD12864,电磁锁,继电器
总流程:当AS608探测到有手指接触时,判断是否符合已储存的指纹数据,符合输出电平开锁,否则12864显示错误。或者当输入数字密码相符合也可开锁,内部存有开锁密码,和管理员密码(设置指纹库和开门密码),密码和指纹ID号存储在EEPROM中防止掉电丢失。
制作出来的实物图如下:
背面
正面
52单片机最小系统
电磁锁
LCD12864
AS608
矩阵键盘
单片机程序源码:
- #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, 下载次数: 976)
|