高职物联网设置日期

高职物联网设置日期

题目

找到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

分析

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

代码

/**
  ******************************************************************************
  * 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();

        }

			
    }
}

附加串口调整时间添加函数

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();
        
}


posted @ 2022-10-17 10:37  ~内个臣呐~  阅读(634)  评论(6)    收藏  举报