51单片机 AT89S52 4*4键盘密码锁 密码可修改程序
时间: 2023-10-15 21:04:04 浏览: 46
好的,下面是一个简单的AT89S52 4*4键盘密码锁密码可修改的程序,你可以参考一下:
```c
#include <reg52.h> //头文件
#define uchar unsigned char //定义uchar为无符号字符型
#define uint unsigned int //定义uint为无符号整型
sbit beep = P1^5; //蜂鸣器连接在P1.5
sbit led = P1^6; //LED灯连接在P1.6
uchar code table[] = {'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'}; //键盘扫描码表
uchar code password[] = {'1','2','3','4'}; //初始密码为"1234"
uchar key; //用于存储键值
uchar flag; //标志位,用于判断是否按下键盘
uchar count; //计数器,用于存储输入的密码位数
uchar i; //循环计数器
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
P2 = 0xF0; //设置P2高4位为输入,低4位为输出
P0 = 0x00; //清零P0口
beep = 0; //关闭蜂鸣器
led = 0; //关闭LED灯
count = 0; //清零计数器
}
void check() //密码检测函数
{
for(i=0;i<4;i++) //循环4次,判断输入的密码是否正确
{
if(key != password[i]) //如果输入的密码与保存的密码不一致
{
delay(500); //延时500ms
beep = 1; //打开蜂鸣器
delay(500); //延时500ms
beep = 0; //关闭蜂鸣器
count = 0; //清零计数器
break; //跳出循环
}
else //如果输入的密码与保存的密码一致
{
delay(500); //延时500ms
beep = 1; //打开蜂鸣器
delay(500); //延时500ms
beep = 0; //关闭蜂鸣器
led = ~led; //切换LED灯状态
count = 0; //清零计数器
}
}
}
void keyscan() //键盘扫描函数
{
uchar temp; //用于保存P2口的状态
temp = P2; //读取P2口的状态
temp &= 0xF0; //屏蔽低4位,只保留高4位
if(temp != 0xF0) //如果有键按下
{
delay(10); //延时10ms
temp = P2; //读取P2口的状态
temp &= 0xF0; //屏蔽低4位,只保留高4位
if(temp != 0xF0) //再次判断是否有键按下
{
switch(temp) //根据P2口的状态判断按下的是哪个键
{
case 0xE0: key = table[0+count*4]; break; //第一行
case 0xD0: key = table[1+count*4]; break; //第二行
case 0xB0: key = table[2+count*4]; break; //第三行
case 0x70: key = table[3+count*4]; break; //第四行
}
flag = 1; //标志位置1,表示已按下键盘
}
}
}
void main() //主函数
{
init(); //初始化
while(1) //循环执行
{
keyscan(); //键盘扫描
if(flag == 1) //如果已按下键盘
{
delay(10); //延时10ms
if((P2&0xF0) != 0xF0) //再次判断是否有键按下
{
flag = 0; //标志位清零
}
else //如果没有键按下
{
if(key == '#') //如果按下了#键
{
if(count == 4) //如果输入的密码为4位
{
check(); //进行密码检测
}
else //如果输入的密码不足4位
{
delay(500); //延时500ms
beep = 1; //打开蜂鸣器
delay(500); //延时500ms
beep = 0; //关闭蜂鸣器
count = 0; //清零计数器
}
}
else if(key == '*') //如果按下了*键
{
count = 0; //清零计数器
}
else //如果按下了数字键
{
delay(500); //延时500ms
beep = 1; //打开蜂鸣器
delay(500); //延时500ms
beep = 0; //关闭蜂鸣器
P0 = key; //在P0口显示输入的数字
password[count] = key; //保存输入的数字
count++; //计数器加1
}
flag = 0; //标志位清零
}
}
}
}
```
在上面的程序中,初始密码为"1234",输入#键后会进行密码检测,如果输入的密码与保存的密码一致,则打开LED灯并发出蜂鸣器声音,否则会发出另一种声音。如果输入的密码不足4位,则会发出另一种声音,如果输入的密码超过4位,则只取前4位数字。同时,输入*键可以清空输入的密码。