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

news2025/1/13 13:22:50

目录

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

前言:

这次模拟的效果很不好。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.coloradmin.cn/o/1519609.html

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

相关文章

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试根据新危险化学品经营单位安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将危险化学品经营单位安全管理人员模拟考试试题进行汇编&#xff0c;组成一套危险化学品经…

安装nginx

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新浪、网易、腾…

2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

题目 给定一个长度为 N 的数列&#xff0c;A1,A2,…AN&#xff0c;如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 第一行包含两个整数 N 和 K。 以下 N…

DeePhage:预测噬菌体的生活方式

GitHub - shufangwu/DeePhage: A tool for distinguish temperate phage-derived and virulent phage-derived sequence in metavirome data using deep learning 安装 conda create -n deephage conda activate deephage pip install numpy pip install h5py pip install ten…

淘宝联盟高级API - 超级搜索api接口, 淘宝联盟商品搜索接口

淘宝联盟商品库超级搜索api接口&#xff0c;支持搜索商品链接、商品id&#xff0c;商品标题搜索&#xff0c;还有更多强大搜索选项。 注意&#xff1a;接口默认只查【含有优惠券】的商品&#xff0c;如果需要精确搜索&#xff0c;请将 has_coupon 参数设置为 false 获取接口秘…

深入理解JMM

一、什么是JMM JMM&#xff08;java memory model&#xff09;Java内存模型&#xff1a;是java虚拟机规范中定义的一组规范&#xff0c;用于屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让JAVA程序在各平台都能达到一致的并发结果。其主要规定了线程和内存之间的…

苍穹外卖问题记录(持续更新)

Day01_3.2.4前后端联调 1. 前端无法登录 &#xff08;1&#xff09;确保nginx服务器已经启动 &#xff08;2&#xff09;查看自己数据库的用户名和密码是否和老师的一样&#xff0c;不一样的话需要在application-dev.yml文件中把老师的用户名密码修改成自己的 老师的用户名…

面试常问,ADC,PWM

一 PWM介绍 pwm全名&#xff08;Pulse Width Modulation&#xff09;&#xff1a;脉冲宽度调制 在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行调制&#xff0c;来等效地获得所需要的模拟参量&#xff0c;常应用于电机控速等领域。PWM一定程度上是数字到模拟…

植物神经功能紊乱患者每天从5片黛力新减少至2片,只因找对了治疗方法!

植物神经功能紊乱是一种常见的心理疾病&#xff0c;其症状包括焦虑、失眠、疲劳、头痛、胃肠不适等&#xff0c;给患者带来很大的困扰。然而&#xff0c;这种疾病是可以治疗的。本文将介绍一位植物神经功能紊乱患者的治疗经历&#xff0c;希望能够帮助更多的人了解和治疗此病。…

【机器学习300问】38、什么是K-means算法?

在实际工作中&#xff0c;我们经常会遇到这样一类问题&#xff1a;给机器输入大量的特征数据&#xff0c;并期望机器通过学习找出数据存在的某种共性特征、结构或关联。这类问题被称为“非监督学习”问题。这篇文章我就来聚焦非监督学习中的其中一个任务——聚类 例如在数字营销…

F-logic DataCube3 任意文件上传漏洞复现(CVE-2024-25832)

0x01 产品简介 F-logic DataCube3是一款用于光伏发电系统的紧凑型终端测量系统。 0x02 漏洞概述 F-logic DataCube3 /admin/setting_photo.php接口处存在任意文件上传漏洞 ,未经身份验证的攻击者可通过该漏洞在服务器端写入后门,获取服务器权限,进而控制整个web服务器。 …

【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)1. 各种变换的关系2. 变换公式3. 2D变换的层次4. python实现 一、向量和矩阵的基本运算 【计算机视觉】二、图像形成&#xff1a;1、向量和矩阵…

【研发日记】Matlab/Simulink技能解锁(五)——Simulink布线技巧

前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug》 见《【研发日记】Matlab/Simulink…

HarmonyOS ArkUI入门—HarmonyOS ArkUI来开发一个健康饮食应用

本文演示如果在DevEco Studio 3里面&#xff0c;用HarmonyOS的ArkUI来开发一个健康饮食应用。体验HarmonyOS 3最新API 9&#xff01; 获取HarmonyOS应用 HarmonyOS的ArkUI来开发一个健康饮食的ArkUI程序“ArkUIHealthyDiet”&#xff0c;基础代码已经有了[1]&#xff0c;个人…

DHCP-SNOOPING-嗅探/窥探

DHCP-SNOOPING 私接设备了&#xff0c;非终端收到了报文 所有接口设置为非信任&#xff0c;然后单独配置其中一个接口为信任

《ARM汇编与逆向工程 蓝狐卷 基础知识》

推荐一本专注于Arm逆向分析技术的好书《ARM汇编与逆向工程 蓝狐卷 基础知识》&#xff0c;3月21日将在点赞者中抽取粉丝进行本书包邮免费赠送。 目录 正文内容简介作者简介译者简介目录了解更多 正文 与传统的CISC&#xff08;Complex Instruction Set Computer&#xff0c;复…

聚道云连接器助力航信费控与用友U8无缝对接,赋能供应链管理!

客户介绍 某供应链管理有限公司是一家专注于供应链管理和物流服务的领先企业&#xff0c;在行业内享有盛誉。公司业务遍布全球&#xff0c;拥有庞大的客户群和丰富的行业经验。近年来&#xff0c;公司不断加大数字化投入&#xff0c;以提升运营效率和服务水平。 客户痛点 在…

springboot274基于web的电影院购票系统

电影院购票系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装电影院购票系统软件来发挥其高效…

渗透测试实战思路分析

免责声明&#xff1a;文章来源真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人…

单片机设计-基于树莓派的wifi小车的设计与实现

项目介绍 有两个目的&#xff1a;1&#xff09;实现wifi小车的基本功能&#xff1a;使用树莓派&#xff08;单片机&#xff09;以及各种电子元器件&#xff0c;组装完成一个智能小车&#xff0c;通过Python、Java、C控制树莓派&#xff08;单片机&#xff09;的GPIO&#xff0…