模块学习(五)——矩阵键盘

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

矩阵键盘的学习只是为了做一个简单的遥控器,主要目标还是后续的遥控器控制小车实现简单而精准的直行和转弯,加上前面的模块,锻炼自己PID的调试和理解能力。但毕竟矩阵键盘也算个模块嘛,就也记录一下,分享给有需要的同志。
(此代码是基于MSP430F5529系列,其他系列MCU均可用,自己修改引脚,配置IO口即可)

1.基本原理

矩阵键盘主要方便在16个按键只需要8个引脚即可实现控制,根据我们所学的4*4的矩阵可以很容易理解他的原理,无非就是先确定行(列),再确定列,即可确定某个具体的键位。方法自然而然也有很多种,用的比较多的就是行扫描法和列扫描法。
模块学习(五)——矩阵键盘

例如,我们确定第三行,第四列的键位该如何确定呢?我们利用行扫描法。将四个关于行的引脚设置为输出模式,四个关于列的引脚设置为输入模式(这里一定要是上拉输入)。随后,对四个关于行的引脚轮流给出低电平,给到第一行的时候,此时因为第一行的四个列引脚电平读取均为高,即证明第一行没有按键按下,当低电平给到第三行的时候,第四列电平读取为低电平,此时便可以确定是三行四列的按键按下!大概的流程便是如此。

2.上代码

/*
 * matrix_keybord.c
 *
 *  Created on: 2022年7月20日
 *      Author: S10
 */

#include "matrix_keyboard.h"
#include "oled.h"
/* 设置为列输入,行输出
 * 无入口参数
 * 无返回值
 */
void ROCI_Init(void)
{
    GPIO_setAsOutputPin(R1_Port,R1_Pin);
    GPIO_setAsOutputPin(R2_Port,R2_Pin);
    GPIO_setAsOutputPin(R3_Port,R3_Pin);
    GPIO_setAsOutputPin(R4_Port,R4_Pin);

    GPIO_setAsInputPinWithPullUpResistor(C1_Port,C1_Pin);
    GPIO_setAsInputPinWithPullUpResistor(C2_Port,C2_Pin);
    GPIO_setAsInputPinWithPullUpResistor(C3_Port,C3_Pin);
    GPIO_setAsInputPinWithPullUpResistor(C4_Port,C4_Pin);
}

/* 设置为行输入,列输出
 * 无入口参数
 * 无返回值
 */
void RICO_Init(void)
{
    GPIO_setAsInputPinWithPullUpResistor(R1_Port,R1_Pin);
    GPIO_setAsInputPinWithPullUpResistor(R2_Port,R2_Pin);
    GPIO_setAsInputPinWithPullUpResistor(R3_Port,R3_Pin);
    GPIO_setAsInputPinWithPullUpResistor(R4_Port,R4_Pin);

    GPIO_setAsOutputPin(C1_Port,C1_Pin);
    GPIO_setAsOutputPin(C2_Port,C2_Pin);
    GPIO_setAsOutputPin(C3_Port,C3_Pin);
    GPIO_setAsOutputPin(C4_Port,C4_Pin);
}

int key_scan_column(void)
{
    if(GPIO_getInputPinValue(C1_Port,C1_Pin) == GPIO_INPUT_PIN_LOW)
        return 5;
    else if(GPIO_getInputPinValue(C2_Port,C2_Pin) == GPIO_INPUT_PIN_LOW)
        return 6;
    else if(GPIO_getInputPinValue(C3_Port,C3_Pin) == GPIO_INPUT_PIN_LOW)
        return 7;
    else if(GPIO_getInputPinValue(C4_Port,C4_Pin) == GPIO_INPUT_PIN_LOW)
        return 8;
    else return 0;
}

char key_detect(void)
{
    ROCI_Init();//置为列输入,行输出

    GPIO_setOutputLowOnPin(R1_Port,R1_Pin);//设置第一行为低电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平
    OLED_ShowNum(0,0,key_scan_column(),2,10);
    if(key_scan_column() != 0)//扫描存在按键按下
    {
//        __delay_cycles(160000);
        delay_ms(10);//按键消抖
        if(key_scan_column() != 0 )//若依然判断有低电平,则确实有按键按下
        {
            switch(key_scan_column())
            {

                case 5: return '1';
                case 6: return '2';
                case 7: return '3';
                case 8: return '4';
                default:break;
            }
        }
    }
    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平

    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputLowOnPin(R2_Port,R2_Pin);//设置第二行为低电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平
    if(key_scan_column() !=0 )//扫描存在按键按下
    {
        delay_ms(10);//按键消抖
        if(key_scan_column() !=0 )//若依然判断有低电平,则确实有按键按下
        {
            switch(key_scan_column())
            {
                case 5: return '5';
                case 6: return '6';
                case 7: return '7';
                case 8: return '8';
                default: break;
            }
        }
    }
    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平

    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputLowOnPin(R3_Port,R3_Pin);//设置第三行为低电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平
    if(key_scan_column() !=0 )//扫描存在按键按下
    {
        delay_ms(10);//按键消抖
        if(key_scan_column() !=0 )//若依然判断有低电平,则确实有按键按下
        {
            switch(key_scan_column())
            {
                case 5: return '9';
                case 6: return 'a';
                case 7: return 'b';
                case 8: return 'c';
                default: break;
            }
        }
    }
    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平

    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputLowOnPin(R4_Port,R4_Pin);//设置第四行为低电平
    if(key_scan_column() != 0 )//扫描存在按键按下
    {
        delay_ms(10);//按键消抖
        if(key_scan_column() != 0 )//若依然判断有低电平,则确实有按键按下
        {
            switch(key_scan_column())
            {
                case 5: return 'd';
                case 6: return 'e';
                case 7: return 'f';
                case 8: return 'g';
                default: break;
            }
        }
    }
    GPIO_setOutputHighOnPin(R1_Port,R1_Pin);//设置第一行为高电平
    GPIO_setOutputHighOnPin(R2_Port,R2_Pin);//设置第二行为高电平
    GPIO_setOutputHighOnPin(R3_Port,R3_Pin);//设置第三行为高电平
    GPIO_setOutputHighOnPin(R4_Port,R4_Pin);//设置第四行为高电平

    return '0';
}

