51单片机-矩阵键盘

本文介绍了使用矩阵键盘进行硬件设计和软件编程,以实现密码锁功能。硬件部分通过矩阵键盘减少I/O口占用,软件部分采用逐列扫描方式检测按键,并在LCD1602上显示键码。在密码锁应用中,程序能接收并验证4位密码,支持确认和清除操作。模块化编程和#include预处理命令在代码中得到体现,增强了代码的可读性和可维护性。
摘要由CSDN通过智能技术生成

目录

1.硬件设计

2.软件设计

2.1.矩阵键盘扫描

2.2.矩阵键盘-密码锁

3.知识点

3.1.模块化编程的应用

3.2.#include详解


1.硬件设计

矩阵键盘按键数量较多,为了减少I/O口的占用,通常将按键排列成矩阵形式,采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态

扫描原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果

2.软件设计

2.1.矩阵键盘扫描

功能需求:矩阵键盘扫描,LCD1602显示键码

程序设计:首先,确定扫描方式,此处选用逐列扫描;其次,确定驱动方式,单片机的IO口的模式是一种弱上拉模式(输出0时,驱动能力较强);

MatrixKey.c文件

#include <REGX52.H>
#include"Delay.h"

//*逐列扫描
unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;//P1口全部置高电平
	P1_3=0;//P1_3低电平
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}//如果P1_7也置低电平,按键1导通
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}//如果P1_6也置低电平,按键5导通
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}//如果P1_5也置低电平,按键9导通
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}//如果P1_4也置低电平,按键13导通
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}

MatrixKey.h文件

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__

unsigned char MatrixKey();

#endif

main.c文件

#include <REGX52.H>
#include"LCD1602.h"//引用LCD1602头文件
#include"MatrixKey.h"//引用MatrixKey头文件

unsigned char KeyNum;//定义一个字符KeyNum,其实就是我们想要的键码
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"MatrixKey:");//第1行,第1列,显示字符串"MatrixKey:"
	while(1)
	{
		KeyNum=MatrixKey();//将KeyNum等于我们已经定义好的矩阵键盘程序
		if(KeyNum)//如果有按键按下
		{
			LCD_ShowNum(2,1,KeyNum,2);//在第2行,第1列,显示对应的按键码
		}
	}
}

2.2.矩阵键盘-密码锁

功能需求:用矩阵键盘,做一个简易密码锁

程序设计:首先,确认所需按键,需要用到的按键1~10(密码区),11确认键,12清除键;那如何程序如何设计呢?

main.c文件

#include <REGX52.H>
#include"Delay.h"
#include"LCD1602.h"
#include"MatrixKey.h"

unsigned char KeyNum;
unsigned int Password,Count;
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"Password:");//定义字符创“Password:”
	while(1)
	{
		KeyNum=MatrixKey();
		if(KeyNum)//如果按键按下
		{
			if(KeyNum<=10)//密码区:如果S1-S10按键按下,输入密码
			{
				if(Count<4)//密码位:定义为4位密码(int整型的数值范围0-65535;如果定义6为密码会超出int范围)
				{
					Password*=10;//密码每输入一位,密码左移一位
					Password+=KeyNum%10;//取与的目的,主要是要将S10按键定义为数字0
                    Count++;//没输入一次密码,计次+1
				}
			}
			LCD_ShowNum(2,1,Password,4);//更新显示
			if(KeyNum==11)//如果按下按键S11
			{
				if(Password==1229)//如果密码是1299
				{
					LCD_ShowString(1,10,"OK ");//那LCD的第1行,第10列显示OK
					Password=0;//密码清零
					Count=0;//计次清零
					LCD_ShowNum(2,1,Password,4);//更新显示
				}
				else
				{
					LCD_ShowString(1,10,"ERR");//否则显示ERR
					Password=0;
					Count=0;
					LCD_ShowNum(2,1,Password,4);
				}
			}
			if(KeyNum==12)//如果按下按键S12
			{
					Password=0;//密码清零
					Count=0;//计次清零
					LCD_ShowNum(2,1,Password,4);更新显示
			}
		}
	}
}

3.知识点

3.1.模块化编程的应用

  • 在密码锁的代码中,主要用到的模块函数有<REGX52.H>,"LCD1602.h","MatrixKey.h";
  • 模块化编程的主要优势是,模块管理,逻辑清晰,可移植等
#include <REGX52.H>
#include"LCD1602.h"
#include"MatrixKey.h"

3.2.#include详解

  • 作用:叫做文件包含命令,用来引入对应的头文件(.h文件);#include 也是C语言预处理命令的一种。
  • 处理过程:就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。
  • 用法:主要有两种,如下:
#include <REGX52.H>//查找<系统目录>,引用系统自带的程序文件
#include"LCD1602.h"//查找"当前工作目录",应用自己编辑好的程序文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李十懿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值