密码锁,求帮助
时间:10-02
整理:3721RD
点击:
想把一个别的程序移植到自己的硬件上,纯小白,不会改,求帮助求帮助求帮助。
原图
我的图
主程序
原图
我的图
主程序
- #include <reg52.h>
- #include "delay.h" //延时头文件
- #include "LCD1602.h"
- #include "speaker.h"
- #include "key4x4.h"
- #include "AT24C02.h"
- #include "t1.h"
- /***************************************************************/
- #define uchar unsigned char // 无符号字符整形 0~ 256
- #define uint unsigned int //定义无符号整形 0~65536
- /**************************************************************/
- sbit led=P2^3; //仿真软件使用接口
- uint dumima,old_mima,new_mima,shige;
- uchar code chushimima_tab[]={1,2,3,4,5,6}; //设定系统第一次初始密码为123456
- uchar data dumima_tab1[6]={0}; //从24C02中读取写入的初始或修改的密码保存
- uchar data dumima_tab2[6]={0}; // 用于读取密码是保存在内存中, 启动打开密码锁时用到
- uchar data shurumima_tab1[6]={0}; //从键盘输入的密码保存,以便和读取的密码对比 修改密码时用到
- uchar data shurumima_tab2[6]={0}; //从键盘输入的密码保存,以便和读取的密码对比 修改密码时用到
- void main()
- {
- uchar j,mm=5; //j显示位置字符,mm提示报警次数计数及显示输入错误机会次数为5次
- led=1;
- speak=1;
- init(); //1602初始化
- jiemian(); //1602显示界面
- ding_time=50000; //设定T1定时器定时时长50ms
- timer1_init( ); //T1定时器初始化
- TR1=1; //T1定时器启动开始定时
- /*************************************************************/
- dumima=AT24C02_read_byte(0x02);//读取02地址的数据判断是否写入初始或修改的密码
- if(dumima!=1) //如果不等于1,则判断没写初始或修改的密码,需要写入
- {
- AT24C02_write_byte(0x02,0x01); //在第2个地址中写入1,以便判断下次不用写入
- delay_ms(10);
- for(j=0;j<6;j++)
- { //从第4个地址开始写初始密码数据
- AT24C02_write_byte(j+4,chushimima_tab[j]);
- delay_ms(10);
- }
- }
- for(j=0;j<6;j++) //从第4个地址开始写初始密码数据
- { //从24C02中读取写入的初始或修改的密码保存
- dumima_tab1[j]=AT24C02_read_byte(j+4);
- delay_ms(10);
- }
- /*************************************************************/
- been(); //初始化读写密码完成之后提示声音,同时进入主程序大循环
- while(1) //进入程序大循环
- {
- key4x4(); //查询按键是否有按下(只对启动和修改密码按键有效)
- /*********************************************************/
- if(start_stop==1) //启动按键密码输入打开密码锁
- {
- ok=0; //取消其他按键误动作及退出判断
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- TR1=0;//关闭定时器
- been(); // 启动按键提示音
- write_com(0x80); //第一行显示“Please input You”
- for(j=0;j<16;j++)
- {
- write_data(you_table[j]);
- delay_us(10);
- }
- write_com(0xc0); //第二行显示“Password: ”
- for(j=0;j<16;j++)
- {
- write_data(table3[j]);
- delay_us(10);
- }
- num=0; start4x4=1; //num输入显示计数位置设置及等待输入密码循环开始
- while(start4x4==1) //等待数字键按下作为密码输入
- {
- key4x4(); //只对数字按键和取消按键有效
- if(key_valu==1) //在输入密码过程中,可以随时去取消输入重来
- { //但是输入满6位的时候不能取消,必须按确认键
- ok=0; //取消其他按键误动作及退出判断
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0; been(); //输入按键提示声音
- write_com(0xca+num); //第二行适当位置ca起显示输入的密码
- write_data(key_table[i]); //显示对应的数字密码,
- write_data(xing_tab[0]); //用*号代替数字保密 /*更改此处可显示数字*/
- dumima_tab2[num]=key_table2[i]; //将输入的密码进行保存以便核对
- while(dengdai==1) //将P1端口的值读出判断按键是否松开,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就继续等待
- else dengdai=0; //松开就返回
- }
- num++; //显示下一个字符
- if(num==6) //按下6个数字的操作,等待确认按下
- {
- num=0; start4x4=0;dengdai_ok=1; //进入下一个显示环节,等待按确认键确认密码
- while(dengdai_ok==1)
- {
- key4x4();
- if(ok==1) //确认按键按下,进行密码对比
- {
- ok=0; //取消按键误动作
- quxiao=0;
- key_valu=0;
- xiugaimima=0; dengdai_ok=0;
- start_stop=0;
- //密码逐位对比判断(密码对比)
- if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
- &&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
- &&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5])
- { //密码输入正确的操作
- been(); //输入密码正确按键提示声音
- baojing=0; mm=5; //消除报警和输入限制次数清零
- write_com(0xc0); //第二行显示"Password: -OK!- "
- for(j=0;j<16;j++)
- {
- write_data(table4[j]);
- delay_us(10);
- }
- led=0; //执行密码正确指令功能 /*更改此处可修改功能*/
- delay_ms(2000); //成功或者不成功 延时5秒钟之后判断显示界面
- jiemian(); //显示界面信息
- TR1=1; time=0;xian1=0;xian2=1; //启动定时器开锁工作
- delay_ms(5000);led=1; //指示灯延时5秒之后关闭
- }
- else //执行密码输入错误 操作
- {
- been();delay_ms(50);been();delay_ms(500); //输入密码错误提示
- write_com(0xc0); //第二行显示"Password: -No!- "”
- for(j=0;j<16;j++)
- {
- write_data(table5[j]);
- delay_us(10);
- }
- delay_ms(2000);
- mm--; //输入机会减少1次 最高最低各5次
- if(mm>0) //少于5次时显示输入机会
- {
- write_com(0x80); //第二行显示" Sorry! You have"
- for(j=0;j<16;j++)
- {
- write_data(chan_tab1[j]);
- delay_us(10);
- }
- write_com(0xc0); //第二行显示" "
- for(j=0;j<16;j++) //清楚第二行内容,
- {
- write_data(kong_tabb[j]);
- delay_us(10);
- }
- write_com(0xc3); //第二行显示"12345“
- write_data(chan_tab3[mm]);
- delay_us(5);
- write_com(0xc7); //第二行显示" Chance!"
- for(j=0;j<9;j++)
- {
- write_data(chan_tab2[j]);
- delay_us(10);
- }
- delay_ms(5000);
- start_stop=1; //返回继续等待重新输入密码开锁
- }
- else //mm=0;执行密码错误指令功能:输错5次报警
- {
- been();delay_ms(50);been();delay_ms(50);been();delay_ms(500);
- P1=0x00;mm=1; //锁定键盘,同时限制输入次数只能为1次
- jiemian(); //显示界面之后再进行报警
- TR1=1; time=0;xian1=0;xian2=1;
- baojing=1; // 只有输入成功才能给5次机会,同时撤出报警
- speaker(); //蜂鸣器执行报警程序 报警完毕之后延长时间停止再次输入
- for(j=0;j<20;j++) //延时20秒不输入,锁定键盘
- { //同时又开始锁定时间,让键盘功能无效 6000
- delay_ms(1000);
- } //延时时间到重启输入,但是只给一次机会
- TR1=0; //关闭定时器显示提示输入信息界面,
- write_com(0x80); //第二行显示" Sorry! You have"
- for(j=0;j<16;j++)
- {
- write_data(chan_tab1[j]);
- delay_us(10);
- }
- write_com(0xc0); //第二行显示" "
- for(j=0;j<16;j++) //清楚第二行内容,
- {
- write_data(kong_tabb[j]);
- delay_us(10);
- }
- write_com(0xc1); //第二行显示" 12345"
- write_data(chan_tab3[mm]);
- delay_us(5);
- write_com(0xc3); //第二行显示" Chance!"
- for(j=0;j<9;j++)
- {
- write_data(chan_tab2[j]);
- delay_us(10);
- }
- write_com(0xcd); //第二行显示" ok?"
- for(j=0;j<3;j++)
- {
- write_data(ok_tab[j]);
- delay_us(10);
- }
- delay_ms(2000);
- dengdai_ok=1; been();delay_ms(50);been();delay_ms(50);been();delay_ms(500);
- while(dengdai_ok==1) //提示最后输入密码
- {
- key4x4();
- if(ok==1) //等待确认按键按下再次输入密码开锁
- {
- ok=0; //取消按键误动作
- quxiao=0;
- key_valu=0;
- start_stop=0;
- dengdai_ok=0;
- start_stop=1; //返回继续等待重新输入密码开锁
- }
- }
- }
- }
- }
- }
- }
- }
- if(quxiao==1) //按下取消按键则显示界面联系电话
- {
- ok=0; //取消按键误动作
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- dengdai_ok=0; start4x4=0; been();
- jiemian(); //开启定时器,显示界面和欢迎和电话信息
- TR1=1;time=0;xian1=0;xian2=1;
- while(dengdai==1) //将P1端口的值读出判断按键是否松开,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就继续等待
- else dengdai=0; //松开就返回
- }
- }
- }
- }
- /*********************************************************/
- /*********************************************************/
- /*********************************************************/
- if(xiugaimima==1) //修改密码程序
- {
- ok=0; //取消按键误动作
- quxiao=0;
- key_valu=0;
- start_stop=0;
- xiugaimima=0; been();
- TR1=0;//关闭定时器T1
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(old_table[j]);//显示"Please input Old"
- delay_us(100);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(table3[j]); //显示"password: "
- delay_us(10);
- }
- start4x4=1; //修改密码等待有效
- while(start4x4==1) //等待数字键按下作为密码输入
- {
- key4x4(); //只对数字按键和取消按键有效
- if(key_valu==1) //在输入密码过程中,可以随时去取消输入重来
- {
- ok=0; //取消按键误动作
- quxiao=0;
- key_valu=0;
- start_stop=0;
- xiugaimima=0; been(); //输入密码提示音
- write_com(0xca+num); //显示输入密码
- write_data(key_table[i]); //显示对应的数字密码,
- write_com(0xca+num); //显示输入密码 ,调到键盘松开之后可以显示数字
- write_data(xing_tab[0]); //用*号代替保密 但是需要将前面两个注释去掉
- dumima_tab2[num]=key_table2[i]; //将输入的密码进行保存以便核对
- while(dengdai==1) //将P1端口的值读出判断按键是否松开,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就继续等待
- else dengdai=0; //松开就返回
- }
- num++; //显示下一个字符
- if(num==6) //按下6个数字的操作,等待确认和取下
- {
- num=0; dengdai_
