蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)

一、工程模版创建流程


第一步 创建新项目

第二步 选择型号和管脚封装

 第三步 RCC使能   外部时钟,高速外部时钟

第四步晶振时钟配置 

由数据手册7.1可知外部晶振频率为24MHz  最后一项设置为80

按下回车他会自动配置时钟

 第五步,如果不勾选可能程序只会下载一次到时候不好找问题

第6步 名字和路径不能有中文

 第七步bsp为创建的程序存放的文件

八创建一个新组

注意程序只能写在USER CODE BEGIN include 和user code end include

9Debug设置 点击确定板载调试器 

 

 二、点亮一颗LED灯


原理图

PD2锁存器控制端口

第一步、打开PC8~15的接口配置为output模式

且选中管脚output设置为HIGHPD2低电平时候为开,防止别的引脚冲突 

点击生成即可

第二步 创建两个文件led.c和led.h

定义缩写  在main.h函数内typedef unsigned char  uchar

头文件位置要在BEGIN和END之间

 第三步、引用头文件配置,这步是点击魔术棒

 

案例程序----点亮led

main

/----------------------------------main.h-------------------------------/

/* USER CODE BEGIN Includes */
typedef unsigned char uchar;
typedef unsigned int  uint;/* USER CODE END Includes */

/----------------------------------main.h-------------------------------/

头文件

/* USER CODE BEGIN Includes */
#include "led.h"
/* USER CODE END Includes */

 主函数

LED_Disp(0x00);//LED初始化/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_Disp(0x02);HAL_Delay(500);LED_Disp(0x00);HAL_Delay(1000);				}/* USER CODE END 3 */

led

/-----------------------------------led.h---------------------------------/

#ifndef __LED_H__
#define __LED_H__#include "main.h"
void LED_Disp(uchar dsLED);#endif

/-----------------------------------led.c---------------------------------/


#include "led.h"void LED_Disp(uchar dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//先将所有引脚设为高电平由原理图设计HAL_GPIO_WritePin(GPIOC,dsLED << 8,GPIO_PIN_RESET);//推向高8位HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//锁存器低电平触发HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);}

三、lcd相关配置及代码案例

LCD原理图

 参考和移植官方的案例程序

第一步、引脚配置

全部配置为output

配置完引脚后点击GENERATE CODE即可无需其他操作

第二步、将这两个头文件复制到

在给的案例路径下将lcd.c、fonts、lcd.h也复制到bsp路径下面

 第三步、添加头文件

官方案例程序 

使用这种格式的颜色背景方便机器阅卷 背景色要求

        

案例程序----lcd显示

添加lcd

/--------------------------------main.c----------------------------/

头文件

/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */

 主函数

sprintf函数打印到字符串中

(要注意字符串的长度要足够容纳打印的内容,否则会出现内存溢出),而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛
3、sprintf函数的格式
int sprintf( char *buffer, const char *format [, argument,…] );       

/* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */LED_Disp(0x02);HAL_Delay(500);LED_Disp(0x00);HAL_Delay(1000);char text[30];uint i = 5;sprintf(text,"  CNBR:%d      ",i);LCD_DisplayStringLine(Line9, (uint8_t *)text);}/* USER CODE END 3 */

三、按键配置


按键原理图

第一步、引脚配置

引脚设置为input

第二步 模式设置上下拉模式选择上拉

第三步定时器配置 

随便选择一个定时器 

时钟选择外部时钟80Mhz---为了达到非阻塞式延时消抖

分屏系数和自动重装载值设置 

100HZ=10ms中断一次  从0开始0~79是80个数

 计算延时时间实例

 中断使能

点击生成代码即可

程序及环境配置

新建两个文件-另存interrupt.c,interrupt.h保存地址为该文件路径下的bsp中

 /----------------------------------------------interrupt.h------------------------------------/

interrupt


#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__#include "main.h"
#include "stdbool.h"
struct keys
{uchar judge_sta;//按键判断bool key_sta;bool single_flag;//确认被按下他为1
};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);#endif

 /----------------------------------------------interrupt.c------------------------------------/

