第九届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)
一.题目分析
(1).题目


(2).题目分析
-
按键功能分析----存储位置的切换键
a. B1按下切换存储位置,切换后定时时间设定为当前位置存储的时间
b. B2短按切换时分秒+高亮,设置完成后,长按把设置的时间保存到当前位置,如果是临时设置的定时时间则不需要存储,直接按定时器启动按键
c. B3短按单次递增时分秒,长按超过8s开始迅速递增
d. 短按B4,定时器启动,运行期间短按,定时器暂停,再次按下,定时器恢复运行。长按B4超过0.8s,取消定时器运行
(3).逻辑导图


二.CubeMX配置
由于蓝桥杯使用的板子都是STM32G431RBT6,配置都是相同的,模板已经在第六届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)-CSDN博客配置完成,大家可以前往学习
三.相关代码实现
(1)MAIN
1.全局变量声明
#include "main.h"
#include "RCC\bsp_rcc.h"
#include "KEY_LED\bsp_key_led.h"
#include "LCD\bsp_lcd.h"
#include "I2C\bsp_i2c.h"
#include "TIM\bsp_tim.h"
//*减速变量
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Led_Set_Point = 0;//控制Led_Proc的执行速度
__IO uint32_t uwTick_Lcd_Set_Point = 0;//控制Lcd_Proc的执行速度
//全局变量
__IO uint32_t uwTick_Long_Short_Judge = 0;//短长按键判断专用
uint8_t ucState;//系统整体运行状态
uint8_t ucHour_Min_Sec[3];//小时分钟秒
uint8_t Storage_Num = 1;//存储序号
__IO uint32_t Sec_Boss = 0;//全局的秒变量
__IO uint32_t uwTick_Sec_Boss = 0;//控制秒的递减
__IO uint32_t uwTick_LED_BULING = 0;//控制LED闪烁
//***子函数声明区
void Key_Proc(void);
void Led_Proc(void);
void Lcd_Proc(void); 2.系统主函数
int main(void)
{SystemClock_Config();/*bsp资源的初始化*/KEY_LED_Init(); LCD_Init();LCD_Clear(White);LCD_SetBackColor(White);LCD_SetTextColor(Blue); I2CInit();PWM_OUTPUT_TIM3_Init();/*外设使用基本配置*/ iic_24c02_read(ucHour_Min_Sec, 0, 3); while (1){Key_Proc();Led_Proc();Lcd_Proc(); }}
3.子函数
B3扫描子函数
a.逻辑分析
由于按键3没有长按短按的判断,因此单独写一个函数,此函数的功能是判断是在状态几的时候按下的B3,以此对时分秒进行置零操作(每24小时/每60分钟/ 每60秒就置零)
b.程序源码
#include "main.h"
#include "RCC\bsp_rcc.h"
#include "KEY_LED\bsp_key_led.h"
#include "LCD\bsp_lcd.h"
#include "I2C\bsp_i2c.h"
#include "TIM\bsp_tim.h"
//*减速变量
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Led_Set_Point = 0;//控制Led_Proc的执行速度
__IO uint32_t uwTick_Lcd_Set_Point = 0;//控制Lcd_Proc的执行速度
//全局变量
__IO uint32_t uwTick_Long_Short_Judge = 0;//短长按键判断专用
uint8_t ucState;//系统整体运行状态
uint8_t ucHour_Min_Sec[3];//小时分钟秒
uint8_t Storage_Num = 1;//存储序号
__IO uint32_t Sec_Boss = 0;//全局的秒变量
__IO uint32_t uwTick_Sec_Boss = 0;//控制秒的递减
__IO uint32_t uwTick_LED_BULING = 0;//控制LED闪烁
//***子函数声明区
void Key_Proc(void);
void Led_Proc(void);
void Lcd_Proc(void); 按键扫描子函数
a.逻辑分析

