任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,
编程完成一位密码校验,结果正确显示“HELLO”,结果错误显示“ERROR”
六位密码锁讲解
/*************************
项目名称:项目三简易计算器
任务名称:任务3-5六位密码锁
任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,
编程完成一位密码校验,结果正确显示“HELLO”,结果错误显示“ERROR”
*************************/
#include<reg51.h>
#include<intrins.h>
//51单片机寄存器定义头文件
sbit row0=P1^0;
sbit row1=P1^1;
sbit row2=P1^2;
sbit row3=P1^3;
sbit col0=P1^4;
sbit col1=P1^5;
sbit col2=P1^6;
sbit col3=P1^7;
int n;//存放按键编号(用户输入的密码)
int t;//存放系统预留密码
int m1[]={0x89,0x86,0xc7,0xc7,0xc0};//HELLO
int m2[]={0x86,0x88,0x88,0xc0,0x88};//ERROR
int dis[2];//存放结果的十位和个位
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
void key1();//等待按键按下,无限查询
void key2();//扫描按键位置,行列扫描
void key3();//处理按键请求,显示编号
void display();//显示HELLO或者ERROR
/**********************************************/
void delay(int i)
{
int k,j;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
/**********************************************/
void main()
{
while(1)
{
key1();
key2();
key3();
}
}
/**********************************************/
void key1()
{
while(1)
{
P1=0x0f;
if(P1!=0x0f)//有变化,一定是有按键按下,导致某行某列短路
delay(10);//延时10毫秒,去掉按键抖动
if(P1!=0x0f)
break;//退出查询
}
}
/**********************************************/
void key2()
{
P1=0xff;//行列都写1
col0=0;//清零0列
if(row0==0) n=0;
if(row1==0) n=1;
if(row2==0) n=2;
if(row3==0) n=3;
P1=0xff;//行列都写1
col1=0;//清零1列
if(row0==0) n=4;
if(row1==0) n=5;
if(row2==0) n=6;
if(row3==0) n=7;
P1=0xff;//行列都写1
col2=0;//清零2列
if(row0==0) n=8;
if(row1==0) n=9;
if(row3==0){t=n;n=10;}//确认键:保存用户输入密码,键值10
}
/**********************************************/
void key3()
{
if(n<10)//按下数字键,显示数字
{
P2=0xfe;//1111 1110
P0=seg[n];
}
else//按下等号键
display();//显示两位结果
}
/**********************************************/
void display()
{
int i,j;
while(1)
{
for(i=0,j=0x7f;i<5;i++)//0111 1111
{
P2=j;
if(t==7)
P0=m1[i];//取HELLO
else
P0=m2[i];//ERROR
delay(2);
j=_cror_(j,1);
}
}
}
又因为实际实验是四位数码管,所以
/*************************
项目名称:项目三简易计算器
任务名称:任务3-5六位密码锁
任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,
编程完成一位密码校验,结果正确显示“HELLO”,结果错误显示“ERROR”
姓名日期:物联网2202黄杉,2024-04-19
*************************/
#include<reg51.h>
#include<intrins.h>
//51单片机寄存器定义头文件
sbit row0=P1^0;
sbit row1=P1^1;
sbit row2=P1^2;
sbit row3=P1^3;
sbit col0=P1^4;
sbit col1=P1^5;
sbit col2=P1^6;
sbit col3=P1^7;
int n;//存放按键编号(用户输入的密码)
int t;//存放系统预留密码
int m1[]={0x89,0x86,0xc7,0xc0};//HELO
int m2[]={0x86,0x88,0xc0,0x88};//EROR
int dis[2];//存放结果的十位和个位
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
void key1();//等待按键按下,无限查询
void key2();//扫描按键位置,行列扫描
void key3();//处理按键请求,显示编号
void display();//显示HELLO或者ERROR
/**********************************************/
void delay(int i)
{
int k,j;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
/**********************************************/
void main()
{
while(1)
{
key1();
key2();
key3();
}
}
/**********************************************/
void key1()
{
while(1)
{
P1=0x0f;
if(P1!=0x0f)//有变化,一定是有按键按下,导致某行某列短路
delay(10);//延时10毫秒,去掉按键抖动
if(P1!=0x0f)
break;//退出查询
}
}
/**********************************************/
void key2()
{
P1=0xff;//行列都写1
col0=0;//清零0列
if(row0==0) n=0;
if(row1==0) n=1;
if(row2==0) n=2;
if(row3==0) n=3;
P1=0xff;//行列都写1
col1=0;//清零1列
if(row0==0) n=4;
if(row1==0) n=5;
if(row2==0) n=6;
if(row3==0) n=7;
P1=0xff;//行列都写1
col2=0;//清零2列
if(row0==0) n=8;
if(row1==0) n=9;
if(row3==0){t=n;n=10;}//确认键:保存用户输入密码,键值10
}
/**********************************************/
void key3()
{
if(n<10)//按下数字键,显示数字
{
P2=0xfe;//1111 1110
P0=seg[n];
}
else//按下等号键
display();//显示两位结果
}
/**********************************************/
void display()
{
int i,j;
while(1)
{
for(i=0,j=0xf7;i<4;i++)//0111 1111
{
P2=j;
if(t==7)
P0=m1[i];//取HELLO
else
P0=m2[i];//ERROR
delay(5);
j=_cror_(j,1);
}
}
}
注意 如果P2选择低四位,则P2=0xfe,P2=0xf7;
高四位则为P2=0xef,P2=0x7f。