高职物联网设置日期

1|0高职物联网设置日期

1|1题目

找到1块NB-IOT节点盒模块,要求在液晶屏上实现以下效果,考核选手对NB-IOT模块液晶屏的输出开发知识的掌握。

任务要求:

image-20221014200446633

Ø 初始运行图显示当前日期(年、月、日)。

Ø 按压KEY4键,显示设置图,黑色三角表示当前设置项。KEY2键上移黑色三角设置项,KEY3键下移黑色三角设置项。

Ø 在设置图页面按压KEY4,在当前设置项开启@符号,板上的LED2灯点亮,表示当前设置项可修改,KEY2键设置项加1,KEY3键设置项减1。

Ø 修改设置项后,按压KEY4,关闭@符号,板上的LED2灯熄灭,保存当前值,返回设置图。

Ø 在设置图状态下,按压KEY1复位键返回初始运行图,此时显示新设置的日期。

#通过多个样题有类似 用串口去设置日期时间的值

Ø 通过USB数据线,将NB-IoT智慧盒连接到开发机串口上,从开发机串口上发送以下16进制命令帧,NB-IoT接收后自动修改年、月、日参数,并统一返回成功:0xFB 0x00 0xFE或失败:0xFB 0x01 0xFE。

数据头 数据类型 年1 年2 数据尾
0xFB 0x01 0x14 0x15 0xFE

注:2021年拆分为20(年1),21(年2)两部分。

数据头 数据类型 数据尾
0xFB 0x02 0x0A 0xFE
数据头 数据类型 数据尾
0xFB 0x03 0x0C 0xFE

1|2分析

  • 将修改后的数据存到FLASH内部
  • 注意清除串口接收标志位

1|3代码

/** ****************************************************************************** * 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 "flash.h" //设置存储地址 #define ADDRESS1 0x800D000 uint8_t DQRQ[][32] = { /*-- 文字: 当 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x40,0x42,0x44,0x58,0x40,0x40,0x7F,0x40,0x40,0x50,0x48,0xC6,0x00,0x00,0x00, 0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00, /*-- 文字: 前 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08,0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00, 0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00, /*-- 文字: 日 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00, /*-- 文字: 期 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00, 0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00, }; uint8_t NYR[][32] = { /*-- 文字: 年 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00, 0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00, /*-- 文字: 月 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00, 0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00, /*-- 文字: 日 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00, }; uint8_t JT[] = { /*-- 调入了一幅图像:C:\Users\Newland\Pictures\image.bmp --*/ /*-- 宽度x高度=16x16 --*/ 0x80,0x80,0xC0,0xC0,0xE0,0xE0,0xF0,0xF8,0xF8,0xFC,0xFC,0xFE,0xFF,0xFF,0x00,0x00, 0x01,0x01,0x03,0x03,0x07,0x07,0x0F,0x1F,0x1F,0x3F,0x3F,0x7F,0xFF,0xFF,0x00,0x00, }; uint8_t Page = 1;//设置设置键KEY4的模式 uint8_t A = 1;//设置箭头标志 uint32_t DATE[3] = {2022,10,15};//初日期 /********************************************************************************************** *函数:void Init( void ) *功能:平台初始化 *输入:无 *输出:无 *特殊说明:无 **********************************************************************************************/ void Init() { // 开发板平台初始化 BoardInitMcu(); BoardInitPeriph(); keys_init();//按键初始化 setTimer2Callback(Time2Handler); Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次 } /********************************************************************************************** *函数:void KeyDownHandler( void ) *功能:按钮事件监听 *输入:无 *输出:无 *特殊说明:无 **********************************************************************************************/ uint8_t DAY[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//设置月份 //设置日期想了2小时发现根本就不用设置 -_- void DATATIME(){ //偷懒固定值 if(DATE[1] == 13) DATE[1] = 12; if(DATE[1] == 0) DATE[1] = 1; if(DAY[DATE[1]] == DATE[2]-1) DATE[2] = DAY[DATE[1]]; if(DATE[2] == 0)DATE[2] = 1; /*//想多了 笑死 根本就不需要判断 -_- if(DATE[0]%400 == 0||DATE[0]%100!=0&&DATE[0]%4 == 0){ if(DAY[DATE[1]]==DATE[2]-1){ DATE[1]++; DATE[2] = 1; } if(DATE[2] == 0){ DATE[1]--; DATE[2] = DAY[DATE[2]]; } }else { if(DAY[DATE[1]]==DATE[2]-1){ DATE[1]++; DATE[2] = 1; } if(DATE[2] == 0){ DATE[1]--; DATE[2] = DAY[DATE[2]]; } } */ } void KeyDownHandler(void) { if(Page!=1){ if(isKey2Pressed()){ OLED_Clear(); resetKey2(); if(Page == 3){ if(A == 1)DATE[0]--;//检测位置 if(A == 2)DATE[1]--; if(A == 3)DATE[2]--; DATATIME();//规范时间 OLED_ShowNum(32,2,DATE[0],4,16); OLED_ShowNum(32,4,DATE[1],2,16); OLED_ShowNum(32,6,DATE[2],2,16); } else A--; if(A == 0)A = 3; } if(isKey3Pressed()){ OLED_Clear(); resetKey3(); if(Page == 3){ if(A == 1)DATE[0]++; if(A == 2)DATE[1]++; if(A == 3)DATE[2]++; DATATIME(); OLED_ShowNum(32,2,DATE[0],4,16); OLED_ShowNum(32,4,DATE[1],2,16); OLED_ShowNum(32,6,DATE[2],2,16); } else A++; if(A == 4)A = 1; } } if(isKey4Pressed()){ OLED_Clear(); resetKey4(); Page ++;//设置逻辑流程 if(Page == 5)Page = 2; } if(Page == 4){ STMFLASH_Write(ADDRESS1,DATE,3); Page = 2;//使其反复 } } /********************************************************************************************** *函数:void handlerPre10Ms( void ) *功能:10毫秒循环 *输入:无 *输出:无 *特殊说明:循环处理总时长300ms **********************************************************************************************/ void handlerPre10Ms(void) { for (int delay = 0; delay < 30; delay++) { HAL_Delay(10); } } void ShowPage1(){ OLED_ShowCHineseArray(0,0,DQRQ[0]); OLED_ShowCHineseArray(16,0,DQRQ[1]); OLED_ShowCHineseArray(32,0,DQRQ[2]); OLED_ShowCHineseArray(48,0,DQRQ[3]); OLED_ShowChar(64,0,':'); OLED_ShowNum(0,4,DATE[0],4,16);OLED_ShowCHineseArray(40,4,NYR[0]); OLED_ShowNum(0,6,DATE[1],2,16);OLED_ShowCHineseArray(24,6,NYR[1]); OLED_ShowNum(48,6,DATE[2],2,16);OLED_ShowCHineseArray(72,6,NYR[2]); } void ShowPage2(){ OLED_ShowCHineseArray(0,2,NYR[0]);OLED_ShowChar(16,2,':');OLED_ShowNum(32,2,DATE[0],4,16); OLED_ShowCHineseArray(0,4,NYR[1]);OLED_ShowChar(16,4,':');OLED_ShowNum(32,4,DATE[1],2,16); OLED_ShowCHineseArray(0,6,NYR[2]);OLED_ShowChar(16,6,':');OLED_ShowNum(32,6,DATE[2],2,16); OLED_DrawBMP(127-32,2*A,16,16,JT); if(Page == 3){ OLED_ShowChar(127-16,2*A,'@'); } } /** * Main application entry point. */ int main( void ) { Init(); OLED_Init(); OLED_Clear(); STMFLASH_Read(ADDRESS1,DATE,3); ShowPage1(); while( 1 ) { UASRT_READ(); KeyDownHandler(); if(Page != 1){ ShowPage2(); } } }

