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

news2024/12/24 20:58:04

一、工程模版创建流程


第一步 创建新项目

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

 第三步 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.coloradmin.cn/o/2264911.html

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

相关文章

步进电机位置速度双环控制实现

步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…

devops和ICCID简介

Devops DevOps&#xff08;Development 和 Operations 的组合&#xff09;是一种软件开发和 IT 运维的哲学&#xff0c;旨在促进开发、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。它强调自动化流程&#xff0c;持续集成&#xff08;CI&#xf…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

数据结构:算法篇:快速排序;直接插入排序

目录 快速排序 直接插入排序 改良版冒泡排序 快速排序 理解&#xff1a; ①从待排序元素中选定一个基准元素&#xff1b; ②以基准元素将数据分为两部分&#xff1a;&#xff08;可以将&#xff1a;大于基准元素放左&#xff0c;小于基准元素放右&#xff09; ③对左半部分…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

如何打造用户友好的维护页面:6个创意提升WordPress网站体验

在网站运营中&#xff0c;无论是个人博主还是大型企业网站的管理员&#xff0c;难免会遇到需要维护的情况。无论是服务器迁移、插件更新&#xff0c;还是突发的技术故障&#xff0c;都可能导致网站短暂无法访问。这时&#xff0c;设计维护页面能很好的缓解用户的不满&#xff0…

postman读取文件执行

要从文件获取的变量 text 在pre-request 中写从文件获取数据的脚本。脚本实现了&#xff0c;设置了text默认值&#xff0c;从文件读取text列&#xff0c;将text存入环境变量 //获取text参数 var text "济南天气"; if(data.text){ text data.text } pm.environment.…

37. Three.js案例-绘制部分球体

37. Three.js案例-绘制部分球体 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中的一个渲染器类&#xff0c;用于将3D场景渲染到网页上。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数&#xff0c;可选。 常用…

【Rust自学】4.4. 引用与借用

4.4.0 写在正文之前 这一节的内容其实就相当于C的智能指针移动语义在编译器层面做了一些约束。Rust中引用的写法通过编译器的约束写成了C中最理想、最规范的指针写法。所以学过C的人对这一章肯定会非常熟悉。 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文…

电脑使用CDR时弹出错误“计算机丢失mfc140u.dll”是什么原因?“计算机丢失mfc140u.dll”要怎么解决?

电脑使用CDR时弹出“计算机丢失mfc140u.dll”错误&#xff1a;原因与解决方案 在日常电脑使用中&#xff0c;我们时常会遇到各种系统报错和文件丢失问题。特别是当我们使用某些特定软件&#xff0c;如CorelDRAW&#xff08;简称CDR&#xff09;时&#xff0c;可能会遇到“计算…

C# 基本信息介绍

总目录 前言 对 C# 做一个基本信息介绍&#xff0c;让我们对 C# 有个基本的认识。 在进行本文的阅读之前&#xff0c;可以瞧瞧 编程基础知识简述 简单的入个门儿。 一、C# 1. C# 概述 C#是由微软公司发布的一种由C和C衍生出来的面向对象的编程语言。 2. C# 详细介绍 C#&am…

『Linux学习笔记』FRPC 详细介绍及配置解析!

『Linux学习笔记』FRPC 详细介绍及配置解析&#xff01; 文章目录 一. FRPC 详细介绍及配置解析FRPC 的主要功能FRPC 配置文件解析全局配置代理配置第一个代理服务第二个代理服务 配置文件整体工作流程常见配置项说明FRPC 的使用步骤注意事项结论 二. 参考文献 一. FRPC 详细介…

WPS工具栏灰色怎么办

WPS离线不登录&#xff0c;开启工具栏等相关功能 当你在使用WPS的过程中&#xff0c;若因网络问题或其他特殊原因&#xff0c;导致无法登录使用WPS时&#xff0c;可根据以下步骤开启离线兼容模式&#xff0c;开启此模式后&#xff0c;可在未登录的状态下&#xff0c;激活并使用…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

JavaEE进阶--mybatis使用测试日志参数传递浏览器访问

文章目录 1.项目创建2.mybatis的使用2.1创建初始页面2.2补充yml文件2.3navicate表2.4用户类的编写2.5查询接口2.6运行测试 3.细节说明3.1java开发规范3.2关于包3.3持久层代码 4.测试文件4.1如何生成4.2生成位置4.3补充方法 5.配置mybatis日志6.参数传递6.1单个参数6.2多个参数 …

IDEA用jformdesigner插件做管理系统MVC架构

在 IntelliJ IDEA 中结合 JFormDesigner 插件&#xff0c;通过 Swing 框架实现一个管理系统的 MVC 架构是一种经典的开发方式。以下是具体的步骤和实现思路&#xff0c;包含从项目创建到 MVC 架构的核心代码实现。 1. 项目结构设计 为了清晰的 MVC 分层架构&#xff0c;建议按…

学习Cookie 提升

目录 Cookie 的覆盖​​​​​​​ Cookie下的path 特点 设置Cookie 路径 实例 Cookie的最大存活时间 设置Cookie 存活时间 实例 Cookie 和session的区别 和联系 Cookie 的覆盖 当 key相同 和只要path的上级目录的路径相同&#xff0c;就可以被替换掉 value 值 如下图…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器&#xff1a; 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

4、mysql高阶语句

mysql高阶语句是对复杂的条件进行查询的操作。 排序—order by 加了desc表示由大到小 1、查询name和score&#xff0c;地址都是云南西路的按id进行由小到大排序 2、查询name和score&#xff0c;先按hobbid进行排序&#xff0c;再把结果按id进行排序 第一段字段必须要有相同的…

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行&#xff0c;常常需要在狭窄的空间内完成货物的搬运和堆垛&#xff0c;这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离&#xff0c;然而这种方式往往存在误差&#xff0c;特别是在视线受阻或光…