蓝桥杯嵌入式国赛笔记(2):拓展板按键程序设计

目录

1、前言

2、电路原理

3、代码编写

3.1 读取Btn电压

3.2 检索按键

3.3 main文件编写

3.3.1 进行变量定义

3.3.2 AD_Key函数

3.3.3 LCD函数

3.3.4 main函数

3.3.5 完整代码 

4、测试 

5、总结


1、前言

本文进行拓展板按键程序设计,拓展板的按键是通过采集模拟量来判断具体按键的,所以通过配置AD资源,通过模拟量转数字量获取相应的AD值,即可判断具体按下的按键编号。

2、电路原理

蓝桥杯的扩展板与核心板的引脚图如下:

ADC_KEY与PA5引脚连接即可通过PA5引脚捕获ADC_KEY的电压值。

下图为ADC_KEY的电路示意图,当按下不同的按键,电阻的分压是不同的,所以可以根据读取到的电压值进行判断不同的按键被按下。

3、代码编写

3.1 读取Btn电压

进行获取按键的电压值,并进行中值滤波设计,采集一组AD数据,通过冒泡排序即可找到其中的中值,用其来作为本轮检测滤波后的AD值。

如上图所示,获取采集到的AD数组取中值为按键AD的滤波值。 

#define BTN_BUFF_LEN 50uint16_t Read_Btn(void)
{uint16_t Btn_Buffer[BTN_BUFF_LEN] = {0};int i,j;for(i=0;i<BTN_BUFF_LEN;i++){Btn_Buffer[i] = getADC2();}uint16_t temp;for(i=0;i<BTN_BUFF_LEN/2;i++){for(j=0;j<BTN_BUFF_LEN-i-1;i++){if(Btn_Buffer[j+1]<Btn_Buffer[j]){temp = Btn_Buffer[j+1];Btn_Buffer[j+1] = Btn_Buffer[j];Btn_Buffer[j] = temp;}}}if(BTN_BUFF_LEN%2==0)return ((Btn_Buffer[BTN_BUFF_LEN/2-1]+Btn_Buffer[BTN_BUFF_LEN/2])/2);elsereturn Btn_Buffer[BTN_BUFF_LEN/2];
}

3.2 检索按键

通过读取Btn电压,根据按键电路计算经验值,通过if-else语句进行判断 ,返回对应的按键值。

uint8_t Scan_Btn(void)
{uint16_t BtnAd = Read_Btn();if(BtnAd < (0xFFF*1/14))return 1;else if((BtnAd > (0xFFF*1/14)) && (BtnAd < (0xFFF*3/14)))return 2;else if((BtnAd > (0xFFF*3/14)) && (BtnAd < (0xFFF*5/14)))return 3;else if((BtnAd > (0xFFF*5/14)) && (BtnAd < (0xFFF*7/14)))return 4;else if((BtnAd > (0xFFF*7/14)) && (BtnAd < (0xFFF*9/14)))return 5;else if((BtnAd > (0xFFF*9/14)) && (BtnAd < (0xFFF*11/14)))return 6;else if((BtnAd > (0xFFF*11/14)) && (BtnAd < (0xFFF*13/14)))return 7;else if((BtnAd > (0xFFF*13/14)) && (BtnAd < (0xF6E)))return 8;elsereturn 0;
}

3.3 main文件编写

3.3.1 进行变量定义

减速变量控制Key_Proc和Led_Proc的执行速度

Lcd_Disp_String为显示LCD的字符串

Btn_Num 为AD_Key的按键值

//*减速变量
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Led_Set_Point = 0;//控制Led_Proc的执行速度
//*LCD显示专用变量
unsigned char Lcd_Disp_String[22];
//AD_Key变量
uint8_t Btn_Num = 0;

3.3.2 AD_Key函数

AD_Key函数去执行AD模块的Scan_Btn();

void AD_Key_Proc(void)
{Btn_Num = Scan_Btn();
}

3.3.3 LCD函数

void Lcd_Proc(void)
{if((uwTick - uwTick_Lcd_Set_Point)<100)return;//减速处理uwTick_Lcd_Set_Point = uwTick;sprintf((char*)Lcd_Disp_String,"AD_Key:%d",Btn_Num);LCD_DisplayStringLine(Line2,Lcd_Disp_String);}

3.3.4 main函数

int main(void)
{/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* Configure the system clock */SystemClock_Config();/*bsp资源的初始化*/AD_Key_Init();LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);while (1){Lcd_Proc();}
}

