【单片机】STM32单片机的矩阵键盘驱动,标准库,无阻塞方式的矩阵键盘读取

news2024/11/19 19:46:14

原理图:
在这里插入图片描述

从左到右、从上到下,按键是1到16,没有按键返回0:
key.c

#include "key.h"

/* 按键初始化函数 */
void KEY_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                          /* 使能时钟 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;       /* key */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                                        /* 设置成上拉输入 */
    GPIO_Init(GPIOB, &GPIO_InitStructure);                                                                /* 初始化GPIO */

    GPIO_InitStructure.GPIO_Pin =
            GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;                 //LED2-->PC13 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化PC13


}

#define OUT1 PBout(8)
#define OUT2 PBout(9)
#define OUT3 PBout(10)
#define OUT4 PBout(11)

#define IN1  PBin(12)
#define IN2  PBin(13)
#define IN3  PBin(14)
#define IN4  PBin(15)


u8 read_key(void) {
    OUT1 = 0, OUT2 = 1, OUT3 = 1, OUT4 = 1;
    if (IN1 == 0) {
        //while (IN1 == 0);
        return (1);
    } else if (IN2 == 0) {
        //while (IN2 == 0);
        return (5);
    } else if (IN3 == 0) {
        //while (IN3 == 0);
        return (9);
    } else if (IN4 == 0) {
        //while (IN4 == 0);
        return (13);
    }

    OUT1 = 1, OUT2 = 0, OUT3 = 1, OUT4 = 1;
    if (IN1 == 0) {
        //while (IN1 == 0);
        return (2);
    } else if (IN2 == 0) {
        //while (IN2 == 0);
        return (6);
    } else if (IN3 == 0) {
        //while (IN3 == 0);
        return (10);
    } else if (IN4 == 0) {
        //while (IN4 == 0);
        return (14);
    }

    OUT1 = 1, OUT2 = 1, OUT3 = 0, OUT4 = 1;
    if (IN1 == 0) {
        //while (IN1 == 0);
        return (3);
    } else if (IN2 == 0) {
        //while (IN2 == 0);
        return (7);
    } else if (IN3 == 0) {
        //while (IN3 == 0);
        return (11);
    } else if (IN4 == 0) {
        //while (IN4 == 0);
        return (15);
    }

    OUT1 = 1, OUT2 = 1, OUT3 = 1, OUT4 = 0;
    if (IN1 == 0) {
        //while (IN1 == 0);
        return (4);
    } else if (IN2 == 0) {
        //while (IN2 == 0);
        return (8);
    } else if (IN3 == 0) {
        //while (IN3 == 0);
        return (12);
    } else if (IN4 == 0) {
        //while (IN4 == 0);
        return (16);
    }


    return (0); /* 无按键按下 */
}

//非阻塞型读矩阵键盘按键值
u8 read_key_2(u8 mode) {
    static u8 key_up = 1; //按键按松开标志
    if (mode)key_up = 1;  //支持连按
    if (key_up && (read_key() != 0)) {
        delay_ms(10); //去抖动
        key_up = 0;
        return (read_key());
    } else if (read_key() == 0)key_up = 1;
		return 0;
}


key.h

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"


 
void KEY_Init(void);//IO初始化

u8 read_key(void);  	//按键扫描函数					   
u8 read_key_2(u8 mode);

#endif

main.c调用示例:

void main(void)
{
    while (1) {
        delay_ms(5);

        t++;
        if (t > 50) {
            t = 0;
            LED0=!LED0;
        }

        key=read_key_2(0);
        if(key)
        {
            process_key(key);
            dis_cnt=0;
            display_str[dis_cnt++]=key/10+'0';
            display_str[dis_cnt++]=key%10+'0';
            display_str[dis_cnt++]=0;
            OLED_P8x16Str(0,2,display_str,0);//正常显示
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/694284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端发送html字符串文本给后端,转PDF格式不正确

大无语事件,前端使用原始html table写出来在前端显示一直正确,但是一发给后端转PDF就失败(如图)。 想着是不是因为前端转义的问题,后来发现转不转的无所谓,然后发现后端本地转PDF也成功,但是通…

深入浅出设计模式 - 模板方法模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…

修复u盘怎么做?4步快速完成u盘修复!

我的u盘用了好多年了,里面存了很多重要的照片。但最近不知道为什么我的u盘出现了各种问题,大家有什么修复u盘的好方法吗?或者我应该怎么样才能恢复我U盘里的重要数据呢? U盘作为一个便捷的存储工具,为我们保存数据提供…

SpringBoot整合SpringSecurity

一、概述 1.1 Spring Security和Shiro Spring Security 是Spring家族中的一个安全管理框架。 相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。 小项目有Shi…

ChatGPT:开放AI平台的最新进展和功能

第一章:引言 在过去的几年中,人工智能技术取得了长足的发展,其在各个领域的应用也日益广泛。而在AI技术中,自然语言处理(NLP)一直是备受关注的领域之一。ChatGPT作为OpenAI的开放AI平台上的一项重要技术&am…

【Duilib】通过xml文件布局界面

环境 VS版本:VS2013 概述 上一篇 【Duilib】入门 ,简单介绍了Duilib库的使用,这一篇测试一下通过xml布局界面。 步骤 1、创建工程 以 Win32\Win32项目 为模板创建TestByXml工程,步骤与上一篇基本一致。 2、创建MainWndFrame&a…

简单分享在微信上怎么实现分销功能

小程序分销开发怎么做?在如今的电商市场中,小程序分销成为了一种新兴的销售模式,通过分销模式,商家能够借助分销商的力量提高销售额,同时分销商也能不用投入大量资金和时间,就能在小程序上进行销售。那么&a…

FL Studio21中文版音频宿主软件下载教程

FL Studio是很适合新手上手的宿主软件,这得益于FL Studio独特的编曲逻辑。水果可以允许我们不使用音轨的思路来编曲。在FL Studio中我们创建一个pattern后,可以添加乐器或采样进去进行编写,编写完善后将Pattern拖进播放列表进行编排。不用区分…

高性能计算可以自学么?自学学完高性能计算能就业吗

随着超算互联网的认知越来越深,越来越多同学意识到高性能计算是未来有可能最好的就业方向之一。 高性能计算因其更偏底层、更不易被替代,因此广受广大大学生朋友和在职程序员的青睐。那么自学高性能计算可行吗?高性能计算可以自学吗&#xff…

2023年Java 毕业设计怎么选题,有哪些注意事项

个人简介:程序员徐师兄,7 年大厂程序员经历,擅长Java、微信小程序、Python、Android等,大家有这一块的问题可以一起交流! 各类成品java毕设 。javaweb,ssh,ssm,springboot等等项目框…

Microsoft Visual Studio × 出现错误,无去启动

Microsoft Visual Studio 出现错误,无去启动visual studio。 streamJsonRpc.RemotelnvocationException:cannot find service module info file ‘ldentitystorageservice.servicehub.service.json’ in ‘c:}ProgramFilesvicrosoft visual studio2022,Communitycommon7Servic…

【Java-15】反射知识总结

01_类的加载 类的加载过程类的加载时机 类的加载 当程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中 说明:Class对象是指java.lang.Class类的对象,此类…

GaussDB WDR报告分析

标题 问题描述问题现象告警业务影响原因分析处理方法步骤 1步骤 2步骤 3步骤 4步骤 6步骤 7步骤 8步骤9步骤 10步骤 11步骤 12 问题描述 CPU使用率高。 问题现象 出现CPU使用率超过阈值,CPU使用率快速上涨或短时间持续较高水平等现象。 告警 CPU使用率告警。 …

去除小程序home按钮

前言:当我们未登录时,会跳转到登录页,但是这时候登录页左上角会有一个跳转到首页的按钮,但是,我们不希望出现这个回到首页的按钮 去除前: 去除后: 代码: onShow() {wx.hideHomeBut…

html5的drag属性实现拖放

70. html5的drag属性实现拖放 拖放&#xff08;Drag 和 Drop&#xff09;是很常见的特性。它指的是您抓取某物并拖入不同的位置。 拖放是 HTML5 标准的组成部分&#xff1a;任何元素都是可拖放的。 下面我们通过一个例子来实现拖放 <div id"drop" ondrop"…

快一起来看看好用的ai绘画以图生图教程有哪些吧

我朋友近期在研究ai绘画软件&#xff0c;想要用它创造出一些独特的艺术作品。所以他去查看了ai绘画软件排行榜&#xff0c;但是&#xff0c;里面有很多款不同类型的绘画软件&#xff0c;让人有点眼花缭乱。于是&#xff0c;他来问我ai绘画软件排行靠前的哪个好&#xff0c;我就…

Excel - Windows操作系统下的键盘快捷方式

注意&#xff1a; * 这些快捷方式指的是美式键盘布局。 其他键盘布局的键可能与美式键盘上的键不完全对应。 * 快捷方式中的加号 () 表示需要同时按多个键。 * 快捷方式中的逗号 (,) 表示需要按顺序按多个键。 * 如果经常使用的操作没有快捷键&#xff0c;则可以“录制宏”…

mybatis 模拟03

pom.xml: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

hexo stellar设置笔记页面

stellar主题的作者在其文档介绍了如何进行笔记页面的简单设置&#xff0c;但是我看了以后还是有点云里雾里&#xff0c;在一顿查阅资料以后&#xff0c;我终于找到了解决办法。 参考下面这个博主的文章。写得很详细&#xff0c;这里就不再赘述啦。 Stellar主题自定义侧边栏教…

通联历史数据如何自动化导入 DolphinDB

在部署完 DolphinDB 后&#xff0c;需要将历史数据批量导入数据库&#xff0c;再进行数据查询、计算和分析等操作。为便于用户快速导入通联历史 Level-2 行情数据&#xff0c;DolphinDB 开发了 DolphinDBModules::easyTLDataImport 模块&#xff08;简称 easyTLDataImport 模块…