在一个具有多个按键的嵌入式设备按键检测程序中,通过循环遍历 key 数组(改变 i 的值从 0 到数组元素个数减 1),就可以依次获取每个按键的 judge_sta 状态,判断是否满足某些条件来进一步确认按键是否有效按下或者是否进入了特定的操作判断阶段等。

  1. case 0 分支

    • 逻辑描述:当 key[i].judge_sta 的值为 0 时进入该分支。在这个分支里,有一个条件判断语句 if(key[i].key_sta == 0),也就是当 key[i].key_sta(表示按键当前基本状态,0 在这里可能意味着未按下或者非激活状态等)也为 0 时,会将 key[i].judge_sta 的值更新为 1。这可能意味着当按键初始处于某个默认的未激活且符合某种前置条件时(由 judge_sta 为 0 和 key_sta 为 0 共同界定),将其状态推进到下一个阶段或者设置为另一种待确认的中间状态(用 judge_sta 变为 1 来表示)。
    • 可能的应用场景示例:比如在一个设备启动后,按键初始都处于默认未操作状态,当检测到按键没有被按下(key_sta 为 0)且其整体判断状态处于初始的 0 阶段时,就将其推进到一个准备检测后续是否有按下动作的状态阶段,对应 judge_sta 更新为 1
  2. case 1 分支

    • 逻辑描述:当 key[i].judge_sta 等于 1 时执行此分支逻辑。这里的条件判断是 if(key[i].key_sta == 0),如果 key[i].key_sta 为 0(即按键此时处于未按下状态),会执行两个操作:一是将 key[i].judge_sta 重置回 0,可能表示此次针对该按键的操作周期结束或者恢复到初始的一种状态等待下次操作;二是将 key[i].single_flag 设置为 1,根据之前结构体定义中对 single_flag 的注释理解(确认被按下它为 1),这里虽然当前按键是未按下状态,但可能是在满足了之前从 judge_sta 为 1 阶段的一些检测逻辑后,确认了一次完整的按键操作过程(比如之前从初始状态进入到 1 阶段后,又检测到按键松开了,就认为这是一次完整操作),所以设置 single_flag 为 1 来标记这次操作已完成,可以供程序后续部分依据这个标志做相应处理。
    • 可能的应用场景示例:在一个游戏控制按键的处理中,当按下某个按键后 judge_sta 变为 1 表示正在检测按下动作,然后松开按键(key_sta 变为 0),此时就可以认为完成了一次有效的按键操作,将 judge_sta 回置到 0 等待下次操作,同时设置 single_flag 为 1 通知程序去执行比如游戏角色对应动作等相关功能代码。
  3. case 2 分支

    • 逻辑描述:当 key[i].judge_sta 的值为 2 进入该分支。这里的条件判断是 if(key[i].key_sta == 1),即如果此时按键处于按下状态(key_sta 为 1),会将 key[i].judge_sta 的值设置为 0。这或许意味着当按键处于该 2 所代表的状态阶段时,如果又检测到它被按下了,那就将其状态重置回初始或者某个默认状态(用 judge_sta 变为 0 表示),可能是出现了不符合预期的重复按下或者需要重新开始检测该按键的情况等原因。
    • 可能的应用场景示例:在一个具有按键组合功能的设备中,如果某个按键单独按下去后进入了 judge_sta 为 2 的特定组合检测状态,但随后又检测到它再次被按下不符合当前功能的按键操作逻辑,就将其状态复位到 0 以便重新正确地检测后续操作。
#include "interrupt.h"struct keys key[4] = {0,0,0};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){key[0].key_sta  = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta  = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta  = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta  = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i<4;i++){switch (key[i].judge_sta){		case 0:{if(key[i].key_sta == 0) key[i].judge_sta=1;}break;case 1:{if(key[i].key_sta ==0){key[i].judge_sta=0;key[i].single_flag=1;}}break;case 2:{if(key[i].key_sta==1){key[i].judge_sta=0;}}break;case 3:{				}break;}}}
}

/---------------------------main.c--------------------------------------------/

main 

* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"/* USER CODE BEGIN PTD */
extern struct keys key[];
/* USER CODE END PTD */

/-----------------------------main.c------------------------------------------/

int main(void)
{
/* USER CODE BEGIN 2 */LED_Disp(0x00);//LED初始化LCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_Base_Start_IT(&htim3);  //定时器中断/* USER CODE END 2 */while (1){
char text[30];uint i = 5;sprintf(text,"  CNBR:%d      ",i);LCD_DisplayStringLine(Line9, (uint8_t *)text);//实现按键的功能//第一个按键if(key[0].single_flag==1){sprintf(text,"       key0down      ");LCD_DisplayStringLine(Line8,(uint8_t *)text);key[0].single_flag=0;}if(key[1].single_flag==1){sprintf(text,"       key1down      ");LCD_DisplayStringLine(Line8,(uint8_t *)text);key[1].single_flag=0;}}/* USER CODE END 3 */
}

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

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

相关文章

详细解读sedex验厂

SEDEX验厂&#xff0c;即供货商商业道德信息交流认证&#xff08;Supplier Ethical Data Exchange&#xff09;&#xff0c;是一种表明企业遵守商业道德的认证。以下是对SEDEX验厂的详细解读&#xff1a; 一、SEDEX验厂概述 SEDEX是一家总部位于英国伦敦的非营利组织&#xf…

2.4 设备管理

文章目录 设备管理概述设备管理技术磁盘调度 设备管理概述 设备管理是操作系统中最繁杂、与硬件关系紧密的部分。 设备可以按照数据组织、资源分配、数据传输率分类。 数据组织&#xff1a;分为块设备&#xff08;ex. 磁盘&#xff09;、字符设备(ex. 打印机)。资源分配&#…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…

1222面经

