第十五届蓝桥杯模拟考试III_物联网设计与开发官方代码分析

目录

  • 前言:
  • 显示界面部分:

前言:

这次模拟的效果很不好。85分,4h的限时我花了两天完成,这个时间是远远超出要求的,而且最后还只拿到56分,抛开分数高低不提,就这个用时属实蜗牛一样的速度,不根治比赛就是凉凉,分析原因主要有以下两点:
第一点配置CubMx过慢,这证明我对那个板子和原理图很不熟悉,这大概和我前一年学的标准库有关吧,才接触CubMx,还有就是各功能只过了一遍,大致很多细节都忘了,所以后续考虑把板子各引角对应的功能直接背下来,考试花更少的时间在看原理图上,芯片的引脚不算太多,还有就是一些接口代码必须要背下来,官方的参考代码里没有这些东西,这个没有技巧理解之后多练多写。
第二点就是官方的代码用的很优雅,将我几十行的代码用两三行的代码解决,这个是今天重点讨论对象。

显示界面部分:

显示界面部分由于要显示double类型数据,所以我写了一个oled_shownumber函数,也是基于oled_showchar的基础上写出来的,但是首先要写一个pow函数,又要写一个求数字长度的函数过于复杂,甚至数据长度一会是3一会是2的情况下我又要写一个区域清屏函数,光是这一部分代码估计就有100+

看了官方给的代码后我才宛若如梦初醒,以下是官方代码解析:

官方代码将sprintf函数用到了极致!!!

sprintf 函数的作用是将一个或多个表达式按照指定的格式转换成字符串,并将结果存储在指定的字符数组中,定义在 stdio.h 头文件中。

真是一个神仙函数,之前我还看不上,今天我才发现是我高攀不起的函数,真的是方便到极致

例子1:

原始人代码:

void Function_NumbertoStr(unsigned char a[]){unsigned char up[30];unsigned char down[30];sprintf(up, "%.2f", num1);sprintf(down, "%.2f", num2);unsigned char i = 0, j = 0, k = 0;while(up[j] != '\0') a[i ++] = up[j ++];a[i ++] = '/';		while(down[k] != '\0') a[i ++] = down[k ++];a[i] = '/';//OLED_ShowString(0, 2, a, 8);
}

优雅代码:

void Function_NumbertoStr(unsigned char a[]){sprintf(a, "%.2f/%.2f/",num1, num2);
}

在这里插入图片描述

两者等效妙解,这就是一个或多个表达式的意思

例子2:

原始人代码:

unsigned char Function_NumberPoint(double number){while(number >= 1){number = number - 1;}return (unsigned char)(number * 10 + 0.5);
}unsigned char  Function_NumberLen(unsigned char number){unsigned char res = 0;while(number){res = res + 1;number = number / 10;}if(res == 0) res = 1;return res;
}uint32_t OLED_Pow(uint32_t X, uint32_t Y){uint32_t result = 1;while(Y){result = result * X;Y --;}return result;
}void OLED_ShowNumber(unsigned char x, unsigned char y, uint32_t chr, unsigned char len, unsigned char size){unsigned char i = 0, j = 0;while(j < len){OLED_ShowChar(x, y, chr / OLED_Pow(10, len - 1 - i) % 10 + '0' , size);i ++;j ++;x += 8;if(x > 120){x = 0;y += 2;}}
}
void Function_ShowMasg1(void){OLED_ShowString(24, 0, "TEMP:", 16);OLED_ShowNumber(64, 0, (uint32_t)(num1), Function_NumberLen((uint32_t)(num1)), 16);OLED_ShowString(64 + 8 * Function_NumberLen((uint32_t)(num1)), 0, "." , 16);OLED_ShowNumber(64 + 8 * Function_NumberLen((uint32_t)(num1)) + 8, 0,  Function_NumberPoint(num1), 1, 16);OLED_ShowString(24, 2, "HUMI:", 16);OLED_ShowNumber(64, 2, (uint32_t)(num2), Function_NumberLen((uint32_t)(num2)), 16);OLED_ShowString(64 + 8 * Function_NumberLen((uint32_t)(num2)), 2, "." , 16);OLED_ShowNumber(64 + 8 * Function_NumberLen((uint32_t)(num2)) + 8, 2,  Function_NumberPoint(num2), 1, 16);}
void Function_ShowMasg2(void){OLED_ShowString(0, 0, "TEMP",16);OLED_ShowString(48, 0, "UP:", 16);OLED_ShowNumber(72, 0, upt[flag1], 2, 16);OLED_ShowString(32, 2, "DOWN:", 16);OLED_ShowNumber(72, 2, dnt[flag2], 2,16);
}void Function_ShowMasg3(void){OLED_ShowString(0, 0, "HUMI", 16);OLED_ShowString(48, 0, "UP:", 16);OLED_ShowNumber(72, 0, ups[flag3], 2, 16);OLED_ShowString(32, 2, "DOWN:", 16);OLED_ShowNumber(72, 2, dns[flag4], 2, 16);
}

