板子是普中的,按键按下10为0,按键11为确认,按键12为取消。
输入密码正确时LED D8闪烁(正确密码为5555)
#include <REGX52.H>//头文件定义
unsigned char nixie[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示的段码
unsigned int Code = 0;//用于保存密码的变量
void Tim_int(void);//定时器初始化函数声明
void delay(unsigned int t);//延时函数声明
void wei(unsigned char pizz);//用于显示第几个数码管的函数声明
unsigned char Key(void);//检测按键的函数声明
void Password();//判断密码
int main()
{
unsigned char Num;//接收按键值
unsigned char k;//限制按下次数
Tim_int();//定时器初始化
while(1)
{
Num=Key();
if(Num!=0)
{
if(Num<=10)
{
if(k<4)
{
Code*=10;
Code+=Num%10;
k++;
}
}
else if(Num==12)
{
k=0;
Code=0;
}
else if(Num==11)
{
k=0;
Password();//判断密码
Code=0;
}
}
}
}
/*****************************************************************************************
*参数:无
*功能:定时器0的中断,用于刷新数码管
*返回:无
*******************************************************************************************/
void tim0_interrupt(void) interrupt 1
{
static unsigned char i = 0;//刷新数码管
TF0=0;
TH0 = 0xfc; //重装载值
TL0 =0x66;//
switch(i)
{
case 0:P0=0x00;i++;break;
case 1:wei(4);P0=~nixie[Code%10];i++;break;
case 2:P0=0x00;i++;break;
case 3:wei(3);P0=~nixie[Code/10%10];i++;break;
case 4:P0=0x00;i++;break;
case 5:wei(2);P0=~nixie[Code/100%10];i++;break;
case 6:P0=0x00;i++;break;
case 7:wei(1);P0=~nixie[Code/1000%10];i++;break;
case 8:P0=0x00;i=0;break;
}
}
/*****************************************************************************************
*参数:无
*功能:初始化定时器0,并且设置时间
*返回:无
*******************************************************************************************/
void Tim_int(void)
{
TMOD=0x01;
TH0 = 0xfc; //设置时间
TL0 = 0x66;//
TR0=1;
EA=1;//打开中断
ET0=1;
}
/*****************************************************************************************
*参数:所要延时的时间
*功能:延时
*返回:无
*******************************************************************************************/
void delay(unsigned int t)
{
while(t--);
}
/*****************************************************************************************
*参数:所要点亮的数码管
*功能:点亮数码管
*返回:无
*******************************************************************************************/
void wei(unsigned char pizz)
{
switch(pizz)
{
case 1:P2_2=1;P2_3=1;P2_4=1;break;
case 2:P2_2=0;P2_3=1;P2_4=1;break;
case 3:P2_2=1;P2_3=0;P2_4=1;break;
case 4:P2_2=0;P2_3=0;P2_4=1;break;
case 5:P2_2=1;P2_3=1;P2_4=0;break;
case 6:P2_2=0;P2_3=1;P2_4=0;break;
case 7:P2_2=1;P2_3=0;P2_4=0;break;
case 8:P2_2=0;P2_3=0;P2_4=0;break;
}
}
/*****************************************************************************************
*参数:无
*功能:扫描按键,判断是哪一个按键被按下
*返回:无
*******************************************************************************************/
unsigned char Key(void)
{
unsigned char keynum = 0;
P1=0xff;
P1_3=0;
if(P1_7==0){delay(300);while(P1_7==0){delay(200);keynum=1;}}
if(P1_6==0){delay(300);while(P1_6==0){delay(200);keynum=5;}}
if(P1_5==0){delay(300);while(P1_5==0){delay(200);keynum=9;}}
if(P1_4==0){delay(300);while(P1_4==0){delay(200);keynum=13;}}
P1=0xff;
P1_2=0;
if(P1_7==0){delay(300);while(P1_7==0){delay(200);keynum=2;}}
if(P1_6==0){delay(300);while(P1_6==0){delay(200);keynum=6;}}
if(P1_5==0){delay(300);while(P1_5==0){delay(200);keynum=10;}}
if(P1_4==0){delay(300);while(P1_4==0){delay(200);keynum=14;}}
P1=0xff;
P1_1=0;
if(P1_7==0){delay(300);while(P1_7==0){delay(200);keynum=3;}}
if(P1_6==0){delay(300);while(P1_6==0){delay(200);keynum=7;}}
if(P1_5==0){delay(300);while(P1_5==0){delay(200);keynum=11;}}
if(P1_4==0){delay(300);while(P1_4==0){delay(200);keynum=15;}}
P1=0xff;
P1_0=0;
if(P1_7==0){delay(300);while(P1_7==0){delay(200);keynum=4;}}
if(P1_6==0){delay(300);while(P1_6==0){delay(200);keynum=8;}}
if(P1_5==0){delay(300);while(P1_5==0){delay(200);keynum=12;}}
if(P1_4==0){delay(300);while(P1_4==0){delay(200);keynum=16;}}
return keynum;
}文章来源:https://www.toymoban.com/news/detail-432848.html
/*****************************************************************************************
*参数:无
*功能:判断密码
*返回:无
*******************************************************************************************/
void Password()
{
if(Code==5555)
{
P2_7=1;
delay(5000);
P2_7=0;
delay(5000);
P2_7=1;
delay(5000);
P2_7=0;
delay(5000);
P2_7=1;
}
}文章来源地址https://www.toymoban.com/news/detail-432848.html
到了这里,关于51单片机实现矩阵键盘密码锁,数码管显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!