3.3.5 完整代码 

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "RCC\bsp_rcc.h"
#include "LCD\bsp_lcd.h"
#include "ADC\bsp_adc.h"
//***全局变量声明区
//*减速变量
__IO uint32_t uwTick_Lcd_Set_Point = 0;//控制Lcd_Proc的执行速度//*LCD显示专用变量
unsigned char Lcd_Disp_String[22];//AD_Key变量
uint8_t Btn_Num = 0;//***子函数声明区
void Lcd_Proc(void);
void AD_Key_Proc(void);//***系统主函数
int main(void)
{/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* Configure the system clock */SystemClock_Config();/*bsp资源的初始化*/AD_Key_Init();LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);while (1){AD_Key_Proc();Lcd_Proc();}
}//***LCD子函数
void Lcd_Proc(void)
{if((uwTick - uwTick_Lcd_Set_Point)<100)return;//减速处理uwTick_Lcd_Set_Point = uwTick;sprintf((char*)Lcd_Disp_String,"AD_Key:%d",Btn_Num);LCD_DisplayStringLine(Line2,Lcd_Disp_String);
}void AD_Key_Proc(void)
{Btn_Num = Scan_Btn();
}void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}

4、测试 

使用开发板通过杜邦线连接扩展版,进行AD_Key模块的按键测试。可以看到在按不同按键时,LCD屏幕显示了对应的按键值。

5、总结

本文通过AD采集并滤波的方式获取到按键电压,再根据不同按键产生不同电压范围的电路原理进行按键的判断,通过代码测试成功。 

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

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

相关文章

人生苦短,我学python之数据类型(下)

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏&#xff1a;Python 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 目录 一.集合 1.1子集与超集 1.2交集&#xff0c;并集&#xff0c;补集&#xff0c;差集 1.intersection(英文&a…

webman使用summernote富文本编辑器

前言 Summernote富文本编辑器功能强大&#xff0c;可以直接从word直接复制内容过来而不破坏原有的文档格式&#xff0c;非常适合做商品详情等内容的编辑工具。本文将展示如何在php高性能框架webman中使用summernote编辑器。 下载 去Bootstrap 中文网、Summernote、jQuery官网…

【设计模式】JAVA Design Patterns——Converter(转换器模式)

&#x1f50d;目的 转换器模式的目的是提供相应类型之间双向转换的通用方法&#xff0c;允许进行干净的实现&#xff0c;而类型之间无需相互了解。此外&#xff0c;Converter模式引入了双向集合映射&#xff0c;从而将样板代码减少到最少 &#x1f50d;解释 真实世界例子 在真实…

低代码开发:拖拽式可视化构建工业物联网系统

什么是低代码&#xff1f; 低代码(Low Code)是一种可视化的软件开发方法&#xff0c;通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面&#xff0c;从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…

Pandas 创建层次化索引

1.创建多层次索引 1.1 隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 # 导入pandasimport numpy as npimport pandas as pd​data np.random.randint(0,100,size(6,6))​# 行索引index [ ["1班","1班","1班&qu…

如何合理设置Java线程池大小

如何合理设置Java线程池大小&#xff1a;依据任务类型定制策略 Java线程池的合理配置直接关系到系统性能和资源利用率。根据任务性质的不同&#xff0c;合理的线程池大小设置策略也有所区别&#xff0c;主要包括CPU密集型、IO密集型及混合型任务。 1. CPU密集型任务 特点&am…

【全网最全】2024电工杯数学建模B题53页成品论文+完整matlab代码+完整python代码+数据预处理+可视化结果等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模B题53页成品论文完整matlab、py代码19建模过程代码数据等&#xff08;后续会更新&#xff09;「首先来看看目前已有的资…

微软新功能Recall引发隐私担忧,英国数据监管机构展开调查

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

AP5163 是一款效率高,稳定可靠的 LED 灯恒流驱动控制芯片.

AP5163 特别内置了一个 LDO、其输出电压为 5V&#xff0c;最大可提供 5ma 电流输出。AP5163 采用小 SOT23-6 封装。特别适合宽输入电压范围的应用&#xff0c;其输入电压范围从 5.5V 到 36V。 AP5163 通过一个外接电阻设定输出电流&#xff0c;最大输出电流 3.5A。电流检测精度…