优雅代码:

	if(ui == 0){sprintf((char*)ucBuf, "   TEMP:%.1f   ", TEMP_rx*0.1);OLED_ShowString(0, 0, ucBuf);sprintf((char*)ucBuf, "   HUMI:%.1f   ", HUMI_rx*0.1);OLED_ShowString(0, 2, ucBuf);}else if(ui == 1){ sprintf((char*)ucBuf, "TEMP  UP:%d  ", TEMP_UP);OLED_ShowString(0, 0, ucBuf);sprintf((char*)ucBuf, "    DOWN:%d  ", TEMP_DOWN);OLED_ShowString(0, 2, ucBuf);}else if(ui == 2){sprintf((char*)ucBuf, "HUMI  UP:%d  ", HUMI_UP);OLED_ShowString(0, 0, ucBuf);sprintf((char*)ucBuf, "    DOWN:%d  ", HUMI_DOWN);OLED_ShowString(0, 2, ucBuf);}

在这里插入图片描述
特别是这个格式,我弄了很久很久,又是写新的显示函数,又是写查看数字长度函数,又是调试区域,还好这次数字显示长度没有过多的变化,不用写区域清屏函数,否者真是越写越🤡

———— 2024 / 3 / 15

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

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

相关文章

【matlab】exportgraphics函数将生成的图片保存到指定文件夹中

【matlab】exportgraphics函数将生成的图片保存到指定文件夹中 使用matlab中&#xff0c;很多时候我们会生成一些图片&#xff0c;并且我们希望生成完显示出来后自动保存到指定路径&#xff0c;以下是本人常用的一个方法推荐 在Matlab中&#xff0c;exportgraphics函数用于将…

Seata 2.x 系列【8】Spring Cloud 集成客户端

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 问题演…

裸辞18K外包,面试阿里、字节全都一面挂,哭死.....

测试员可以先在外包积累经验&#xff0c;以后去大厂就很容易&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓今年今天履历只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大…

iptables详细介绍

在 CentOS 中,iptables 是一种用于配置和管理网络防火墙的工具,它提供了一种灵活和强大的方式来控制进出服务器的网络流量。以下是 CentOS 中 iptables 的主要内容: 规则链(Chains): iptables 使用规则链来组织规则,常见的链包括: INPUT:处理进入服务器的数据包。OUTP…

固定资产管理系统:井然有序,提升利用率,降损增值的解决之道。

固定资产管理系统是一种用于管理和跟踪组织内固定资产的软件系统。固定资产是指组织长期持有并用于生产、运营或提供服务的资产&#xff0c;例如土地、建筑物、机器设备、车辆等。 固定资产管理系统提供了一种集中管理和监控固定资产的方式&#xff0c;帮助组织更好地管理其资产…

外包干了9天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2018年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

HarmonyOS NEXT应用开发—自定义日历选择器

介绍 本示例介绍通过CustomDialogController类显示自定义日历选择器。 效果图预览 使用说明 加载完成后显示主界面&#xff0c;点当前日期后会弹出日历选择器&#xff0c;选择日期后会关闭弹窗&#xff0c;主页面日期会变成选定的日期。 实现思路 获取当前月和下个月的日期…

技术资讯:Volar正式更名为Vue-Official

大家好&#xff0c;我是大澈&#xff01; 本文约700字&#xff0c;整篇阅读大约需要1分钟。 关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费加入问答群&#xff0c;一起交流技术难题与未来&#xff01; 现在关注公众号&#xff0c;免费送你 ”前后端入行大礼包“…

【智能算法】人工水母搜索算法(JS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年&#xff0c;Chou 等人受到水母运动行为启发&#xff0c;提出了人工水母搜索算法(Artificial Jellyfish Search Optimizer, JS)。 2.算法原理 2.1算法思想 JS模拟了水母的搜索行为&#xf…

Halcon文件操作

1、Region读写操作 region&#xff08;区域&#xff09;是一种重要的数据类型&#xff0c;用于表示图像中的特定区域。这些区域可以代表图像中的目标、感兴趣的区域、边缘、形状等等 read_image (Image, printer_chip/printer_chip_01) dev_open_window (0, 0, 512, 512, black…

mysql: 如何开启慢查询日志?

1 确认慢查询日志功能已开启 执行以下sql语句&#xff0c;查看慢查询功能是否开启&#xff1a; show VARIABLES like slow_query_log;如果为ON&#xff0c;表示打开&#xff1b;如果为OFF&#xff0c;表示没有打开&#xff0c;需要开启慢查询功能。 执行以下sql语句&#xff0…

数据结构与算法----复习Part 15 ()

本系列是算法通关手册LeeCode的学习笔记 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 目录 一&#xff0c;二叉搜索树&#xff08;Binary Search Tree&#xff09; 二叉搜索树的查找 二叉搜索树的插入 …