51单片机矩阵键盘密码锁程序
时间: 2023-08-04 20:09:19 浏览: 106
基于51单片机的矩阵键盘密码锁
以下是基于51单片机的矩阵键盘密码锁程序:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
}; //共阳极数码管编码表
uchar code password[]={'1','2','3','4'}; //设定的密码
uchar key,flag,count,i;
void delay(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar n) //数码管显示函数
{
uchar a,b;
a=n/10;
b=n%10;
LSA=0;LSB=0;LSC=0;P0=table[a];delay(5);P0=0x00;
LSA=1;LSB=0;LSC=0;P0=table[b];delay(5);P0=0x00;
}
void main()
{
while(1)
{
key=P3;
key=key&0x0f; //取低四位
if(key!=0x0f) //判断是否有按键按下
{
delay(10); //延时消抖
key=P3;
key=key&0x0f; //再次取低四位
if(key!=0x0f) //判断是否有按键按下
{
switch(key)
{
case 0:flag=0;break;
case 1:flag=1;break;
case 2:flag=2;break;
case 3:flag=3;break;
case 4:flag=4;break;
case 5:flag=5;break;
case 6:flag=6;break;
case 7:flag=7;break;
case 8:flag=8;break;
case 9:flag=9;break;
case 10:flag=10;break;
case 11:flag=11;break;
case 12:flag=12;break;
case 13:flag=13;break;
case 14:flag=14;break;
case 15:flag=15;break;
}
while(key!=0x0f) //等待按键释放
{
key=P3;
key=key&0x0f;
}
switch(flag)
{
case 10:if(count==4) //按下#键,判断密码是否正确
{
for(i=0;i<4;i++)
{
if(password[i]!=(P0+'0'))
break;
}
if(i==4) //密码正确,则显示open
{
P1=0x01; //打开锁
for(i=0;i<3;i++)
{
display(8888);
delay(500); //延时1秒
P0=0x00;
delay(500); //延时1秒
}
}
else //密码错误,则显示error
{
for(i=0;i<3;i++)
{
display(8888);
delay(500); //延时1秒
P0=0x00;
delay(500); //延时1秒
}
}
count=0; //清零计数器
}
break;
case 11:for(i=0;i<4;i++) //按下*键,清空密码
{
display(0);
delay(5);
P0=0x00;
password[i]=0;
}
count=0; //清零计数器
break;
default:if(count<4) //按下数字键,记录密码
{
password[count]=P0+'0';
count++; //计数器加1
display('*');
delay(5);
P0=0x00;
}
break;
}
}
}
}
}
```
该程序采用4x4矩阵键盘输入密码,密码为设定的“1234”,按下“*”键可清空密码,按下数字键可输入密码,按下“#”键可判断密码是否正确。若密码正确,则数码管显示“8888”,且锁打开;若密码错误,则数码管显示“8888”三次,且锁不打开。
阅读全文