技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

2023-05-16

技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

1、项目简介

在这里插入图片描述

2、实现逻辑

在这里插入图片描述

3、应用场景

#主从机有线控制
#开关操作

4、核心代码梳理

//根据按下的按键执行相应的操作
void handle_key_press(int key) 
{
  char buf[20];
  sprintf(buf, "Key %d pressed", key);
	oled_print(0, 4, buf);
  CAN_TX(buf);
}

void control_relay(uint8_t position, GPIO_PinState state) {
    // 检查位置是否有效
    if (position < 1 || position > 14) {
        //printf("Invalid relay position: %d\n", position);
        return;
    }
    
    // 定义GPIO结构体
		GPIO_TypeDef* port = GPIOC;
		uint16_t pin;
    
    // 根据位置设置对应的GPIO端口和引脚
    switch (position) {
        case 1:
            port = GPIOC;
            pin = GPIO_PIN_14;
            break;
        case 2:
            port = GPIOC;
            pin = GPIO_PIN_15;
            break;
        case 3:
            port = GPIOA;
            pin = GPIO_PIN_0;
            break;
        case 4:
            port = GPIOA;
            pin = GPIO_PIN_1;
            break;
        case 5:
            port = GPIOA;
            pin = GPIO_PIN_2;
            break;
        case 6:
            port = GPIOA;
            pin = GPIO_PIN_3;
            break;
        case 7:
            port = GPIOA;
            pin = GPIO_PIN_4;
            break;
        case 8:
            port = GPIOA;
            pin = GPIO_PIN_5;
            break;
        case 9:
            port = GPIOA;
            pin = GPIO_PIN_6;
            break;
        case 10:
            port = GPIOA;
            pin = GPIO_PIN_7;
            break;
        case 11:
            port = GPIOB;
            pin = GPIO_PIN_0;
            break;
        case 12:
            port = GPIOB;
            pin = GPIO_PIN_1;
            break;
        case 13:
            port = GPIOB;
            pin = GPIO_PIN_10;
            break;
        case 14:
            port = GPIOB;
            pin = GPIO_PIN_11;
            break;    
        default:
            //printf("Invalid relay position: %d\n", position);
            return;
    }
    
    // 执行操作
    HAL_GPIO_WritePin(port, pin, state);
}

int keypad_to_num(int keypad_val) {
    // 实际按键号和按键序号之间的映射关系
    int switch_key[16] = {13, 9, 5, 1, 14, 10, 6, 2, 15, 11, 7, 3, 16, 12, 8, 4};
  
    // 查找按键号对应的序号
    for (int i = 0; i < 16; i++) {
        if (keypad_val == switch_key[i]) {
            return i+1; // 返回对应的按键号
        }
    }
  
    // 没有找到匹配的按键号,返回-1表示错误
    return -1;
}


//返回当前哪个按键被按下㿂如果没有按键被按下,则返回0
int scan_keypad(void) {
    int row, col;
    int all_unused = 1; // Assume all keys are unused

    for (col = 0; col < 4; col++) {
        /* Output a low signal to the current column */
        switch(col){
            case 0:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
                break;
            case 1:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
                break;
            case 2:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
                break;
            case 3:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
                break;
            default:
                break;
        }

        /* Check the rows for a key press */
        for (row = 0; row < 4; row++) {
            if (!HAL_GPIO_ReadPin(GPIOB, 1 << (row + 12))) {
							HAL_Delay(100); //消抖
							if (!HAL_GPIO_ReadPin(GPIOB, 1 << (row + 12))) {
								/* Key is pressed, handle the key press */
								int key_pressed = row*4 + col + 1;
								key_pressed = keypad_to_num(key_pressed);
								if(key_pressed > 14)
									return 0;
							
								/* Check if all other keys are unused */
								for(int i = 0; i < 16; i++) {
										if(i != key_pressed - 1 && key_table[i] == 1) {
												/* Other key is already pressed, print error message and return 0 */
												//printf("Error: Another key %d is already pressed\n", i+1);
												return -1;
										}
								}

								/* Set flag to 1 if is 0 */
								if(key_table[key_pressed-1] == 0)
								{
									key_table[key_pressed-1] = 1;
									return key_pressed;
								}
								else
								{
									key_table[key_pressed-1] = 0;
									return key_pressed + 100;
								}
							}
							
            }
        }

        /* Wait a short delay before scanning the next column */
        Delay(1000);

        /* Output a high signal to the current column */
        switch(col){
            case 0:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
                break;
            case 1:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
                break;
            case 2:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
                break;
            case 3:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
                break;
            default:
                break;
        }
    }

    /* No key is pressed */
    return 0;
}