/*
 * matrix_keyboard.h
 *
 *  Created on: 2022年7月20日
 *      Author: S10
 */

#ifndef MATRIX_KEYBOARD_H_
#define MATRIX_KEYBOARD_H_

#include "driverlib.h"

#define C1_Port GPIO_PORT_P1
#define C1_Pin  GPIO_PIN6

#define C2_Port GPIO_PORT_P6
#define C2_Pin  GPIO_PIN6

#define C3_Port GPIO_PORT_P3
#define C3_Pin  GPIO_PIN2

#define C4_Port GPIO_PORT_P2
#define C4_Pin  GPIO_PIN7

#define R1_Port GPIO_PORT_P6
#define R1_Pin  GPIO_PIN2

#define R2_Port GPIO_PORT_P6
#define R2_Pin  GPIO_PIN3

#define R3_Port GPIO_PORT_P6
#define R3_Pin  GPIO_PIN4

#define R4_Port GPIO_PORT_P7
#define R4_Pin  GPIO_PIN0

#define CPU_CLOCK       16000000
#define delay_us(us)    __delay_cycles(CPU_CLOCK/1000000*(us))
#define delay_ms(ms)    __delay_cycles(CPU_CLOCK/1000*(ms))

void ROCI_Init(void);
void RICO_Init(void);
int key_scan_column(void);
char key_detect(void);


#endif /* MATRIX_KEYBOARD_H_ */

在主函数中直接调用即可,有不懂的地方可以在评论区提出来或者私信我,知无不答!文章来源地址https://www.toymoban.com/news/detail-504528.html

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

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

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

相关文章

  • STM32学习笔记——3*3矩阵键盘

    STM32学习笔记——3*3矩阵键盘

    1. 键盘的焊接 键盘正面 键盘背面 键盘原理图: 3*3的矩阵键盘共计三行三列,所以共计需要六个阵脚,每一行/每一列连接相应的一个阵脚。 制作注意事项: 要注意开关的四个针脚,了解清楚哪两个针脚之间是连通的。     四角按键开关原理可以参考博客: 四脚按键开关

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

    51单片机学习笔记-4矩阵键盘

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

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

    51单片机学习--矩阵键盘、电子密码锁

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

    2024年02月16日
    浏览(22)
  • 【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

    【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

    一.基础知识 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 矩阵键盘和独立按键一样,也需要进行消抖处理! 于此补充一下抖动的含义: 对于机械开关,当机械触点断开、闭合时,

    2023年04月09日
    浏览(10)
  • 【Python_Selenium学习笔记(四)】基于Selenium模块实现键盘操作

    【Python_Selenium学习笔记(四)】基于Selenium模块实现键盘操作

    在 Selenium 模块中,提供了一个 Keys 类,来处理键盘操作; 在 Selenium 模块中,使用 send_keys() 方法,来模拟键盘输入, 此篇文章主要介绍如何使用 Keys 类 和 send_keys() 方法 实现 模拟键盘操作,并以具体的示例进行展示。 Keys类键盘事件 实现功能 Keys.BACK_SPACE 删除键 Keys.SPACE 空

    2023年04月09日
    浏览(10)
  • 这个牛逼的Python模块,能让你轻松模拟并记录键盘操作(附零基础学习资料)

    这个牛逼的Python模块,能让你轻松模拟并记录键盘操作(附零基础学习资料)

    模拟键盘操作执行自动化任务,我们常用的有 pyautowin 等自动化操作模块。但是这些模块有一个很大的缺点,编译的时候非常依赖 windows 的C语言底层模块。 (文末送福利) 今天介绍的这个模块叫做 keyboard 它有一个最大的优点:纯Python原生开发,编译时完全不需要依赖C语言模

    2024年02月13日
    浏览(10)
  • 蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    此片文章用于记录蓝桥杯单片机的学习 篮球杯单片机上的矩阵按键原理图如下:   使用矩阵键盘时,要将跳线帽J5跳至KBD模式。   值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。  

    2023年04月10日
    浏览(11)
  • 游戏不再只是娱乐,更成为了一种学习和成长的途径

    随着科技的飞速发展和游戏设计的创新,当下的游戏行业正经历着前所未有的繁荣时代。各种各样的游戏类型在不断涌现,为玩家们带来了丰富多彩的娱乐体验。这些火热的游戏类型不仅改变了我们的娱乐方式,还在无形中影响了我们的生活。 多元游戏类型,满足多样需求

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

    51单片机(六)矩阵键盘和矩阵键盘密码锁

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

    2024年02月04日
    浏览(15)
  • 【STC89C52】独立键盘和矩阵键盘

    【STC89C52】独立键盘和矩阵键盘

    今天我分享的是基于STC89C52的独立键盘与矩阵键盘实验的学习笔记。希望对你有所帮助! 目录 一、原理图分析  二、独立键盘 三、矩阵键盘 键盘在现实生活中很常见,手机的虚拟键盘,电脑的实体键盘。 键盘是由一个个按键构成,按键常态下与两端触点断开,按下时与两端

    2023年04月12日
    浏览(6)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包