Vue小程序项目知识积累(一)

1.JS中的substring() 方法&#xff1a; substring() 方法用于提取字符串中介于两个指定下标之间的字符,包括空格键。 substring() 方法返回的子串包括 开始 处的字符&#xff0c;但不包括 结束 处的字符。 string.substring(from, to) from&#xff1a;必需。一个非负的整数…

头歌OpenGauss数据库-F.连接查询与子查询第3关:IN、ANY、ALL嵌套子查询

编程要求 我们为你提供了如下数据表&#xff1a; tb_salary表数据&#xff1a; idpositionsalary1Java80002Java84003Java90004Python65005Python10000 根据提供的数据&#xff0c;在右侧编辑器中补充代码&#xff1a; 查询薪资表中比Java最高工资高的所有员工职位名称和薪资&a…

[Spring Cloud] (9)XSS拦截器

文章目录 简述本文涉及代码已开源Fir Cloud 完整项目防XSS攻击必要性&#xff1a;作用&#xff1a; 整体效果后端增加拦截器开关配置pom中增加jsoup依赖添加JSON处理工具类添加xss拦截工具类防XSS-请求拦截器 前端 简述 本文涉及代码已开源 本文网关gateway&#xff0c;微服务…

微调LLM的理由

原文链接&#xff1a;https://www.freddyboulton.com/blog/when-to-finetune?continueFlag03133d546a002fc4ba73dda1632eeebe 考虑到大语言模型(llama 70b, mixtral, claude...)的能力在不断的增强的情况下&#xff0c;微调是否仍然是值得做的事。 下面是值得微调的一些原因…

医疗大模型和数据集整理

医疗大模型整理 LLM 类型 基座模型 持续预训练/Finetune 评估 ClinicalGPT 论文 BLOOM-7B cMedQA2, cMedQA-KG, MD-EHR, MEDQA-MCMLE, and MedDialog MedDialog MEDQA-MCMLE MD-HER cMedQA2 HuatuoGPT 论文+开源项目 Baichuan-7B Ziya-LLaMA-13B-Pretrain-v1 Distilled Instru…

Visual Studio Code插件

文章目录 工具类AIChinese (Simplified) (简体中文)cmake集Code RunnerGitLens — Git superchargedPath IntellisenseTodo TreeBookmarks &#xff08;书签&#xff09;markdownclangd 美化类Output Colorizer &#xff08;输出窗口彩色&#xff09;Doxygen Documentation Gen…

人工智能和机器学习辅助决策在空战中的未来选择

人工智能(AI)和机器学习在空战决策中的未来选择主要体现在以下几个方面: 自主决策系统:通过训练AI模型,使其具备自主决策能力。这种系统能够根据战场态势的变化,自主做出决策,并实时调整作战计划。例如,AI可以预测敌方空中机动路线,生成全面的近实时空中画面,为指挥官…

安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error

安装harbor出现问题&#xff1a; [] Running 1/1 ✘ Network harbor_harbor Error 0.2s failed to create network harbor_harbor: Error response from daemon: Fa…

【无标题】 新人如何快速接手Vue大型产品项目并进行迭代和维护

这里写自定义目录标题 快速接手Vue大型产品项目 快速接手Vue大型产品项目 &#x1f680; 了解项目背景和业务功能 在踏入Vue大型产品项目之前&#xff0c;了解项目的背景和业务功能是至关重要的。这不仅有助于你快速理解项目的整体架构和设计思路&#xff0c;还能让你在后续的…

K8s 搭建 FileBeat+ELK 分布式日志收集系统 以及 KQL 语法介绍

一、K8s FileBeat ELK 介绍 ELK&#xff0c;即Elasticsearch、Logstash和Kibana三个开源软件的组合&#xff0c;是由Elastic公司提供的一套完整的日志管理解决方案。Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎&#xff0c;它允许你快速地、近乎实时地存储、搜索…

力扣654. 最大二叉树

Problem: 654. 最大二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 对于构造二叉树这类问题一般都是利用先、中、后序遍历&#xff0c;再将原始问题分解得出结果 1.定义递归函数build&#xff0c;每次将一个数组中的最大值作为当前子树的根节点构造二叉树&#xff1b;…