5、部分参考资料

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

6、注意事项

#使用的不是单个的按键,是矩阵键盘
#按键消抖比较简单,按的时候需要暂停1秒
#主从机程序写到一个工程文件了,通过宏定义可以进行选择
#资料中的参考硬件是之前自己的项目文件
#硬件和软件不是一一对应的,硬件更为复杂

完整可运行项目地址

视频讲解B站地址

或 点击下方”大饼匠人“卡片,关注并回复"37"免费下载
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 的相关文章

  • easyexcel读取excel合并单元格数据

    普通的excel列表 xff0c easyexcel读取是没有什么问题的 但是 xff0c 如果有合并单元格 xff0c 那么它读取的时候 xff0c 能获取数据 xff0c 但是数据是不完整的 如下所示的单元格数据 xff1a 我们通过简
  • clion + opencv环境搭建

    clion是一个jetbrains提供的c 43 43 开发环境 xff0c 和idea pycharm等开发工具类似 xff0c 界面有很多相似的地方 clion内置了一个mingw的编译环境 xff0c 自带了gcc g 43 43 等
  • ChatGLM-6B本地cpu部署

    ChatGLM 6B是清华团队研发的机器人对话系统 xff0c 类似ChatGPT xff0c 但是实际相差很多 xff0c 可以当作一个简单的ChatGPT ChatGLM部署默认是支持GPU加速 xff0c 内存需要32G以上 普通的机
  • java通过HttpServletRequest获取post请求中的body内容

    在java web应用中 xff0c 我们如何获取post请求body中的内容 xff1f 以及需要注意的问题 通常利用request获取参数可以直接通过req getParameter name 的方式获取url上面或者ajax data
  • Your password does not satisfy the current policy requirements解决办法

    mysql5 7 x安装以后 xff0c 想修改随机生成的密码为简单容易记忆的密码 xff0c 如root 123456等 xff0c 这时候通过修改密码的几种方式都不行 xff0c 出现密码不符合当前安全策略要求 为了解决这种问题 xff
  • 用一条SQL语句查询出每门课都大于80分的学生姓名

    两道sql题 xff1a 1 用一条SQL语句查询出每门课都大于80分的学生姓名 2 删除除了自动编号不同 xff0c 其他都相同的学生冗余信息 第一题数据如下 xff1a 分析 xff1a 每门课都大于80分 xff0c 就是说学生最低分
  • ajax通过post方法传数组

    ajax在web项目开发中经常会用到 xff0c 平时我们传递数据 xff0c 基本都是一个参数名对应一个参数值 xff0c 后端通过参数名就可以得到参数 xff0c 从而进行相关逻辑处理 xff0c 但是有时候我们会遇到批量操作 xff0
  • “操作无法完成因为其中的文件夹或文件已在另一个程序中打开”解决办法

    在windows系统中 xff0c 我们经常会遇到这样一个问题 xff1a 删除某一个文件或者文件夹 xff0c 被提醒 xff1a 操作无法完成 xff0c 因为其中的文件夹或文件已在另一个程序中打开 这个时候我们一般会先检查是否真的有程
  • 几种常见mybatis分页实现

    mybatis框架分页实现 xff0c 有几种方式 xff0c 最简单的就是利用原生的sql关键字limit来实现 xff0c 还有一种就是利用interceptor来拼接sql xff0c 实现和limit一样的功能 xff0c 再一个就
  • curl发送POST方法类型带body参数请求以及发送上传文件请求

    curl在实际中会被postman等替代 xff0c 但是他仍然是一个快速的模拟http请求的工具 xff0c 而且也有他不可替代的理由 xff0c 使用简单 xff0c 在命令行下就可以完成 今天不是介绍如何使用curl模拟各种GET P
  • 第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

    第45章 DCMI OV2640摄像头 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege
  • 技术分享|探究群体智能—基于UWB定位技术的无人机集群协同

    随着无人机性能水平提高 xff0c 无人机在民用类和军事类活动中的使用越来越广泛 由于无人机飞行环境和任务难度不同 xff0c 单架无人机因为自身动力和负荷能力很难独自完成任务 xff0c 无人机集群协同作业则是当前科技现代化的任务要求 集
  • 技术分享 | 基于室外RTK/GPS定位系统下的无人机集群协同

    在自然界中 xff0c 为弥补个体能力的不足 xff0c 诸多生物种群能通过个体相互之间的交流与合作呈现出某种群体行为 xff0c 比如鱼群结群游弋 鸟群聚集迁徙以及蚂蚁协同搬运等 受此激励 xff0c 人们希望开发像鸟群 鱼群一样自由集结
  • STL学习系列之一——标准模板库STL介绍

    说明 xff1a 此文为连载版 xff0c 今天学习STL的介绍 1 STL介绍 标准模板库STL是当今每个从事C 43 43 编程的人需要掌握的技术 xff0c 所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念 xff1a 容器
  • 如何在cmakelist中,find_package取指定路径中查找

    在开发中 xff0c 最常遇到环境问题 xff0c 这个opencv版本不对 xff0c 那个pcl版本不对 xff0c 如果将原系统目录下的库卸载后重装新的版本 xff0c 往往会出现一些意想不到的事 xff0c 费时费力 我常常这样做
  • MFC模型树控件TreeCtrl实现按下Ctrl键多选,按下Shift键连选

    MFC模型树控件TreeCtrl实现按下Ctrl键多选 xff0c 按下Shift键连选 MFC的List Box只需要将控件属性中的Selection项设置为Extended xff0c 即可实现Ctrl键多选和Shift键连选 xff1
  • PCL点云库——欧式聚类分割

    欧式聚类分割 pcl EuclideanClusterExtraction是基于欧式距离提取集群的方法 xff0c 仅依据距离 xff0c 将小于距离阈值的点云作为一个集群 具体的实现方法大致是 xff1a 1 找到空间中某点p10 xff
  • PCL点云库——旋转平移矩阵

    旋转平移矩阵 点云摆正 点云配准等点云操作实质上是对点云进行旋转平移 xff0c 使点云变换至目标位姿 PCL中使用的是矩阵乘列向量的计算方法 下面分别给出了点A x y z 绕X轴 Y轴 Z轴逆时针旋转角度 的示意图与旋转矩阵 xff08
  • PCL点云库——点云法线估计

    点云法线估计 PCL中的所有点云的法线都是指向视点的 xff0c 视点坐标默认为 0 0 0 xff0c 对视点进行设置 xff0c 则可对法线进行定向 如图1与图2所示 xff0c 分别为斯坦福兔子在视点坐标为 10 10 10 与 10
  • PCL点云库——PCA粗配准

    PCA粗配准 主成分分析法 Principal Component Analysis xff0c 简称PCA 是使数据简化的算法 xff0c 通过揭露数据内部的主要分布方向 xff0c 减少了数据集的维数 xff0c 从而保留了点云集中贡献

