单片机矩阵键盘

文章介绍了矩阵键盘的使用,特别是在按键数量多时如何通过扫描方法减少对I/O口的占用。扫描原理包括数码管的输出扫描和矩阵键盘的输入扫描,两者都旨在节省资源。提供的C代码示例展示了如何在单片机中实现矩阵键盘的扫描功能,检测按键状态。
摘要由CSDN通过智能技术生成

矩阵键盘介绍

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

扫描的概念

  • 数码管扫描(输出扫描)
    原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果

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

以上两种扫描方式的共性:节省I/O口

matrixkey.c:

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

unsigned char matrixkey()
{
	unsigned char number=0;
	P1=0xff;
	P1_7=0;
	if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=1;}
	if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=2;}
	if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=3;}
	if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=4;}
	
	P1=0xff;
	P1_6=0;
	if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=5;}
	if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=6;}
	if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=7;}
	if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=8;}
	
	P1=0xff;
	P1_5=0;
	if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=9;}
	if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=10;}
	if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=11;}
	if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=12;}
	
	P1=0xff;
	P1_4=0;
	if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=13;}
	if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=14;}
	if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=15;}
	if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=16;}
	
	
	return number;
	

}

main.c:

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

unsigned char key;
void main()
{
	
	
	LCD_Init();
	LCD_ShowString(1,1,"matrixkey:");
	while(1)
	{
		key=matrixkey();
		if(key!=0)
			LCD_ShowNum(2,1,key,2);
		
	}
}

注释

/**
  * @brief  解释代码作用
  * @param  参数说明
  * @param  参数说明
  * @param  参数说明
  ...
  * @retval 返回值
  */
/**
  * @brief  在LCD1602指定位置开始以二进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  * @param  Length 要显示数字的长度,范围:1~16
  * @retval 无
  */
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值