高职物联网设置日期
1|0高职物联网设置日期
1|1题目
找到1块NB-IOT节点盒模块,要求在液晶屏上实现以下效果,考核选手对NB-IOT模块液晶屏的输出开发知识的掌握。
任务要求:
Ø 初始运行图显示当前日期(年、月、日)。
Ø 按压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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Xin-chen/p/16798337.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律