1|4附加串口调整时间添加函数

uint8_t T[] = {0xFB,0x00,0xFE}; uint8_t F[] = {0xFB,0x01,0xFE}; void UASRT_READ(){ if(USART1_RX_BUF[0] == 0xFB){ if(USART1_RX_BUF[1] == 0x01&&USART1_RX_BUF[4] == 0xFE){ sprintf(arr,"%02x%02x",USART1_RX_BUF[2],USART1_RX_BUF[3]); DATE[0] = (arr[0]-'0')*1000+(arr[1]-'0')*100+(arr[2]-'0')*10+arr[3]-'0'; //DATE[0] = USART1_RX_BUF[2] * 16 *16 +USART1_RX_BUF[3]; STMFLASH_Write(ADDRESS1,DATE,3); USART1_SendStr(T,3); } else if(USART1_RX_BUF[1] == 0x02&&USART1_RX_BUF[3] == 0xFE){ sprintf(arr,"%02x",USART1_RX_BUF[2]); DATE[1] = (arr[0]-'0')*10+(arr[1]-'0'); //DATE[1] = USART1_RX_BUF[2]; //输入16进制设置时间 STMFLASH_Write(ADDRESS1,DATE,3); USART1_SendStr(T,3); } else if(USART1_RX_BUF[1] == 0x03&&USART1_RX_BUF[3] == 0xFE){ sprintf(arr,"%02x",USART1_RX_BUF[2]); DATE[2] = (arr[0]-'0')*10+(arr[1]-'0'); //DATE[2] = USART1_RX_BUF[2]; //输入16进制设置时间 STMFLASH_Write(ADDRESS1,DATE,3); USART1_SendStr(T,3); } else USART1_SendStr(F,3); STMFLASH_Read(ADDRESS1,DATE,3); OLED_Clear(); } USART1_ReceiveClr(); if(Page == 1) ShowPage1(); }

__EOF__

本文作者~内个臣呐~
本文链接https://www.cnblogs.com/Xin-chen/p/16798337.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ~内个臣呐~  阅读(547)  评论(6编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示