随机推荐

  • MFC按钮(Button)上的文字与图标显示

    MFC按钮 xff08 Button xff09 上的文字与图标显示 一 新建对话框 MFC中使用以下两种方法可以得到对话框 xff1a 1 1 使用如图1所示的方法 xff0c 新建一个基于对话框的应用程序 xff1b 1 2 在已有的项
  • 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列

    第44章 MPU6050传感器 姿态检测 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege
  • 通过哪些性能参数选择手持式激光扫描仪?

    选择手持式激光扫描仪 激光主动成像系统有诸多优点 xff0c 譬如抗干扰性强 xff0c 能很好地适应不同的测量现场 xff0c 但是它的图像会受到散斑噪声和其他一些高斯噪声的影响 如图1所示 xff0c 分别用红 蓝激光扫描点距0 1mm
  • 函数使用笔记——ShellExecute

    函数使用笔记 ShellExecute API函数 ShellExecute的功能是运行一个外部程序 xff08 或者是打开一个已注册的文件 打开一个目录 打印一个文件等等 xff09 xff0c 并对外部程序有一定的控制 有几个API函数
  • 使用Selenium和Chrome浏览器获取诗词网站搜索结果

    在进行信息检索时 xff0c 我们通常会使用搜索引擎来查找相关的文章 图片 音乐等资源 而在特定的领域中 xff0c 也有一些针对特定内容的搜索引擎或网站 xff0c 比如古诗文网 诗词库等 在本篇博客中 xff0c 我们将介绍如何使用Py
  • 使用Selenium和Chrome浏览器获取图片网站搜索结果

    在进行信息检索时 xff0c 我们通常会使用搜索引擎来查找相关的文章 图片 音乐等资源 而在特定的领域中 xff0c 也有一些针对特定内容的搜索引擎或网站 xff0c 比如百度图片 Pixabay等 在本篇博客中 xff0c 我们将介绍如何
  • 使用python定时抓取个人邮箱数据(通过邮件数量判断)

    在进行信息收集时 xff0c 我们通常会使用电子邮件来接收最新的消息 文档 数据等资源 而在特定场景下 xff0c 也有一些需要自动化获取和处理邮件数据的需求 在本篇博客中 xff0c 我们将介绍如何使用Python的imaplib库连接到
  • 使用Python从邮件中下载附件和提取元数据

    在本篇博客中 xff0c 我们将解析一段Python代码 xff0c 该代码可以从电子邮件中下载附件并提取发送人 主题和日期等元数据 这段代码包含两个函数 xff1a download file 和 get email title 其中 x
  • 使用python提取噪声信号中的有效信息

    本文算法的原始论文出处 xff1a Algorithms Free Full Text An Efficient Algorithm for Automatic Peak Detection in Noisy Periodic and Qu
  • 射频信号对喇叭的影响

    这个问题是在测试能控器中发现的 当时测试时 xff0c 示波器偶尔会发出声音 xff0c 声音有大有小 xff0c 频率还不一样 xff0c 当时测试环境中还有衰减器 xff0c 用手捂住衰减器 xff0c 声音会变小 xff0c 一度以为
  • Code Composer Studio的配置及下载事项

    SDK版本 xff1a SIMPLELINK CC13X2 26X2 SDK v5 20 0 52 适用场景 xff1a 首次将工程文件配置到本地时 xff1b 有bim工程 oad工程 协处理器程序多个部分混杂 xff1b 异常问题 xf
  • 《无线神经调节的微创技术治疗慢性顽固性疼痛:初步观察报告》

    全文概况 xff1a 该文件讨论了一种新型无线和微创神经调节设备 xff0c 用于治疗之前曾经失败的患者慢性顽固性疼痛 该设备通过经皮植入的电极远程控制 xff0c 进行高频背根节神经刺激或周围神经刺激 该系统对于患有腰腿疼痛的患者有重要潜
  • 第27章 LTDC/DMA2D—液晶显示

    本章参考资料 xff1a STM32F76xxx参考手册 2 STM32F7xx 规格书 库帮助文档 STM32F779xx User Manual chm 关于开发板配套的液晶屏参数可查阅 5 0寸液晶屏数据手册 配套资料获知 27 1
  • GB 9706.1-2020 医用电气设备第1部分:基本安全和基本性能的通用要求-1

    这是份什么文件 这是一份中华人民共和国国家标准 xff0c 具体为GB9706 1 2020 xff0c 标准适用于医用电气设备 xff0c 并规定了医用电气设备基本安全和基本性能的通用要求 主要涵盖了医疗电器设备与患者接触的各种要求 xf
  • 关于图床使用

    安装windows终端 Windows 终端安装 Microsoft Learn 安装oh my posh 安装scoop xff08 后续都使用PowerShell 7 2 10 xff09 xff1a gt Set ExecutionP
  • 关于pyqt的一些用法

    QT原生是C 43 43 xff0c pyqt基于python语言 关于插件 xff1a 安装一个PyUIC xff0c 一个Qt Designer 点击Qt Designer可以出来ui配置页面 xff0c 和qt原生IDE基本一样 上面
  • python从单独的文件中获取配置信息

    可以新建一个configure json文件 xff0c 里面放置json格式的字符串 比如 xff1a deviceMAC1 12412421413 deviceMAC 12413232 name 123123 使用下述程序即可获取jso
  • 解决串口工具串口号改变的问题(借助python和ch344/8)

    串口工具一般在插不同usb口的时候 xff0c 识别出来的串口号不一致 xff0c pl2303可以固定 xff0c 但是更换电脑后也会变化 xff0c 可以借助沁恒家的一款串口一转多的工具 xff0c ch344或ch348 xff0c
  • python将监听到的串口信息实时保存到日志

    尽量在一个单独的线程中运行 stim thread span class token operator 61 span threading span class token punctuation span Thread span clas
  • 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37 64 stm32 43 按键 43 光耦 43 锁存 43 串行转并行 43 继电器 1 项目简介 2 实现逻辑 3 应用场景 主从机有线控制 开关操作 4 核心代码梳理 span class token comment 根据