2021物联网国赛通用库开发——E卷
本次所需要实现的功能如下
一:导入竞赛选手所需要自己添加的包文件
#include "hal_oled.h" //OLED屏头文件
二:添加为实现本题所使用到的全局变量
int count_radius; //半径变量
int count_height; //高度变量
double count_volume; //体积变量
char Rxdata_radius[64]; //半径数组
char Rxdata_height[64]; //高度数组
char Rxdata_volume[64]; //体积数组
double pa=3.14;
三:使用字模取模软件进行取模(格式为十六进制数组)
char yuan[32]={0x00,0xFE,0x02,0x82,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0x82,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x4F,0x60,0x50,0x48,0x46,0x48,0x50,0x60,0x4F,0x40,0xFF,0x00,0x00}; //圆
char zhu[32]={0x10,0x10,0xD0,0xFF,0x90,0x10,0x08,0x08,0x08,0x09,0xFA,0x08,0x08,0x08,0x08,0x00,0x04,0x03,0x00,0xFF,0x00,0x03,0x40,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x40,0x00}; //柱
char ban[32]={0x00,0x00,0x42,0x44,0x58,0x40,0x40,0xFF,0x40,0x40,0x50,0x48,0x46,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00}; //半
char jin[32]={0x00,0x10,0x88,0xC4,0x33,0x80,0x82,0x42,0x22,0x12,0x1A,0x26,0x22,0x40,0x80,0x00,0x02,0x01,0x00,0xFF,0x00,0x40,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x40,0x00}; //径
char gao[32]={0x04,0x04,0x04,0x04,0xF4,0x94,0x95,0x96,0x94,0x94,0xF4,0x04,0x04,0x04,0x04,0x00,0x00,0xFE,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x82,0xFE,0x00,0x00}; //高
char du[32]={0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00}; //度
char ti[32]={0x00,0x80,0x60,0xF8,0x07,0x10,0x10,0x10,0xD0,0xFF,0xD0,0x10,0x10,0x10,0x00,0x00,0x01,0x00,0x00,0xFF,0x10,0x08,0x04,0x0B,0x08,0xFF,0x08,0x0B,0x04,0x08,0x10,0x00}; //体
char ji[32]={0x20,0x24,0x24,0xA4,0xFE,0x23,0x22,0x20,0xFC,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x10,0x08,0x06,0x01,0xFF,0x01,0x06,0x80,0x63,0x19,0x01,0x01,0x09,0x33,0xC0,0x00}; //积
四:按键扫描函数(核心代码)
void KeyDownHandler(void) {
if(isKey2Pressed())
{
count_radius++; //当按键2被按下半径加1并替换掉R
sprintf(Rxdata_radius,"%d",count_radius);
OLED_ShowString(100,0,(uint8_t *)Rxdata_radius);
resetKey2();
}
if(isKey3Pressed())
{
count_height++; //当按键3被按下高度加1并替换掉H
sprintf(Rxdata_height,"%d",count_height);
OLED_ShowString(100,2,(uint8_t *)Rxdata_height);
resetKey3();
}
if(isKey4Pressed())
{
count_volume=(pa*count_radius*count_radius)*count_height; sprintf(Rxdata_volume,"%.2f",count_volume);
OLED_ShowString(100,4,(uint8_t *)Rxdata_volume);
resetKey4();
}
}
注:圆柱体积公式
圆柱体体积=底面积×高
当按键4被按下将当前的半径和高度带入圆柱体积公式并乘3.14得出结果(替换V)并以保留两位小数的公式输出在oled屏上
特别补充printf和sprintf的区别
sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。
五:mian函数
int main( void )
{
Init();
OLED_Init(); //OLED显示屏初始化
OLED_ShowString(100,0,(uint8_t *)"R");
OLED_ShowString(100,2,(uint8_t *)"H");
OLED_ShowString(100,4,(uint8_t *)"V");
while( 1 )
{
KeyDownHandler();
OLED_ShowCHineseArray(0,0,yuan);
OLED_ShowCHineseArray(20,0,zhu);
OLED_ShowCHineseArray(40,0,ban);
OLED_ShowCHineseArray(60,0,jin);
OLED_ShowString(80,0,(uint8_t *)":");
OLED_ShowCHineseArray(0,2,yuan);
OLED_ShowCHineseArray(20,2,zhu);
OLED_ShowCHineseArray(40,2,gao);
OLED_ShowCHineseArray(60,2,du);
OLED_ShowString(80,2,(uint8_t *)":");
OLED_ShowCHineseArray(0,4,yuan);
OLED_ShowCHineseArray(20,4,zhu);
OLED_ShowCHineseArray(40,4,ti);
OLED_ShowCHineseArray(60,4,ji);
OLED_ShowString(80,4,(uint8_t *)":");
}
}
六:全部代码
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
*/
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "hal_oled.h"
int count_radius;
int count_height;
double count_volume;
char Rxdata_radius[64];
char Rxdata_height[64];
char Rxdata_volume[64];
double pa=3.14;
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
if(isKey2Pressed())
{
count_radius++;
sprintf(Rxdata_radius,"%d",count_radius);
OLED_ShowString(100,0,(uint8_t *)Rxdata_radius);
resetKey2();
}
if(isKey3Pressed())
{
count_height++;
sprintf(Rxdata_height,"%d",count_height);
OLED_ShowString(100,2,(uint8_t *)Rxdata_height);
resetKey3();
}
if(isKey4Pressed())
{
count_volume=(pa*count_radius*count_radius)*count_height;
sprintf(Rxdata_volume,"%.2f",count_volume);
OLED_ShowString(100,4,(uint8_t *)Rxdata_volume);
resetKey4();
}
}
/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
for (int delay = 0; delay < 30; delay++) {
HAL_Delay(10);
}
}
char yuan[32]={0x00,0xFE,0x02,0x82,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0x82,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x4F,0x60,0x50,0x48,0x46,0x48,0x50,0x60,0x4F,0x40,0xFF,0x00,0x00};
char zhu[32]={0x10,0x10,0xD0,0xFF,0x90,0x10,0x08,0x08,0x08,0x09,0xFA,0x08,0x08,0x08,0x08,0x00,0x04,0x03,0x00,0xFF,0x00,0x03,0x40,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x40,0x00};
char ban[32]={0x00,0x00,0x42,0x44,0x58,0x40,0x40,0xFF,0x40,0x40,0x50,0x48,0x46,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00};
char jin[32]={0x00,0x10,0x88,0xC4,0x33,0x80,0x82,0x42,0x22,0x12,0x1A,0x26,0x22,0x40,0x80,0x00,0x02,0x01,0x00,0xFF,0x00,0x40,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x40,0x00};
char gao[32]={0x04,0x04,0x04,0x04,0xF4,0x94,0x95,0x96,0x94,0x94,0xF4,0x04,0x04,0x04,0x04,0x00,0x00,0xFE,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x82,0xFE,0x00,0x00};
char du[32]={0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00};
char ti[32]={0x00,0x80,0x60,0xF8,0x07,0x10,0x10,0x10,0xD0,0xFF,0xD0,0x10,0x10,0x10,0x00,0x00,0x01,0x00,0x00,0xFF,0x10,0x08,0x04,0x0B,0x08,0xFF,0x08,0x0B,0x04,0x08,0x10,0x00};
char ji[32]={0x20,0x24,0x24,0xA4,0xFE,0x23,0x22,0x20,0xFC,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x10,0x08,0x06,0x01,0xFF,0x01,0x06,0x80,0x63,0x19,0x01,0x01,0x09,0x33,0xC0,0x00};
/**
* Main application entry point.
*/
int main( void )
{
Init();
OLED_Init();
OLED_ShowString(100,0,(uint8_t *)"R");
OLED_ShowString(100,2,(uint8_t *)"H");
OLED_ShowString(100,4,(uint8_t *)"V");
while( 1 )
{
KeyDownHandler();
OLED_ShowCHineseArray(0,0,yuan);
OLED_ShowCHineseArray(20,0,zhu);
OLED_ShowCHineseArray(40,0,ban);
OLED_ShowCHineseArray(60,0,jin);
OLED_ShowString(80,0,(uint8_t *)":");
OLED_ShowCHineseArray(0,2,yuan);
OLED_ShowCHineseArray(20,2,zhu);
OLED_ShowCHineseArray(40,2,gao);
OLED_ShowCHineseArray(60,2,du);
OLED_ShowString(80,2,(uint8_t *)":");
OLED_ShowCHineseArray(0,4,yuan);
OLED_ShowCHineseArray(20,4,zhu);
OLED_ShowCHineseArray(40,4,ti);
OLED_ShowCHineseArray(60,4,ji);
OLED_ShowString(80,4,(uint8_t *)":");
}
}