下面设计具体有16个按键输入,S12~S15此处无用、用4为集成数码管显示4为密码。矩阵键盘电路由P2口低四位控制4行,P2口高四位控制4列,数码管短线段与P0口相连,4调位选控制线与P1口低四位相连,模拟锁状态的发光二极管由P3.0控制。
密码锁功能如下:
(1)系统上电,数码管显示 - - - -,此时可输入4位密码,然后以OK KEY键结束输入,如果密码输入正确数码管显示 P,按下任意键结束;如果密码输入错误数码管显示 E 1秒,重新输入。
(2)PASS KEY作为密码设置按键,再次按下或已重置输入4位密码 则显示 P 表示设置密码成功返回输入状态。
仿真:
部分程序:
- #include <reg51.h>
- void delay(unsigned int i) //延时函数
- {
- unsigned int k;
- for(k = 0; k < i; k++);
- }
- unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //键盘扫描码
- unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数码管显示码
- unsigned char pw[4]={0,0,0,0}; //存放原始密码
- unsigned char pwnew[4]={10,10,10,10}; //存放输入的密码
- sbit P30=P3^0;
- void set_pw(); //密码设置函数
- void dispset(); //密码设置显示函数
- void dispnew(); //当先输入密码显示函数
- void dispright(); //输入密码正确显示函数
- void disperror(); //输入密码错误显示函数
- char keyscan(); //行列反转法实现的矩阵键盘扫描函数
- void main()
- {
- char i,count;
- bit pw_flag; //密码标志位,1表示正确0表示错误
- while(1)
- {
- i=keyscan();
- dispnew();
- if(i!=-1) //判断是否有按键按下
- {
- if(i==11) //按下11号按键,进入密码设置界面
- {
- P2=0xf0;
- while(P2!=0xf0);
- set_pw();
- }
-
- if((i>=0) && (i<=9))
- {
- pwnew[count]=i; //给pwnew数组赋上当前按下按键对应的值
-
- count++;
- P2=0xf0;
- while(P2!=0xf0); //判断按键释放
- }
-
- else if(i==10) //输入密码完成后按下确认键
- { pw_flag=1; //附上原始状态
- if(count!=4) //先判断输入字符个数是否正确
- pw_flag=0; //不正确,则修改密码标志位为0
- else
- {for(i=0;i<4;i++) //比较输入字符与原始密码是否相同
- {if(pw[i]!=pwnew[i])
- {pw_flag=0; break;}
- }
- }
-
- if(pw_flag==1) //密码输入正确
- {
- dispright(); //显示密码输入正确显示 P
- P30 = 0; //开锁指示灯亮
- delay(20000);
- while(1)
- {
- i=keyscan();
- if(i!=-1) //有按键按下则退出等待状态
- break;
- }
- P2=0xf0;
- while(P2!=0xf0); //判断按键释放
- }
- else
- {
- disperror(); //密码输入错误显示 E
- P30 = 1;
- }
- count=0;
- delay(50000);
- for(i=0;i<4;i++) //清楚当前输入值
- {
- pwnew[i]=10;
- }
-
-
- }
- }
- }
- }
复制代码
Keil代码与Proteus仿真下载:
四位密码锁.7z
(91.99 KB, 下载次数: 224)
|