项目三简易计算器 任务3-5六位密码锁

本文介绍了一个使用单片机连接8位共阳极数码管和4*4矩阵键盘的六位密码锁项目。编程实现了一位密码校验功能,当密码正确时显示“HELLO”,错误时显示“ERROR”。由于实际使用的是四位数码管,因此需注意P2口的高低四位设置。
摘要由CSDN通过智能技术生成

任务描述:单片机连接8位共阳极数码管和4*4矩阵键盘,
                    编程完成一位密码校验,结果正确显示“HELLO”,结果错误显示“ERROR”

六位密码锁讲解

1b517add72dc4f2481d6ac6414624234.png

/*************************
项目名称:项目三简易计算器
任务名称:任务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);
		}
	}
}

132d432b9ae14cc9b919fea2e350d921.png12c89f1aeb24429da11efab3171fc50a.png3b815e9d5a30496d91a83b415fcd5ccb.png06e7f6427e654611aa6edfc0afd61900.pngfd63147ccfa74a9088131707ffbb1257.png0b755d3bd2f940178bd8d5656d1a3a16.png

 

 

又因为实际实验是四位数码管,所以

/*************************
项目名称:项目三简易计算器
任务名称:任务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。

c231ad27058a450899904ee721933b60.png

 

6016bae4ce9140ee9a812e58e0ca58ed.png61d11e26d52443179db1af949c50f72b.png752b2c8461e342e9a95b37b2d7592483.png307b5587433d4f29b03259b753034ba6.png

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的甲方

你的鼓励是我博文创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值