基于51单片机的矩阵键盘(线反转法)

这篇具有很好参考价值的文章主要介绍了基于51单片机的矩阵键盘(线反转法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.矩阵键盘简介

矩阵键盘使用的方法与独立按键类似,但是比独立按键节省I/O,同时使用方法变得相对复杂了,首先展示硬件连接。
基于51单片机的矩阵键盘(线反转法)
上图所示就是4X4矩阵键盘的常见接法,按行来看,每个按键的左端接在一起,按列来看,每个按键的右端接在一起,共占用8个I/O,接到51单片机的P1端口。

2.代码解释

对于矩阵键盘,常用的方法有两种,一个是线反转法,另一个是行列扫描法,本文介绍线反转法。首先插入模块化编程编程的内容,新建两个文件命名为keyboard.h与keyboard.c并添加到工程中,然后在h文件中定义一个宏,便于与硬件连接发生改变时而进行代码的修改。编程思路,首先给矩阵键盘的端口Matrixkey_Port赋值0x0F,意为行为1列为0,即0000 1111,对应上图就是P10,P11,P12,P13为1,P14,P15,P16,P17为0,那么此时如果第一行有按键按下,P10这一位的高电平必然被拉低,1 & 0 = 0,P1就会变成0X0E,第二,三,四行亦如此,然后进行反推,当检测到这些值的出现时就可以知道是哪一行有按键按下,记录下行值,row就是行值,再给矩阵键盘的端口Matrixkey_Port赋值0xF0,意为行为0列为1,即1111 0000,对应上图就是P10,P11,P12,P13为0,P14,P15,P16,P17为1,与第一次反推类似,可以得到列值col,在下文的程序中,只要将row,col进行运算就能得到1-16的返回值。row的值是1 2 3 4,col的值是1 2 3 4,而键盘编码如下:
/1 2 3 4/
/5 6 7 8/
/9 10 11 12/
/13 14 15 16/
显然,返回值1-16与行列的关系是(row-1)*4+col。
keyboard.h

#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#define Matrixkey_Port P1
unsigned char Matrixkey_Scan(void);
#endif

keyboard.h

#include <reg52.h>
#include "keyboard.h"
#include "delay.h"
//按键按下返回键值(1-16)没有按下返回0
unsigned char Matrixkey_Scan(void)
{
	unsigned char temp,row=0,col=0,i=0;
	Matrixkey_Port=0x0f;//行为1列为0 0000 1111 ->0x0f
	/*第一行若有按键按下 0000 1110 ->0x0e*/
	/*第二行若有按键按下 0000 1101 ->0x0d*/
	/*第三行若有按键按下 0000 1011 ->0x0b*/
	/*第四行若有按键按下 0000 0111 ->0x07*/
	Delay_xms(1);
	temp=Matrixkey_Port;
	if(temp!=0x0f)//说明有按键按下
	{
		if(temp==0x0e)row=1;
		else if(temp==0x0d)row=2;
		else if(temp==0x0b)row=3;
		else if(temp==0x07)row=4;
		Matrixkey_Port=0xf0;//行为0列1 1111 0000->0xf0
		temp=Matrixkey_Port;
		if(temp!=0xf0)//说明有按键按下
		switch(temp)
		{
			/*第一列若有按键按下 0111 0000 ->0x70*/
			/*第二列若有按键按下 1011 0000 ->0xb0*/
			/*第三列若有按键按下 1101 0000 ->0xd0*/
			/*第四列若有按键按下 1110 0000 ->0xe0*/
			case 0xe0:col=1;break;
			case 0xd0:col=2;break;
			case 0xb0:col=3;break;
			case 0x70:col=4;break;
			default:break;
		}
		while(Matrixkey_Port!=0xf0&&i<255)//按键松开与超时判断
		{
			Delay_xms(1);
			i++;
		}
	}
	if(row!=0&&col!=0) return ((row-1)*4+col);
	else return 0;
}

3.完整工程

本次工程包含的文件如下:
main.c

#include <reg52.h>
#include "delay.h"
#include "lcd1602.h"
#include "keyboard.h"
#define u8 unsigned char
u8 keynum,a;
void main()
{
	LCD1602_Init();
	while(1)
	{	
		keynum=Matrixkey_Scan();
		if(keynum!=0) 
		{
			LCD1602_Dis_dat(0,0,keynum);
			LCD1602_Dis_dat(1,0,a);
			a++;
		}		
	}
}

delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
//延时100us
void Delay_100us();   
//x=1时,大约延时50us
void Delay_50xus(unsigned int x); 
//x=1时,大约延时1ms
void Delay_xms(unsigned int x);

#endif

delay.c

#include "delay.h"
#include <intrins.h>

void Delay_100us()
{
	unsigned char i;
	_nop_();
	i=47;
	while(--i);
}
void Delay_50xus(unsigned int x)
{
	unsigned int i,j;
	for(i=x;i>0;i--)
	    for(j=19;j>0;j--);
}
void Delay_xms(unsigned int x)
{
	unsigned int i,j;
	for(i=x;i>0;i--)
	    for(j=123;j>0;j--);
}

lcd1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__
//LCD1602写命令函数
void LCD1602_W_Cmd(unsigned char cmd);
//LCD1602写数据函数
void LCD1602_W_Dat(unsigned char dat);
//判忙函数,最高位位1即为忙
void LCD1602_BusyCheck();
//LCD1602初始化函数
void LCD1602_Init();
//LCD1602在指定位置显示字符hang:0-1,lie:0-15
void LCD1602_Dis_char(unsigned char hang,unsigned char lie,unsigned char ch);
//LCD1602在指定位置显示两位数据,比如20
void LCD1602_Dis_dat(unsigned char hang,unsigned char lie,unsigned char dat);
//LCD1602在指定位置显示字符串
void LCD1602_Dis_string(unsigned char hang,unsigned char lie,unsigned char *str);

#endif

lcd1602.c

#include <reg52.h>
#include "lcd1602.h"
#include "delay.h"

#define LCD1602_Port P2

sbit LCD1602_RS=P3^5;
sbit LCD1602_RW=P3^6;
sbit LCD1602_EN=P3^7;

unsigned char LCD1602_Temp;
unsigned char LCD1602[]="LCD1602 Test Ok!";

void LCD1602_BusyCheck()
{
	LCD1602_Port=0xff;
	LCD1602_RS=0;
	LCD1602_RW=1;
	while(1)
	{
		LCD1602_EN=1;
		LCD1602_Temp=LCD1602_Port;
		LCD1602_EN=0;
		if((LCD1602_Temp & 0x80)==0)break;
	}
}
void LCD1602_W_Cmd(unsigned char cmd)
{
	LCD1602_BusyCheck();
	LCD1602_EN=0;
	LCD1602_RS=0;
	LCD1602_RW=0;
	LCD1602_Port=cmd;
	LCD1602_EN=1;
	Delay_xms(1);
	LCD1602_EN=0;
}
void LCD1602_W_Dat(unsigned char dat)
{
	LCD1602_BusyCheck();
	LCD1602_EN=0;
	LCD1602_RS=1;
	LCD1602_RW=0;
	LCD1602_Port=dat;
	LCD1602_EN=1;
	Delay_xms(1);
	LCD1602_EN=0;
}
void LCD1602_Init()
{
	Delay_xms(15);         //延时15ms
	LCD1602_W_Cmd(0x38);   //不检测忙信号
	Delay_xms(5);          //延时5ms
	LCD1602_W_Cmd(0x38);   //不检测忙信号
	Delay_xms(5);          //延时5ms
	
	LCD1602_W_Cmd(0x38);   //不检测忙信号
	LCD1602_W_Cmd(0x38);   //显示模式设置
	LCD1602_W_Cmd(0x08);   //显示关闭
	LCD1602_W_Cmd(0x01);   //显示清屏
	LCD1602_W_Cmd(0x06);   //显示光标移动设置,光标右移
	LCD1602_W_Cmd(0x0C);   //显示开及光标设置,光标关,闪烁关
}
void LCD1602_Dis_char(unsigned char hang,unsigned char lie,unsigned char ch)
{
	if(hang==0){ LCD1602_W_Cmd(0x80+lie);}
	if(hang==1){ LCD1602_W_Cmd(0xC0+lie);}
	LCD1602_W_Dat(ch);	
}
void LCD1602_Dis_dat(unsigned char hang,unsigned char lie,unsigned char dat)
{
	unsigned char shi,ge;
	shi=dat/10%10+0x30;
	ge=dat%10+0x30;
	LCD1602_Dis_char(hang,lie,shi);
	LCD1602_Dis_char(hang,lie+1,ge);
}
void LCD1602_Dis_string(unsigned char hang,unsigned char lie,unsigned char *str)
{
	unsigned char a;
	if(hang==0)a=0x80;
	if(hang==1)a=0xC0;
	a=a+lie; //hang:0-1,lie:0-15
	LCD1602_W_Cmd(a);
	while(*str!='\0')
	{
		LCD1602_W_Dat(*str);
	  str++;
	}
}

4.仿真图

基于51单片机的矩阵键盘(线反转法)
5.资料包
基于Peoteus仿真的4X4矩阵键盘文章来源地址https://www.toymoban.com/news/detail-508295.html

到了这里,关于基于51单片机的矩阵键盘(线反转法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机入门——矩阵键盘(附51代码)

    硬件如图非常简单,将一个4*4的矩阵键盘的8个管脚引到端子上,在连接到8个I/O口上,ARRAY_H代表着行,ARRAY_L代表着列,当行与列的电平都置低的时候,就选中的相应的矩阵按键,比如当s1按下时,ARRAY_H1会置低,其他ARRAY_H给高电平,那么选中的就是第一行,然后到列,ARRAY_

    2024年02月11日
    浏览(40)
  • 51单片机(六)矩阵键盘和矩阵键盘密码锁

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月04日
    浏览(49)
  • 6.51单片机之矩阵键盘

    👻 1.矩阵键盘的介绍 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。 结构:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条

    2024年02月07日
    浏览(42)
  • 51单片机学习笔记-4矩阵键盘

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。采用逐行或逐列的“扫描”,就可以读

    2024年02月06日
    浏览(52)
  • 51单片机矩阵键盘——LCD1602显示

    本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86404949 使用矩阵键盘随意按下按键,LCD1602第二行前两位就会显示对应按键按下的数字。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用

    2023年04月09日
    浏览(42)
  • 51单片机实现矩阵键盘密码锁

    使用51单片机的矩阵键盘模块以及led1602显示屏,实现模拟密码锁。 当程序烧录到单片机中后,led1602屏幕会显示文字。 第一行会显示单词“PASSWORD”,第二行显示4个0,表示我们要写入的四位密码,每位默认为0。 矩阵键盘前两行与第三行的前两个分别代表输入1-9与0,第三行第

    2024年02月03日
    浏览(55)
  • 51单片机矩阵键盘——数码管显示

    当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了。 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0;按下矩阵键盘S2并松开,数码管第一位显示1;...按下矩阵键盘S16并松开,数码管第一位显示F; 矩阵键盘扫描(输入扫描)     原理:

    2024年02月11日
    浏览(52)
  • 如何在51单片机上实现矩阵键盘功能

    本文详细介绍了在51单片机上实现矩阵键盘功能的方法,包括按键检测、消抖处理和键值映射等关键步骤。通过本文的学习,你将能够掌握在嵌入式系统中处理矩阵键盘输入的技术。

    2024年04月10日
    浏览(95)
  • 51单片机矩阵键盘扫描及使用方法

             矩阵键盘 ,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设。 (图片截取至普中A2开发板原理图) (图片截取至普中A2开发板实物图)         我们知道,一个独立按键需要1个IO口。但是如果我们需要大量的按键,则需要大量的IO口,但是单片机

    2024年02月02日
    浏览(36)
  • 51单片机学习--矩阵键盘、电子密码锁

    矩阵键盘的模块原理图: 功能:按下矩阵按键,在LCD上显示对应的数值。 采用模块化编程,在此只给出MatrixKey.c 和 main.c 两部分代码 这里要注意必须先判断KeyNum是否为0,否则while不断循环会不断显示0,导致看不到按下按钮显示的数字 要利用写好的矩阵键盘来制作一个密码锁

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包