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

news2024/11/17 3:48:08

目录

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 50

uint16_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);
	else
		return 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;
	else
		return 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.coloradmin.cn/o/1688157.html

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

相关文章

分布式事务解决方案(强一致性)

强一致性事务概述 分布式事务领域&#xff0c;最早采用的是符合CAP理论的强一致性事务方案来解决分布式事务问题&#xff0c;强一致性分布式事务要求在任意时刻查询参与全局事务的各个节点的数据都是一致的 典型案例&#xff1a; 包括DTP模型&#xff08;全局事务模型&#x…

【Crypto】MD5

文章目录 MD5解题感悟 MD5 提示的很明显MD5 小小flag&#xff0c;拿下&#xff01; 解题感悟 没啥感悟…

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

LLM 大模型学习必知必会系列(十一)&#xff1a;大模型自动评估理论和实战以及大模型评估框架详解 0.前言 大语言模型&#xff08;LLM&#xff09;评测是LLM开发和应用中的关键环节。目前评测方法可以分为人工评测和自动评测&#xff0c;其中&#xff0c;自动评测技术相比人工…

android14上使用frida,

由于之前使用frida已经是2年前了,后来一直没有研究两年以后 首先手机得root才可以, 我使用的是一加9pro, root方法参考一加全能盒子、一加全能工具箱官方网站——大侠阿木 (daxiaamu.com)​编辑https://optool.daxiaamu.com/index.php 由于之前使用的是frida 15.1.1在and…

Amesim示例篇-案例1:空间中的铝块散热

前言 本文将通过一个案例继续对Thermal库的元件进一步讲解。 案例1&#xff1a;一个300mm*300mm*1000mm&#xff08;长*宽*高&#xff09;的铝板初始温度为45℃&#xff0c;竖直在环境为25℃的空间内静置60min。对流换热系数设置为5W/m2K。本文将通过两种建模方法对铝块的温度…

微软刚发布的Copilot+PC为什么让Intel和AMD尴尬?2024 AI PC元年——产业布局及前景展望

美国东部时间5月20日在微软位于华盛顿的新园区举行的发布会上&#xff0c;宣布将旗下AI助手Copilot全面融入Windows系统&#xff0c;能够在不调用云数据中心的情况下处理更多人工智能任务。 “将世界作为一个提示词就从Windows系统开始”。微软的新PC将是“CopilotPC”&#xf…

树洞陪聊系统源码/陪聊/陪玩/树洞/陪陪/公众号开发/源码交付/树洞系统源码

独立版本源码交付&#xff0c;自研UI和前后端代码 平台自带店员&#xff0c;无需自主招募&#xff0c;搭建直接运营 支持三方登录&#xff0c;官方支付、虎皮椒、易支付/码支付 支持首单体验、盲盒订单、指定下单等多个模式 支持钱包预充值、店员收藏、订单评价等功能 支持…

You must call removeView() on the child‘s parent first.异常分析及解决

问题描述 对试图组件快速的左右滑动过程&#xff0c;发现某一张图片没加载出来&#xff0c;偶现crash 问题分析 view在上次已经是某个ParentView的child&#xff0c;然而现在又把它做为另外一个view的child&#xff0c;于是出现一个view有两个parent。所以就产生了这个错误。…

深入了解Python代码中的缩进与逻辑结构

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、认识缩进在代码中的重要性 代码示例&#xff1a;天气与打球决策 二、缩进与逻辑嵌套 …

uniapp使用内置的switch组件的问题

说明 开关选择器 属性说明 属性名类型默认值说明平台差异说明checkedBooleanfalse是否选中disabledBooleanfalse是否禁用不支持&#xff1a;抖音小程序、飞书小程序typeStringswitch 样式 有效值&#xff1a;switch、checkbox colorColorswitch的颜色&#xff0c;通css的co…

Tensorflow入门实战 P01-实现手写数字识别mnist

目录 1、背景&#xff1a;MNIST手写数字识别 2、完整代码&#xff08;Tensorflow&#xff09;&#xff1a; 3、运行过程及结果&#xff1a; 4、小结&#xff08;还是很清晰的&#xff09; 5、 展望 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

摔到脑袋,没有骨折,没有脱位,脊髓怎么会损伤?

在一个周末的午后&#xff0c;小明在公园的足球场上不慎摔倒&#xff0c;头部重重撞到草地。虽然很快恢复了意识&#xff0c;但回家后却感到颈部僵硬&#xff0c;四肢无力。家人急忙带他前往医院就医做了相关检查。 经过医生的仔细检查&#xff0c;结果显示小明的头部没有骨折或…

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我

《暮色将尽》跨越世纪的历程&#xff0c;慢慢走向并完善自我 戴安娜阿西尔&#xff08;1917-2019&#xff09;&#xff0c;英国知名文学编辑、作家。著有《暮色将尽》《昨日清晨》《未经删节》《长书当诉》等。 曾嵘 译 文章目录 《暮色将尽》跨越世纪的历程&#xff0c;慢慢走…

FastGPT私有化部署+OneAPI配置大模型

介绍 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; 官网地址 https://doc.fastai.site/docs/intro/ 部署 FastGPT提供…

atomic包装自定义类型

在学习原子变量之初&#xff0c;学过很多它的操作&#xff0c;但是很多都是在内置类型&#xff08;int、long等&#xff09;上进行的学习和实验。这次由于工作需要&#xff0c;要使用 atomic 来包装自定义类型&#xff0c;因此打算好好探究一番&#xff0c;把它彻底搞懂。 当要…

iOS系统故障怎么办?这三种苹果手机系统修复方法你一定要知道

随着苹果手机使用时间越长&#xff0c;苹果手机有时也会出现系统问题&#xff0c;如卡顿、崩溃、无法启动等。这些问题不仅影响用户的使用体验&#xff0c;还可能导致数据丢失。因此&#xff0c;掌握苹果手机系统修复方法显得尤为重要。本文将详细介绍苹果手机系统修复的常见方…

冯喜运:5.24今日晚间黄金原油行情如何操作

【黄金消息面分析】&#xff1a;在经历了连续两个交易日的大幅下跌后&#xff0c;黄金市场在北京时间5月24日欧市早盘迎来了反弹。金价目前位于2338美元/盎司附近&#xff0c;市场对此轮波动表现出浓厚的兴趣。本文将深入分析黄金市场的最新动态&#xff0c;探讨其背后的逻辑&a…

非阻塞sokcet和epoll

在Muduo网络库中同时使用了非阻塞socket与epoll&#xff0c;在此简单梳理下。 非阻塞sokcet和epoll共同工作的过程主要涉及网络编程中的非阻塞I/O和事件驱动机制。下面将详细解释这两者如何协同工作&#xff1a; 非阻塞socket简介 在传统的阻塞socket编程中&#xff0c;当调用…

web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法

如果是第一次导入阿里巴巴图标请参考: vue项目引入阿里云图标_vue引用阿里云图标fontclass-CSDN博客 本文主要想讲在项目原有阿里巴巴图标基础上,再次导入阿里巴巴图标的解决办法: 1.iconfont.json对应修改就行,这个简单一看就明白; 2.iconfont.js主要改动<symbol><…

3D模型旋转显示不全怎么办---模大狮模型网

在3D建模和渲染过程中&#xff0c;我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成&#xff0c;包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法&#xff0c;帮助您解决3D模型旋转显示不全的问题。 一、检查模型…