1&#xff0c;Kafka 如何保障顺序消费? Kafka 保障顺序消费主要通过以下几个关键机制和配置来实现&#xff1a; 分区策略 Kafka 将主题划分为多个分区&#xff0c;每个分区内的消息是天然有序的&#xff0c;其按照消息发送到分区的先后顺序进行存储和追加。生产者在发送消息…

sed命令中单引号的处理

sed中’‘之间的单引号&#xff08;即单引号之间的单引号字符&#xff09;&#xff0c;特殊处理需要’“”’ &#xff08;两个单引号中两个双引号再最里面是目标一个单引号&#xff09; 比如&#xff1a; sed -i s#<a id""img_logo"" href"http…

语音增强的损失函数选择

一、最优尺度不变信噪比&#xff08;OSISNR&#xff09;损失函数 参考&#xff1a;论文解读 --Optimal scale-invariant signal-to-noise ratio and curriculum learning for monaural multi-spea   最优尺度不变信噪比&#xff08;OSI-SNR&#xff09;是一种用于评估信号质量…

【置信区间】之Python实现

置信区间是统计学中的一个核心概念,用于估计总体参数(如均值、比例等)的取值范围。以下是对置信区间的详细解释: 一、定义与基本概念 定义:置信区间是指由样本统计量所构造的总体参数的估计区间。它给出了参数真实值有一定概率落在该区间内的范围,反映了测量值的可信程度…

大恒相机开发(3)—大恒相机工业检测的实际案例

大恒相机工业检测的实际案例 工业检测的实际案例图像采集性能优化技巧工业环境下的稳定性 工业检测的实际案例 以下是一些使用大恒相机进行工业检测的实际案例&#xff1a; 多特征光学成像系统&#xff1a; 在这个案例中&#xff0c;使用大恒相机构建了一个全方位、多特征的图…

Java基础面试题20:Java语言sendRedirect()和forward()方法有什么区别?

Java基础面试题&#xff1a;Java语言sendRedirect()和forward()方法有什么区别&#xff1f; 在 Java Web 开发中&#xff0c;sendRedirect() 和 forward() 是两个非常常用的方法&#xff0c;但它们有一些核心区别。我们来用最简单的方式给你解释清楚。 一、sendRedirect() 和 …

go官方日志库带色彩格式化

go默认的 log 输出的日志样式比较难看&#xff0c;所以通过以下方式进行了美化和格式化&#xff0c;而且加入了 unicode 的ascii码&#xff0c;进行色彩渲染。 package mainimport ("fmt""log""os""runtime""strings""…

Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件&#xff0c;”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件” 在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c…

【C++语言】多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某种行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 我们可以举一个例子&#xff1a; 比如买票这种行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Centos7配置webrtc-streamer环境

Centos7配置webrtc-streamer环境 安装webrtc-streamer0.7版本 升级gdb 1、yum安装2、查看gdb版本3.下载待升级的gdb版本4.QA 1、预编译的时候报错no acceptable C compiler found in $PATH2、make的时候报错[all-bfd] Error3、make的时候报错 升级GCC 1.源码编译升级gcc9.3.0…

Vue.js 响应接口

Vue.js 响应接口 引言 Vue.js,作为当前前端开发领域中的佼佼者,以其简洁、高效和灵活的特点,赢得了广大开发者的喜爱。其核心功能之一便是响应式系统,它使得数据与视图之间的同步变得异常简单。本文将深入探讨Vue.js的响应接口,解析其工作原理,并展示如何在实际项目中有…

深入了解蓝牙Profile类型与设备的对应关系

在现代技术中,蓝牙作为一种无线通信技术,广泛应用于各种设备之间的短距离通信。不同的设备在连接时使用不同的蓝牙Profile(配置文件),每种Profile都为特定的设备功能提供支持,例如音频流传输、语音通话、文件传输等。在本文中,我们将详细介绍蓝牙Profile的常见类型及其对…

LLMs之PDF:MinerU(将PDF文件转换成Markdown和JSON格式)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF&#xff1a;MinerU(将PDF文件转换成Markdown和JSON格式)的简介、安装和使用方法、案例应用之详细攻略 目录 MinerU的简介 0、日志 1、MinerU 的主要特点 2、已知问题 MinerU 安装和使用方法 1、MinerU的三种体验方式 T1、在线演示 T2、快速CPU演示 T3、GPU …

【AIGC】ChatGPT 结构化 Prompt 的高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;标识符的使用&#xff08;Use of Identifiers&#xff09;1. #2. <>3. - 或 4. [] &#x1f4af;属性词的重要性和应用应用场景 &#x1f4af;具体模块…

Python绘制图表

Python提供了多种可视化库&#xff0c;常用的有matplotlib、seaborn和plotly等。这些库可以用于绘制各种类型的图表&#xff0c;如折线图、散点图、柱状图、饼图等。 下面是一个使用matplotlib绘制折线图的示例&#xff1a; python import matplotlib.pyplot as plt # 准备数…