单片机第三课——矩阵键盘 #普中单片机

矩阵键盘

开篇

此前,我们用 STC89C52RC 单片机点亮 LED,领略其魅力。现在,一起聚焦矩阵键盘,探索它与单片机的交互奥秘。

学习材料清单

要实现矩阵键盘的功能,我们需要准备以下软硬件:
        硬件:普中单片机开发板(带有矩阵键盘模块)、USB 数据线(用于供电和编程)。

        软件:Keil uVision5(用于编写和编译代码)、stc - isp(用于将程序载到单片机) 。

1.矩阵键盘工作原理

矩阵键盘是一种将多个按键按照行列形式排列的键盘结构。(如图1中红色框内)

图1

        相比于独立按键,它的优势在于能够利用较少的 I/O 端口连接更多的按键。想象一下,如果使用独立按键,每一个按键都需要占用一个 I/O 端口,那么当按键数量较多时,单片机的 I/O 端口很快就会不够用。而矩阵键盘通过行列扫描的方式,大大节省了 I/O 端口资源。

图2

        如图2为普中单片机矩阵键盘的原理图,是最常见的 4×4 矩阵键盘为例,它一共有 16 个按键。我们把键盘的行线和列线分别连接到单片机的不同 I/O 端口。(行线对应P14-P17,列线对应P10-P13)

        在扫描时,单片机先将某一行线置为低电平,其余行线置为高电平,然后读取列线的电平状态。如果某一列线的电平变为低电平,就说明在这一行和这一列交叉处的按键被按下了。比如,当第一行线置为低电平,检测到第三列线为低电平时,就可以判断出第一行第三列的按键被按下。通过依次扫描每一行和每一列,就能准确识别出被按下的按键。

2.编程操控矩阵键盘

(1)创建一个工程

如果还不会创建工程的请回顾“单片机第一课”。

(2)编写代码

理解了矩阵键盘的原理,可根据电路图可以写出扫描按键的代码。

(此处的#include "Delay.H"是因为用了模块化编程,大家可以直接在main.c中写,直接写在main.c中的话则不需要写.h文件

MatrixKey.c函数

#include <REGX52.H>
#include "Delay.H"
unsigned char MatrixKey()
{
	// 用于存储按键编号,初始值 0 表示无按键按下
	unsigned char KeyNumber=0;
	
	//第一行扫描
	//将 P1 端口初始化为高电平
	P1=0xFF;
	P1_3=0; 
	if(P1_7==0) {Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}//加Delay的目的是防止抖动
	if(P1_6==0) {Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0) {Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0) {Delay(20);while(P1_4==0);Delay(20);KeyNumber=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

/*********************************
以下为模块化的基本形式
#ifndef __函数名称_H_
#define __函数名称_H_

//在.c函数中创立的函数需在.h文件中声明
unsigned char MatrixKey();

#endif

*********************************/

 Delay.c函数

void Delay(int x)
{
	unsigned char data i, j;
	while(x)
	{
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		x--;
	}
}

Delay.h函数

#ifndef __DELAy_H__
#define __DELAY_H__

void Delay(int x);

#endif

main.c函数

#include <REGX52.H>
#include "Delay.H"//延时函数
#include "MatrixKey.H"//矩阵键盘

void main()
{
    // 存储矩阵键盘返回的按键编号
    unsigned char KeyValue;
    //无限循环,持续检测按键
	while(1)
	{
        // 调用 MatrixKey 函数获取当前按键编号
		KeyValue=MatrixKey();
		if(KeyValue != 0)
		{
			//若按下的是 1号键
            if(KeyValue == 1)
            {
                //点亮连接到 P2.0 的 LED,P2 端口除 P2.0 外其余位为高电平
                p2 = 0xFE;
            }
		}
	}
}

此段代码的效果是按下1号键P2.0的LED就会亮。

        学完矩阵按键,就让我们做一给小项目复习一下吧!项目要求为:将矩阵按键与LED联动,矩阵按键编号1~16,但对应的按键按下时,LED显示出对应的二进制状态。(如按键按键6时,LED的状态为0000 0110)效果如下。

可以参考一下其他同学的代码呀~

总结

        每一次对单片机的探索,都是一次自我成长的旅程;每一个新技能的掌握,都是向技术高峰迈进的坚实一步。希望各位在今后的学习道路上,能够始终秉持探索精神,深入挖掘单片机的无限潜力,创造出更多既有趣又实用的精彩项目!

若文章有出现纰漏还请大佬指正

作者:nck

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值