#include <REGX51.H>
unsigned char code key_code[]={0xd7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb,0xe7,0xb7,0x7e,0x7d,0x7b,0x77}; //键盘扫描码
unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,0x77,0x7C,0x39,0x5E}; //数码管显示码
unsigned char pw[6]={0,0,0,0,0,0}; //存放原始密码 这个密码开密后可以修改
unsigned char code pwg[6]={12,2,5,9,1,2}; //存放管理员密码 12代表A,这个密码是固定不变的
unsigned char pwnew[6]={11,11,11,11,11,11}; //存放输入的密码
unsigned int k;
sbit LED=P3^4; //开锁成功批示灯
sbit beep=P3^6; //蜂鸣器端口
void set_pw(); //密码设置函数
void dispset(); //密码设置显示函数
void dispnew(); //当先输入密码显示函数
void dispright(); //输入密码正确显示函数
void disperror(); //输入密码错误显示函数
char keyscan(); //行列反转法实现的矩阵键盘扫描函数
void delay(unsigned int i) //延时函数
{
unsigned int k;
for(k = 0; k < i; k++);
}
void colk() //按键提示声
{
beep=0;
delay(7000);
beep=1;
}
void colk1() //开锁成功提示声
{
beep=0;
delay(15000);
beep=1;
}
void main() //主程序
{
char i,count;
bit pw_flag; //密码标志位,1表示正确0表示错误
count=0;
while(1)
{
i=keyscan();
dispnew();
if(i!=-1) //判断是否有按键按下
{
colk();
if((i!=10)&&(i!=11))// if((i>=0)&&(i<=9))!
{
pwnew[count]=i; //给pwnew数组赋上当前按下按键对应的值
count++;
if(i==15)
{
count=0;
for(i=0;i<6;i++) //清除当前输入值
{
pwnew[i]=11;
}
}
if(count==6) //输入6个字符,自动结束
{
pw_flag=1;
for(i=0;i<6;i++)//比较输入字符与原始密码是否相同
{
if(pw[i]!=pwnew[i])
{
pw_flag=0;
break;
}
}
if(pw_flag==0)
{
for(i=0;i<6;i++)//比较输入字符与管理员密码是否相同
{
if(pwg[i]!=pwnew[i])
{
pw_flag=0;
break;
} else pw_flag=1;
}
}
if(pw_flag==1) //密码输入正确
{
delay(7000);
delay(7000);
colk1();
LED=0; //开锁指示灯亮
k=200;
while(k--)
{
dispright(); //显示密码输入正确显示
i=keyscan();
}
for(i=0;i<6;i++) //清除当前输入值
{
pwnew[i]=11;
}
LED=1;
P1=0xf0;
while(P1!=0xf0); //判断按键释放
}
else
{
LED = 1;
delay(14000);
colk();
delay(7000);
colk();
delay(7000);
colk();
k=3000; //修改这个值大小会改变密码错误锁盘时间
while(k--)
{
disperror(); //密码输入错误显示
}
for(i=0;i<6;i++) //清楚当前输入值
{
pwnew[i]=11;
}
}
count=0;
}
P1=0xf0;
while(P1!=0xf0); //判断按键释放
}
}
}
}
void dispnew() //开锁显示
{
unsigned char a=pwnew[0],b=pwnew[1],c=pwnew[2],d=pwnew[3],e=pwnew[4],f=pwnew[5];
if(a!=11)
a=10;
if(b!=11)
b=10;
if(c!=11)
c=10;
if(d!=11)
d=10;
if(e!=11)
e=10;
if(f!=11)
f=10;
P2=0x3e;
P0=led[a];
delay(100);
P2=0x3d;
P0=led[b];
delay(100);
P2=0x3b;
P0=led[c];
delay(100);
P2=0x37;
P0=led[d];
delay(100);
P2=0x2f;
P0=led[e];
delay(100);
P2=0x1f;
P0=led[f];
delay(100);
}
void dispright() //显示OK
{
P2=0x3e;
P0=0x77;
delay(100);
P2=0x3d;
P0=0x77;
delay(100);
P2=0x3b;
P0=0x77;
delay(100);
P2=0x37;
P0=0x77;
delay(100);
P2=0x2f;
P0=0x77;
delay(100);
P2=0x1f;
P0=0x77;
delay(100);
}
void disperror() //显示错误
{
P2=0x3e;
P0=0x71;
delay(100);
P2=0x3d;
P0=0x71;
delay(100);
P2=0x3b;
P0=0x71;
delay(100);
P2=0x37;
P0=0x71;
delay(100);
P2=0x2f;
P0=0x71;
delay(100);
P2=0x1f;
P0=0x71;
delay(100);
}
char keyscan()
{
char scan1,scan2,keycode,j,key;
key=-1; //按键值初值为-1,如果没有扫描到按键,函数返回-1
P1=0xf0; //写:行为全1,列为全0
scan1=P1; //读:行列值
if(scan1!=0xf0) //如果读入值不为0xf0,则表示有按键按下
{
delay(1000);
scan1=P1; //再次读入
if(scan1!=0xf0) //再次判断是否有按键按下,去除抖动
{
P1=0x0f; //行列反转,写:行为全0,列为全1
scan2=P1; //读入行列值
keycode=scan1|scan2; //合并行列值,得到扫描码
for(j=0;j<16;j++) //由扫描码表得到按键值
{
if(keycode==key_code[j])
{
key=j;
break;
}
}
}
}
return (key); //返回按键值
}
单片机6位密码_数码管显示程序(1).zip
需积分: 5 57 浏览量
2023-05-29
15:36:25
上传
评论
收藏 86KB ZIP 举报
乌鸦好像写字台549
- 粉丝: 0
- 资源: 2
最新资源
- 毕业设计- 基于STM32F103C8T6 单片机,物联网技术的太阳能发电装置+源代码+文档说明+架构图+界面截图
- 基于 LSTM(长短期记忆)(即改进的循环神经网络)预测风力发电厂中风力涡轮机产生的功率+源代码+文档说明
- 基于stm32f103+空心杯电机+oled按键+运动算法
- 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.1-1.4)
- 基于python实现的水下压缩空气储能互补系统建模仿真与经济效益分析+源代码+论文
- 华中科技大学-自然语言处理实验,Bi-LSTM+CRF的中文分词框架,并且利用基于深度学习的方法进行中文命名实体识别++源码报告
- 基于动态罚函数的铁路车流分配与径路优化模型python源码
- 鱼群算法求解组环问题python源码+文档说明
- 基于决策优化的多波束测深测线规划模型MATLAB代码
- 课程设计-基于python实现的多目标优化算法求解带时间窗的车辆路径规划问题+源代码+文档说明+界面截图+pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