蓝桥杯嵌入式备赛教程(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 */
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++----------函数的调用机制

栈帧的创建与销毁 栈帧创建过程 当一个函数被调用时&#xff0c;系统会在程序的栈空间中为该函数创建一个栈帧。首先&#xff0c;会将函数的返回地址&#xff08;即调用该函数的下一条指令的地址&#xff09;压入栈中&#xff0c;这确保函数执行完后能回到正确的位置继续执行后…

C语言初阶习题【9】数9的个数

1.编写程序数一下 1到 100 的所有整数中出现多少个数字9 2.思路 循环遍历1到100&#xff0c;需要判断每一位的个位数是否为9&#xff0c;十位数是否为9&#xff0c;每次符合条件就count进行计数&#xff0c;最后输出count&#xff0c;即可 3.code #define _CRT_SECURE_NO_W…

模型 课题分离

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

Docker 入门:如何使用 Docker 容器化 AI 项目(一)

引言 在人工智能&#xff08;AI&#xff09;项目的开发和部署过程中&#xff0c;环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码&#xff0c;确保每个人使用的环境一致&#xff0c;才能避免 “在我的机器上可以运行”的尴尬问题。…

Android修行手册 - 移动端几种常用动画方案对比

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

抢单人机交互「新红利」!哪些细分赛道“多金”?

受终端用户的智能座舱体验需求驱动&#xff0c;视觉、听觉、触觉等人机交互方式加速焕新。 一方面&#xff0c;人机多模交互引领&#xff0c;车载声学进入新周期。根据高工智能汽车研究院统计数据&#xff0c;单车的车载扬声器搭载量正在快速起量。 很显然&#xff0c;作为智…

Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量添加文本水印

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量添加文本水印 BiliBili视频链接&#xff1a; Linux shell脚本对常见图片格式转换webp和添加文本水印 在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&…

本地电脑使用命令行上传文件至远程服务器

将本地文件上传到远程服务器&#xff0c;在本地电脑中cmd使用该命令&#xff1a; scp C:/Users/"你的用户名"/Desktop/environment.yml ws:~/environment.yml 其中&#xff0c;C:/Users/“你的用户名”/Desktop/environment.yml是本地文件的路径&#xff0c; ~/en…

004最长回文子串

#include #include #include using namespace std; class Solution { public: string longestPalindrome(string s) { int n s.size(); if (n < 2) { return s; } int maxLen 1;int begin 0;// dp[i][j] 表示 s[i..j] 是否是回文串vector<vector<int>> …

蓝桥杯刷题——day8

蓝桥杯刷题——day8 题目一题干解题思路代码 题目二题干解题思路代码 题目一 题干 N 架飞机准备降落到某个只有一条跑道的机场。其中第i架飞机在 Ti时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di个单位时间&#xff0c;即它最早可以于 Ti时刻开始降落&am…

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结&#xff1a; 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框&#xff0c;使用加减乘除 4.1 表面采样器 …

【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹

代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…

STM32——“SPI Flash”

引入 在给单片机写程序的时候&#xff0c;有时会用到显示屏&#xff0c;就拿市面上的0.96寸单色显示器来说&#xff0c;一张全屏的图片就占用8x1281024个字节&#xff0c;即1kb的空间&#xff0c;这对于单片机来说确实有点奢侈&#xff0c;于是我买了一个8Mb的SPI Flash&#x…

Linux 下SVN新手操作手册

下面来介绍Linux 下 SVN操作方法&#xff1a; 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装&#xff0c;官方地址&#xff1a;https://subversion.apache.org/ 2、SVN的使用…

中国信通院致信感谢易保全:肯定贡献能力,期许未来合作

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;向易保全发感谢信表达谢意&#xff0c;对其在中国信通院牵头的“铸基计划”——企业数字化转型高质量发展推进行动实施中展现出的重要贡献给予了高度评价和肯定&#xff0c;并展望了双方至20…

【微信小程序】1|底部图标 | 我的咖啡店-综合实训

底部图标 引言 在微信小程序开发中&#xff0c;底部导航栏&#xff08;tabBar&#xff09;是用户界面的重要组成部分&#xff0c;它为用户提供了快速切换不同页面的功能。今天&#xff0c;我们将通过一个实际案例——“我的咖啡店”小程序&#xff0c;来详细解析如何配置底部图…

(补)算法刷题Day24: BM61 矩阵最长递增路径

题目链接 思路 方法一&#xff1a;dfs暴力回溯 使用原始used数组4个方向遍历框架 &#xff0c; 全局添加一个最大值判断最大的路径长度。 方法二&#xff1a;加上dp数组记忆的优雅回溯 抛弃掉used数组&#xff0c;使用dp数组来记忆遍历过的节点的最长递增路径长度。每遍历到已…

基于单片机的智能电子秤(论文+源码)

1.设计框架 本次智能电子秤单片机控制系统由7个部分构成&#xff0c;包括手机&#xff0c;蓝牙传输模块&#xff0c;LCD液晶显示模块&#xff0c;单片机控制系统、压力传感器检测电路&#xff0c;按键电路以及复位晶振&#xff0c;整体框图如图2.1所示。在功能上&#xff0c;整…

【保姆级别教程】VMware虚拟机安装Mac OS15苹果系统附带【VMware TooLS安装】【解锁虚拟机】和【Mac OS与真机共享文件夹】手把手教程

目录 准备工作 一、安装虚拟机 二、解锁系统 三、安装系统 四、部署系统 五、安装VMware Tools(选做) 为什么要安装VMware Tools&#xff0c;这是啥玩意&#xff1f; 六、配置共享文件夹(选做) 为什么要共享文件夹&#xff1f; 注意事项&#xff1a; 七、安装完成 准…

【服务器】linux服务器管理员查看用户使用内存情况

【服务器】linux服务器管理员查看用户使用硬盘内存情况 1、查看所有硬盘内存使用情况 df -h2、查看硬盘挂载目录下所有用户内存使用情况 du -sh /public/*3、查看某个用户所有文件夹占用硬盘内存情况 du -sh /public/zhangsan/*