《2022年密码锁源程序 .pdf》由会员分享,可在线阅读,更多相关《2022年密码锁源程序 .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、/*密码锁*1602*矩阵键盘*发光二极管替代控制装置*/*肖锦祥*STC89C52RC*24C02*2011年 3 月 8 日*/*由于该开始你不知24c02 里存的数据是什么。所以要想办法显示出来;/*密码取值范围1999 9999 9999 9999 最多十五位*/*注意*一个变量同时用在1 个以上的子函数/*里一定要用全局变量定义,不然就会出错*#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define lcd_date P0/lcd 数据口#define
2、mdate P2/矩阵键盘数据口sbit sda=P12;sbit scl=P13;sbit lcden=P11;sbit lcdrs=P10;sbit led0=P17;/发光二极管uchar code table=Error;/5个字符uchar code table6=Right;/5个字符uchar code table5=Complete;/8个字符uchar code table1=Input code;/10个字符uchar code table2=Input code again;/16个字符uchar code table3=Input old code;/14个字符ucha
3、r code table4=Input new code;/14个字符uchar code table7=Welcome enter;/13个字符ulong result,password,a=10;uchar key,places=0,flag,flag7,flag8,flag9,m;/*延时*void delay(uint z)/定时 1ms uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*延时*delay1();/*写命令*void write_com(uchar com)lcdrs=0;lcd_date=com;delay(5);/定时(5x1ms=
4、5ms)lcden=1;delay(5);lcden=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -/*写数据*void write_date(uchar date)lcdrs=1;lcd_date=date;delay(5);/定时(5x1ms=5ms)lcden=1;delay(5);lcden=0;/*液晶显示*void lcddisplay()uchar num;write_com(0 x01);write_com(0 x80);/第一行显示input code(输入密码)for(num=0;num10;num+)write_date(table1num
5、);delay(5);write_com(0 x80+0 x40);/把光标移到下一行,为输密码做准备/*开始信号/*void start()sda=1;delay1();scl=1;delay1();sda=0;delay1();/*结束信号/*void stop()sda=0;delay1();scl=1;delay1();sda=1;delay1();/*应答*void respons()uchar i;scl=1;delay1();while(sda=1)&(i250)名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -i+;scl=0;delay1();/*写一
6、个字节*void write_byte(uchar dat)uchar i,tem;tem=dat;for(i=0;i8;i+)tem=tem1;scl=0;delay1();sda=CY;delay1();scl=1;delay1();scl=0;delay1();sda=1;delay1();/*读一个字节*uchar read_byte()uchar i,k;scl=0;delay1();sda=1;delay1();for(i=0;i8;i+)scl=1;delay1();k=(k1)|sda;scl=0;delay1();return k;/*写地址*void write_add(u
7、char address,uchar dat)start();write_byte(0 xa0);respons();write_byte(address);respons();名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -write_byte(dat);respons();stop();/*读地址*uchar read_add(uchar address)uchar dat;start();write_byte(0 xa0);respons();write_byte(address);respons();start();write_byte(0 xa1);resp
8、ons();dat=read_byte();stop();return dat;/*矩阵键盘*void matrixkeyscan()uchar num,num4;uchar temp;mdate=0 xfe;/mdate0 为低电平1111 1110 temp=mdate;temp=temp&0 xf0;/检测是否有按键被按下if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 delay(55);temp=mdate;temp=temp&0 xf0;/再次检测if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 temp=mdate;swit
9、ch(temp)case 0 xee:/1110 1110 按键 key04 被按下key=7;break;case 0 xde:/1101 1110 按键 key05 被按下key=4;break;case 0 xbe:/1011 1110 按键 key06 被按下key=1;break;case 0 x7e:/0111 1110 按键 key07 被按下(密码修改)名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -key=11;m+;result=0;/把结果和key 清零places=0;if(m=1)/按一次能进入修改;flag=1;/修改的入口;write_c
10、om(0 x01);/清屏把*清掉write_com(0 x80);/第一行显示input old code(输入久密码)for(num=0;num14;num+)write_date(table3num);delay(5);write_com(0 x80+0 x40);/移到下一行为输密码做准备 if(m=2)/在修改的时候再一次就能退出;flag=0;m=0;lcddisplay();break;while(temp!=0 xf0)/按键等待temp=mdate;temp=temp&0 xf0;mdate=0 xfd;/mdate0 为低电平1111 1101 temp=mdate;tem
11、p=temp&0 xf0;/检测是否有按键被按下if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 delay(55);temp=mdate;temp=temp&0 xf0;/再次检测if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 temp=mdate;switch(temp)case 0 xed:/1110 1101 按键 key14 被按下key=8;break;case 0 xdd:/1101 1101 按键 key15 被按下key=5;break;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 10 页 -case
12、 0 xbd:/1011 1101 按键 key16 被按下key=2;break;case 0 x7d:/0111 1101 按键 key17 被按下key=0;delay(5);break;while(temp!=0 xf0)/按键等待 temp=mdate;temp=temp&0 xf0;mdate=0 xfb;/mdate0 为低电平1111 1011 temp=mdate;temp=temp&0 xf0;/检测是否有按键被按下if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 delay(55);temp=mdate;temp=temp&0 xf0;/再次检
13、测if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 temp=mdate;switch(temp)case 0 xeb:/1110 1011 按键 key24 被按下key=9;break;case 0 xdb:/1101 1011 按键 key25 被按下key=6;break;case 0 xbb:/1011 1011 按键 key26 被按下key=3;break;case 0 x7b:/0111 1011 按键 key27 被按下(=)key=12;break;while(temp!=0 xf0)/按键等待 temp=mdate;temp=temp&0 xf
14、0;mdate=0 xf7;/mdate0 为低电平1111 0111 temp=mdate;temp=temp&0 xf0;/检测是否有按键被按下名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 delay(55);temp=mdate;temp=temp&0 xf0;/再次检测if(temp!=0 xf0)/当有按键被按下时temp 不等于 0 xf0 temp=mdate;switch(temp)case 0 xe7:/1110 0111 按键 key34 被按下(清除)result=0
15、;places=0;write_com(0 x80+0 x40);/for(num4=0;num4=0&key16)write_com(0 x80+0 x4f);places=0;/*初始化*void init()名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 10 页 -sda=1;delay1();scl=1;delay1();key=10;lcden=0;write_com(0 x38);/设置 16x2 显示 5x7.8 位数据接口write_com(0 x0e);/设置开显示。不显示光标0000 1100 write_com(0 x06);/写一个字符后地址指针自动加1
16、;0000 0110 write_com(0 x01);/显示清 0,数据指针清0 /*检测*void checking()uchar num,num6,num7/*,flag*/;/这里不能定义flag 不然会出错if(key=12&flag!=1&flag9=0)/只有在修改键没被按下时才有用if(password!=result)/当结果与密码相等时 result=0;places=0;key=10;write_com(0 x01);write_com(0 x80+0 x40);for(num=0;num5;num+)write_date(tablenum);/在第 2 行显示错误(er
17、ror)delay(1000);lcddisplay();else led0=0;/打开灯flag9=1;result=0;places=0;key=10;/退出这个子程序。因为它while(1)/这是会很快的一直显示而致没看到显示write_com(0 x01);write_com(0 x80);for(num7=0;num713;num7+)write_date(table7num7);/欢迎进入write_com(0 x80+0 x40);for(num6=0;num65;num6+)write_date(table6num6);/在第 2 行显示正确(right)if(key=12&f
18、lag9=1)/注意不要放在if(key=12&flag!=1&flag9=0)里名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 10 页 -key=10;flag9=0;led0=1;/关闭灯lcddisplay();/*密码修改*void amendcode()uchar num1,num2,num9,num7;/flag7;flag8;这里不能把flag7,/ulong a=10;a 做局部变量否则会出错if(flag)/修改键被按下 if(password=result)/如果旧密码与输入的结果相等的话;loop:write_com(0 x01);/清屏/loop 是一个
19、标志符与goto 配用write_com(0 x80);for(num1=0;num114;num1+)/显示输入新密码write_date(table4num1);/当输入的新密码与旧相同时会再一次显示输入新密码write_com(0 x80+0 x40);/光标移到第二行result=0;places=0;flag7=1;/为显示再输一个号码做准备 if(result!=0&key=12&flag7=1)/只有输入的旧密码是正确的才执行这步 write_com(0 x01);write_com(0 x80);for(num7=0;num716;num7+)write_date(table2
20、num7);/显示再输一次delay(5);write_com(0 x80+0 x40);flag7=0;flag8=1;key=10;a=result;/把第一次输入的结果赋给a result=0;places=0;if(key=12&flag8=1)places=0;if(a=result)/确认键被按下 password=a;write_add(2,password);/将新的密码存入24c02 result=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -write_com(0 x01);write_com(0 x80+0 x40);for(num2=0;
21、num28;num2+)write_date(table5num2);/设置成功delay(1000);write_com(0 x01);lcddisplay();key=10;m=0;flag=0;/退出修改功能 else write_com(0 x01);write_com(0 x80+0 x40);for(num9=0;num95;num9+)write_date(tablenum9);/显示错误输入的两次不符delay(1000);key=10;goto loop;/*void shu()/在不知 password 的值时用此子函数来显示uchar shi,ge,bai;bai=password/100;shi=password%100/10;ge=password%10;write_com(0 xcb);write_date(0 x30+bai);write_date(0 x30+shi);write_date(0 x30+ge);write_com(0 xc0);*/*主函数*void main()init();password=read_add(2);lcddisplay();while(1)/shu();matrixkeyscan();checking();amendcode();名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -
限制150内