51单片机-矩阵键盘

51单片机-矩阵键盘51单片机,学习,交流….

目录

1.硬件设计

2.软件设计

2.1.矩阵键盘扫描

2.2.矩阵键盘-密码锁

3.知识点

3.1.模块化编程的应用

3.2.#include详解


1.硬件设计

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

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

51单片机-矩阵键盘

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"//查找"当前工作目录",应用自己编辑好的程序文件

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38856.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注