蓝桥杯物联网竞赛_STM32L071_9_按键矩阵扩展模块

news2024/9/30 23:33:21

原理图:

矩阵按键原理图:

在这里插入图片描述
实验板接口原理图:

在这里插入图片描述
得到对应图:

在这里插入图片描述

扫描按键原理:

按键的COLUMN1、2、3分别制0,每次只允许其中一个为0其他都是1(POW1和POW2正常状况为上拉),当有一个按键按下POW1和POW2必有一个被制0,这样就是能找到按键的标号
所以很明确COLUMN1、2、3应该制为输出电平,而POW1和POW2应该制输入电平用来读取按键被按下而传入的低电平

CubMX配置:

在这里插入图片描述

由于OLED引脚被占用所以用串口输出调试

Keil配置:

Function:

#include "Function.h"
#include "usart.h"
#include "gpio.h"

void Function_SendInformation(const char * data, uint16_t len){
	HAL_UART_Transmit(&huart2, data, len, 0xff);
}

void Function_ReciveInformation(char * data, uint16_t len){
	HAL_UART_Receive(&huart2, data, len, 0xff);
}

 
void Function_OnlyRsetPortPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin){ // 将其中一个COLUMN制0
	HAL_GPIO_WritePin(COLUMN1_GPIO_Port, COLUMN1_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(COLUMN2_GPIO_Port, COLUMN2_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(COLUMN3_GPIO_Port, COLUMN3_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);
}

unsigned char Function_ResetPowNumberFind(void){ // 找到哪一根POW线制零了
	if(HAL_GPIO_ReadPin(POW1_GPIO_Port, POW1_Pin) == GPIO_PIN_RESET){ 
		 HAL_Delay(2); // 去抖动
		if(HAL_GPIO_ReadPin(POW1_GPIO_Port, POW1_Pin) == GPIO_PIN_RESET){ // 有效按下
			
			while(HAL_GPIO_ReadPin(POW1_GPIO_Port, POW1_Pin) == GPIO_PIN_RESET); // 按下一直有效
			
			return 1; // 松开放回POW1被制0
		}
	}
	
	if(HAL_GPIO_ReadPin(POW2_GPIO_Port, POW2_Pin) == GPIO_PIN_RESET){ 
		 HAL_Delay(2); // 去抖动
		 if(HAL_GPIO_ReadPin(POW2_GPIO_Port, POW2_Pin) == GPIO_PIN_RESET){ // 有效按下
			
			 while(HAL_GPIO_ReadPin(POW2_GPIO_Port, POW2_Pin) == GPIO_PIN_RESET); // 按下一直有效
			
			 return 2; // 松开放回POW1被按下
		 }
	}
	
	return 0; // 即POW1和POW2都未读取0
}


unsigned char Function_KeyMatrixCheck(void){
	unsigned char PowFind = 0;
	
	Function_OnlyRsetPortPin(COLUMN1_GPIO_Port, COLUMN1_Pin);
  PowFind = Function_ResetPowNumberFind();	
	if(PowFind == 1) return 1;
	else if(PowFind == 2) return 4;
	
	PowFind = 0;
	Function_OnlyRsetPortPin(COLUMN2_GPIO_Port, COLUMN2_Pin);
  PowFind = Function_ResetPowNumberFind();	
	if(PowFind == 1) return 2;
	else if(PowFind == 2) return 5;
	
  PowFind = 0;
	Function_OnlyRsetPortPin(COLUMN3_GPIO_Port, COLUMN3_Pin);
  PowFind = Function_ResetPowNumberFind();	
	if(PowFind == 1) return 3;
	else if(PowFind == 2) return 6;	
}
#ifndef __FUNCTION__
#define __FUNCTION__
#include <stdint.h>

void Function_SendInformation(const char * data, uint16_t len);
void Function_ReciveInformation(char * data, uint16_t len);
unsigned char Function_KeyMatrixCheck(void);
#endif

main:

 
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "Function.h"

 
void SystemClock_Config(void);
 
int main(void)
{
  
  unsigned char Rx[1];
  
  HAL_Init();

 
  SystemClock_Config();

 
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  
  while (1)
  {
    
		Rx[0] = Function_KeyMatrixCheck();
		if(Rx[0]){ // 返回不是0才输出
      Function_SendInformation(Rx, 1);
		}
		HAL_Delay(1000);
     
  }
 
}

 
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

 
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

 
void Error_Handler(void)
{
   
  __disable_irq();
  while (1)
  {
  }
   
}

运行效果:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

为了让亲戚也能用上chatgpt,我决定建一个代理站点

&#xff08;本文试着用gpt优化了一下&#xff0c;效果有&#xff0c;但是不多&#xff09; ChatGPT在编程中的应用 当ChatGPT刚出来的时候&#xff0c;我尝试了几次&#xff0c;感觉它就像是一个高级版的搜索引擎。但在过去的一个月里&#xff0c;我在公司经常使用GPT来查询…

ruby安装(vscode、rubymine)

https://rubyinstaller.org/downloads/ 下载exe安装即可 会弹出 输入3 安装成功 vscode插件市场安装ruby插件 新建一个目录&#xff0c;打开terminal bundle init //进行初始化&#xff08;如果执行不了&#xff0c;应该是环境变量没生效&#xff0c;重启vscode&#…

Pillow操控图像,Python必备神器全面解析!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Pillow 是一个强大的 Python 图像处理库&#xff0c;它提供了丰富的功能&#xff0c;能够处理图像的加载、编辑、处理和保存。这个库建立在 Python Imaging Library (PIL) 的基础上&#xff0c;并延续了 PIL 的开…

芯擎科技与芯华章深度合作,软硬件协同开发加速车规级芯片创新

12月4日&#xff0c;系统级验证EDA解决方案提供商芯华章&#xff0c;与国产高端车规芯片设计公司芯擎科技正式建立战略合作。双方强强联手&#xff0c;芯擎科技导入芯华章相关EDA验证工具&#xff0c;赋能车规级芯片和应用软件的协同开发&#xff0c;助力大规模缩短产品上市周期…

预测胶质瘤预后的铜结合蛋白的转录组学特征

今天给同学们分享一篇生信文章“Transcriptomic Characterization of Copper-Binding Proteins for Predicting Prognosis in Glioma”&#xff0c;这篇文章发表在Brain Sci期刊上&#xff0c;影响因子为3.3。 结果解读&#xff1a; 铜结合蛋白的转录组表达 共有85种蛋白质被确…

【驾校管理系统源码】基于Springboot+Vue个人驾校预约管理系统

&#x1f345; 简介&#xff1a;500精品计算机源码学习 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 文末获取源码 目录 一、以下学习内容欢迎领取&#xff1a; Eclipse运行教学&#xff1a; Idea运行项目教学&#xff1a; Pycharm调试项目教学&#…

嵌入式rk3399系统问题

1、修改分辨率 修改4k分辨率&#xff1a; 1. 执行命令&#xff1a;cvt 3840 2160 50获得返回结果(2k分辨率为cvt 1920 1080 50)&#xff0c;如图中所示&#xff1a; 2.修改文件&#xff1a;sudo vim /usr/share/X11/xorg.conf.d/20-modesetting.conf将获取到的Modeline如图中所…

二值图像分割统一项目

1. 项目文件介绍 本章为二值图像的分割任务做统一实现&#xff0c;下面是项目的实现目录 项目和文章绑定了&#xff0c;之前没用过&#xff0c;不知道行不行 data 文件夹下负责摆放数据的训练集测试集inference 负责放待推理的图片(支持多张图片预测分割)run_results 是网络训…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转&#xff1a; // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

vm net 方式 静态ip配置访问主机IP和外网

1、win 11 安装vm&#xff0c;镜像文件 F:\software\VMwork\CentOS-7-x86_64-Everything-1804.iso 2、配置网络 net 方式 3、右击网络--》属性---》更改适配器设置--》vmnet8 属性 如果没有vm1、vm8 虚拟机编辑---》虚拟机网络编辑器-->还原默认设置 注意&#xff1a;这…

ONLYOFFICE 协作空间 2.0 现已发布:新增公共房间、插件、重新分配数据、RTL 界面等功能

更新后的 ONLYOFFICE 协作空间新增诸多实用功能&#xff0c;全平台实现多项优化功能。请继续阅读&#xff0c;了解所有更新。 ONLYOFFICE 协作空间是什么 ONLYOFFICE 协作空间是一款开源效率平台&#xff0c;让您与同事、团队成员、客户、合作伙伴、承包商、赞助商和其他第三方…

大学生如何搭建自己的网站

这篇是我在大一的时候&#xff0c;写过的一篇文章。 前言 作为一名大学生&#xff0c;我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假&#xff0c;我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路&#xff0c;也附带了一些零零散散的细节。时间跨度…

GVIM 配置 for begin/end class/endclass 等配对

有时候我们的代码很长&#xff0c;或者结构比较复杂&#xff0c;多个if/else 或者begin/end 快嵌套&#xff0c;为了阅读方便&#xff0c;利用gvim插件实现块跳转还是很有实用性的&#xff0c;下面的.vimrc的配置&#xff0c;简单方便。 使用方式&#xff1a; 将光标定位到块头…

全球与中国汽车电力电子市场:增长趋势、竞争格局与前景展望

目前&#xff0c;世界各国都致力于转向更环保、更永续的传统交通替代方案。 电动车满足所有要求&#xff0c;因为它们具有零废气排放、改善空气品质、减少温室气体排放并创造更清洁、更健康的环境。此外&#xff0c;电动车的运作成本比传统内燃机驱动的汽车低&#xff0c;因为…

HTML5+CSS3+Vue小实例:饮料瓶造型文字旋转特效

实例:饮料瓶造型文字旋转特效 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】【JS】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" …

linux 内核regulator

问题 在sys文件系统下没有生成cpu 调频的相关节点。 日志对比 [ 3.588745] cpu cpu4: Looking up cpu-supply from device tree [ 3.588753] cpu cpu4: Failed to get reg [ 3.588791] cpu cpu4: Looking up cpu-supply from device tree [ 3.588808] Failed to i…

React 笔记 jsx

严格约定&#xff1a;React 组件必须以大写字母开头&#xff0c;而 HTML 标签则必须是小写字母。 React JSX JSX 是由 React 推广的 JavaScript 语法扩展。 用于表达组件的 特殊语法的 js 函数 要求标签必须闭合&#xff1b;返回的组件必须包裹在一个父标签内&#xff1b; …

Python使用cURL库下载文件

Python使用cURL库下载文件 cURL库是一个功能强大的工具&#xff0c;可以用于在Python中下载文件。以下是一个简单的Python程序&#xff0c;使用cURL库实现文件下载功能&#xff1a; import subprocess def download_file(url, output_path): command [curl, -o, …

开启全新消费革命——消费增值,让每一笔消费变成财富!

你是否厌倦了仅仅购买物品或享受服务后便一无所有的消费方式&#xff1f;现在&#xff0c;消费增值的概念将彻底改变你的消费观念&#xff01;通过参与消费增值&#xff0c;你的每一笔消费都将变得更有价值&#xff01; 消费增值是一种全新的消费理念&#xff0c;它让你在购物的…