b.程序源码
//***按键扫描子函数
void Key_Proc(void)
{if((uwTick - uwTick_Key_Set_Point)<50) return;//减速函数uwTick_Key_Set_Point = uwTick;ucKey_Val = Key_Scan();unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val); ucKey_Old = ucKey_Val;if(unKey_Down){uwTick_Long_Short_Judge = uwTick;} if((uwTick - uwTick_Long_Short_Judge) < 800)//短按识别{switch(ucKey_Up){case 2://如果B2短按if( ++ucState == 4)ucState = 1;break;case 4://如果B4短按if(ucState != 4){ ucState = 4;Sec_Boss = (__IO uint32_t)(3600*ucHour_Min_Sec[0] + 60*ucHour_Min_Sec[1] +ucHour_Min_Sec[2]);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //PA6,启动PWM的产生}else {ucLed = 0x00; //关闭LED闪烁HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); //关闭PWM生成ucState = 5;}break;case 3://如果B3短按,时分秒进行+1操作(一会儿写)B3_Ctrl();break;case 1://如果B1短按,切换存储位置(一会儿写)if(++Storage_Num == 6) Storage_Num = 1;iic_24c02_read(ucHour_Min_Sec, (3*(Storage_Num-1)), 3); break; }}else //长按{switch(ucKey_Val){case 2://如果B2长按,进入状态0if((ucState == 1)||(ucState == 2)||(ucState == 3)){ iic_24c02_write(ucHour_Min_Sec,(3*(Storage_Num-1)) , 3); ucState = 0;}break;case 3://如果B3长按,时分秒连续进行+1操作(一会儿写)B3_Ctrl(); break; case 4://如果B4长按,运行状态下进入状态0if(ucState == 4){ucLed = 0x00; //关闭LED闪烁HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); //关闭PWM生成 iic_24c02_read(ucHour_Min_Sec, (3*(Storage_Num-1)), 3); ucState = 0;} break; }}
LED扫描子函数
a.程序源码
void Led_Proc(void)
{if((uwTick - uwTick_Led_Set_Point)<200) return;//减速函数uwTick_Led_Set_Point = uwTick; LED_Disp(ucLed);
}
LCD扫描子函数
a.逻辑分析

b. 程序源码
void Lcd_Proc(void)
{if((uwTick - uwTick_Lcd_Set_Point)<100) return;//减速函数uwTick_Lcd_Set_Point = uwTick;if(ucState == 4)//此状态控制递减操作{if((uwTick - uwTick_Sec_Boss) >= 1000)//1s到来了,控制倒计时{uwTick_Sec_Boss = uwTick;Sec_Boss--;ucHour_Min_Sec[0] = Sec_Boss/3600;ucHour_Min_Sec[1] = Sec_Boss%3600/60; ucHour_Min_Sec[2] = Sec_Boss%3600%60; }if((uwTick - uwTick_LED_BULING) >= 500)//0.5s到来了,控制LED闪烁{uwTick_LED_BULING = uwTick; ucLed ^= 0x01; }}sprintf((char *)Lcd_Disp_String, " No %1d",Storage_Num);LCD_DisplayStringLine(Line3, Lcd_Disp_String); if(ucState == 1) LCD_SetBackColor(Yellow);LCD_DisplayChar(Line5, 224, (ucHour_Min_Sec[0]/10 + 0x30));LCD_DisplayChar(Line5, 208, (ucHour_Min_Sec[0]%10 + 0x30)); LCD_SetBackColor(White);LCD_DisplayChar(Line5, 192, ':'); if(ucState == 2) LCD_SetBackColor(Yellow);LCD_DisplayChar(Line5, 176, (ucHour_Min_Sec[1]/10 + 0x30));LCD_DisplayChar(Line5, 160, (ucHour_Min_Sec[1]%10 + 0x30)); LCD_SetBackColor(White);LCD_DisplayChar(Line5, 144, ':'); if(ucState == 3) LCD_SetBackColor(Yellow);LCD_DisplayChar(Line5, 128, (ucHour_Min_Sec[2]/10 + 0x30));LCD_DisplayChar(Line5, 112, (ucHour_Min_Sec[2]%10 + 0x30)); LCD_SetBackColor(White);switch(ucState)//仅用来表示状态信息{case 0:sprintf((char *)Lcd_Disp_String, " Standby ");LCD_DisplayStringLine(Line7, Lcd_Disp_String); break;case 1:case 2:case 3:sprintf((char *)Lcd_Disp_String, " Setting ");LCD_DisplayStringLine(Line7, Lcd_Disp_String); break; case 4:sprintf((char *)Lcd_Disp_String, " Running ");LCD_DisplayStringLine(Line7, Lcd_Disp_String); break;case 5:sprintf((char *)Lcd_Disp_String, " Pause ");LCD_DisplayStringLine(Line7, Lcd_Disp_String); break;}
}
(2)BSP
在第六届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)-CSDN博客里面有详细的讲解,大家可前往此链接学习
相关文章:
第九届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)
一.题目分析 (1).题目 (2).题目分析 按键功能分析----存储位置的切换键 a. B1按下切换存储位置,切换后定时时间设定为当前位置存储的时间 b. B2短按切换时分秒高亮,设置完成后,长按把设置的时…...
MATLAB云计算集成:在云端扩展计算能力
摘要 MATLAB云计算集成是指将MATLAB的计算能力与云平台的弹性资源相结合,以实现高性能计算、数据处理和算法开发。本文详细介绍了MATLAB云计算的基本概念、优势、配置要点以及编程实践。 1. 云计算概述 云计算是一种通过互联网提供计算资源(如服务器、…...
基于BeagleBone Black的网页LED控制功能(flask+gpiod)
目录 项目介绍硬件介绍项目设计开发环境功能实现控制LED外设构建Webserver 功能展示项目总结 👉 【Funpack3-5】基于BeagleBone Black的网页LED控制功能 👉 Github: EmbeddedCamerata/BBB_led_flask_web_control 项目介绍 基于 BeagleBoard Black 开发板…...
【C语言】单片机map表详细解析
1、RO Size、RW Size、ROM Size分别是什么 首先将map文件翻到最下面,可以看到 1.1 RO Size:只读段 Code:程序的代码部分(也就是 .text 段),它存放了程序的指令和可执行代码。 RO Data:只读…...
Java中的继承和实现
Java中的继承和实现在面向对象编程中扮演着不同的角色,它们之间的主要区别可以从以下几个方面进行阐述: 1. 定义和用途 继承(Inheritance):继承是面向对象编程中的一个基本概念,它允许我们定义一个类&…...
uniapp云打包
ios打包 没有mac电脑,使用香蕉云编 先登录香蕉云编这个工具,新建csr文件——把csr文件下载到你电脑本地: 然后,登录苹果开发者中心 生成p12证书 1、点击+号创建证书 创建证书的时候一定要选择ios distribution app store and ad hoc类型的证书 2、上传刚才从本站生成的…...
端口安全技术原理与应用
目录 概述 端口安全原理 端口安全术语 二层安全地址配置 端口模式下配置 全局模式下配置 动态学习 二层数据包处理流程 三层安全地址配置 三层数据包处理流程 端口安全违例动作和安全地址老化时间 查看命令 端口安全的注意事项 小结 概述 园区网的接入安全关系着…...
数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall
数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall 数据集-目标检测系列-鲨鱼检测数据集 shark 数据量:6k 数据样例项目地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/Te…...
数字乡村解决方案-3
1. 国家大数据战略与数字乡村 中国第十三个五年规划纲要强调实施国家大数据战略,加快建设数字中国,推进数据资源整合和开放共享,保障数据安全,以大数据助力产业转型升级和提高社会治理的精准性与有效性。 2. 大数据与数字经济 …...
WPF文本框无法输入小数点
问题描述 在WPF项目中,文本框BInding双向绑定了数据Text“{UpdateSourceTriggerPropertyChanged}”,但手套数据是double类型,手动输入数据时,小数点输入不进去 解决办法: 在App.xaml.cs文件中添加语句: …...
R开头的后缀:RE
RE表示方位上的向后,一种时空上的折返,和表示否定意味的不。 68.re- 空间顺序 ①表示"向后,相反,不" RE表示正向抵抗的力的词语,和情绪的词语,用来表示一种极力的反抗和拒绝,包括…...
Vue2配置环境变量的注意事项
在实际开发中时常会遇到需要开发环境与生产环境中一些参数的替换,为了方便线上线下环境变量切换可以利用node中的process进行环境变量管理 实现步骤如下: 1.在 根目录 新增环境文件 .env.development 和 .env.production 注意文件名称保持一致( 需要强调的是文件中的变量名切…...
机器学习:探索未知边界,解锁智能潜力
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 在这个日新月异的科技时代,机器学习作为人工智能领域的核心驱动力,正以前所未有的速度改变着我们的世界。从智能家居的个性化推荐到自动驾驶汽车的精准导航,从医疗诊断的辅助…...
万户OA-ezOFFICE fileUpload.controller 任意文件上传漏洞复现
0x01 产品描述: 万户OA(Office Automation)是一款企业级协同办公管理软件,旨在为企业提供全面的办公自动化解决方案。万户ezOFFICE存在任意文件上传漏洞。攻击者可以通过该远程下载任意文件到目标服务器,导致攻击者可获…...
Time-MoE : 时间序列领域的亿级规模混合专家基础模型
Time-MoE : 时间序列领域的亿级规模混合专家基础模型 时间序列预测一直是量化研究和工业应用中的重要课题。随着深度学习技术的发展,大规模预训练模型在自然语言处理和计算机视觉领域取得了显著进展,但在时间序列预测领域,这些模型的规模和运…...
Spring Boot入门指南
前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。本文将详细介绍 Spring Boot 的基本概念、环境搭建、第一…...
MYSQL(学习笔记)
<div>深分页怎么优化?</div> <div>还是以上面的SQL为空:select * from xxx order by id limit 500000, 10;</div> <div>方法一:</div> <div>从上面的分析可以看出,当offset非常大时&am…...
学校周赛(1)
A - Short Sort 题目: 思路: 本条题目只允许改一处地方,只有三个字母,我们可以直接枚举所有移动过的结果,同时使用哈希去记录其值,对于每一个输入我们都寻找是否有这个值记录,有则输出YES否则…...
人生苦短,我用Python✌
面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么,翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit() 新建文本文档后缀改成py 编写 运行 安装编写代码…...
uniapp js判断key是否在json中?
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
Python统一调用多AI模型:python-tgpt库实战指南
1. 项目概述:一个让Python与AI对话更简单的工具 如果你最近在尝试用Python调用各种大语言模型(LLM)的API,比如OpenAI的GPT、Google的Gemini,或者开源的Llama、Mistral,那你大概率经历过这样的场景…...
终极指南:如何快速掌握Clean Code PHP编码规范提升团队协作效率
终极指南:如何快速掌握Clean Code PHP编码规范提升团队协作效率 【免费下载链接】clean-code-php :bathtub: Clean Code concepts adapted for PHP 项目地址: https://gitcode.com/gh_mirrors/cl/clean-code-php 在PHP开发中,编写清晰、可维护的代…...
企业知识管理新方案:OpenCorpo开源项目部署与RAG架构实践
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫 OpenCorpo。这名字听起来有点“高大上”,但说白了,它就是一个帮你把公司内部那些零散、混乱的文档、知识、流程给“盘活”的工具。想象一下,你公司里是不是有无数个共享…...
免费抠图软件一键抠图无水印有哪些?2026年最实用工具对比测试
最近很多粉丝问我,有没有真正免费、无水印、操作简单的抠图软件?说实话,市面上的抠图工具五花八门,但真正好用的没几个。我这次花了不少时间测试了十多款抠图软件,今天就把我的真实体验分享给大家。为什么你需要一个好…...
Gemini Pro长上下文处理翻车现场全复盘,128K token真实压测数据曝光,你还在用默认配置?
更多请点击: https://intelliparadigm.com 第一章:Gemini Pro长上下文能力的本质认知与风险预警 Gemini Pro 的长上下文(如支持高达 1M tokens 输入)并非单纯“记忆增强”,而是基于分块注意力优化与上下文压缩策略的工…...
供应商风险评估,是怎么做的?我亲历的两家工厂对比
🏎️ SQE供应商质量管理实战系列 第3篇/共50篇供应商风险评估,是怎么做的?我亲历的两家工厂对比有一年,公司要给一款新车型采购某个零件,在全球范围内选供应商。有一年,公司要给一款新车型采购某个零件&am…...
在Android 9上用vsomeip 3.3.8实现跨进程通信:一份保姆级编译与配置指南
在Android 9上实现跨进程通信:vsomeip 3.3.8编译与配置实战 在车载以太网和智能座舱系统开发中,跨进程通信(IPC)是基础且关键的技术环节。对于Android平台开发者而言,如何在NDK环境下高效实现Linux进程间通信ÿ…...
FPG财盛国际:投资者教育生态的全面布局
FPG财盛国际:投资者教育生态的全面布局金融服务行业的复杂性决定了平台需要在多个维度上同时具备较高的水准。FPG财盛国际经过多年的发展,已经在合规、技术、服务、教育等方面形成了一套相互支撑的体系。本文从评测视角出发,对其综合实力进行…...
设计器模版底图,一直渲染错误,是因为第一张图变形后内存中图片数据被改了,其他尺码一直错误
这其实是你们现在更需要的组合:不是只看 decode(),而是再确认“这次 decode 对应的还是当前这张图”。再确认“这次 decode 对应的还是当前这张图” 是怎么做到的,详细列举代码我直接从现在这次改动的代码里,把"确认图片身份…...
D3KeyHelper终极指南:5分钟上手暗黑3智能宏,轻松提升游戏体验
D3KeyHelper终极指南:5分钟上手暗黑3智能宏,轻松提升游戏体验 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏…...
