[物联网应用开发]2023年全国职业院校技能大赛-高职组-物联网应用开发-任务书(第1套卷)1 - 子任务2-3 NB-IOT控制液晶屏

子任务2-3 NB-IOT控制液晶屏

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

任务要求:

  • 初始运行图显示当前日期(年、月、日)。
  • 按压KEY4键,显示设置图,黑色三角表示当前设置项。KEY2键上移黑色三角设置项,KEY3键下移黑色三角设置项。
  • 在设置图页面按压KEY4,在当前设置项开启*符号,板上的LED2灯点亮,表示当前设置项可修改,KEY2键设置项加1,KEY3键设置项减1。
  • 修改设置项后,按压KEY4,关闭*符号,板上的LED2灯熄灭,保存当前值,返回设置图。
  • 通过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

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

完成以上务后请做以下步骤:

  1. 开发完成后将可以运行此要求的NB-IOT模块放在工作站电脑旁,通上电,等待裁判验证评分。
  2. 把工程源码打包成压缩文件,另存为“NBIOT日期.rar”。

总代码

timer_handles.c

/* Includes ------------------------------------------------------------------*/
#include "timer_handles.h"
#include "key_scaner.h"
#include "uart_receiver.h"
#include "usart1-board.h"
#include "usart2-board.h"

void Time2Handler(){
	keyScanner();
	uartReceiver();
}

void Time3Handler(){
}

oledfont.h

{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},/*"当",0*/

{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},/*"前",1*/

{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},/*"日",2*/

{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},/*"期",3*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",4*/

{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},/*"年",5*/

{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},/*"月",6*/

{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},/*"日",7*/

mian.c

/**
  ****************************************************************************
  * 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 "usart1-board.h"
#include "flash.h"

//flash地址
#define nian_FLASH  0x0800f300
#define yue_FLASH	  0x0800f400
#define ri_FLASH		0x0800f500

//2021 年
//10 月 11 日
uint32_t nian=2021,yue=10,ri=11,y = 0;

uint32_t y_cache,tu = 0;
//y_cache:存储y的缓存用于清除 <
//tu:切换运行图 0 为初始界面 1 为设置图 2 为修改图

void Init() {
    BoardInitMcu();
    BoardInitPeriph();
    keys_init();//按键初始化
    setTimer2Callback(Time2Handler);
    Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}


//初始运行图显示当前日期(年、月、日)。
void Initial_operation_diagram()
{
	//当前日期:
	OLED_ShowCHinese(0,0,50);//当
	OLED_ShowCHinese(16,0,51);//前
	OLED_ShowCHinese(16+16,0,52);//日
	OLED_ShowCHinese(16+16+16,0,53);//期
	OLED_ShowCHinese(16+16+16+16,0,54);//:
	//OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);

	OLED_ShowNum(0,3,nian,4,16);
	//OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);
	OLED_ShowCHinese(5*8,3,55);//年
	
	OLED_ShowNum(0,6,yue,2,16);
	OLED_ShowCHinese(3*8,6,56);//月
	OLED_ShowNum(3*8+16+8,6,ri,2,16);
	OLED_ShowCHinese(3*8+16+4*8,6,57);//日
}

//显示设置图
void Setup_Diagram()
{
	OLED_ShowCHinese(0,0,55);//年
	OLED_ShowCHinese(16,0,54);//:
	OLED_ShowNum(16+16+8+8,0,nian,4,16);
	
	OLED_ShowCHinese(0,3,56);//月
	OLED_ShowCHinese(16,3,54);//:
	OLED_ShowNum(16+16+8+8 +8+8,3,yue,2,16);
	
	OLED_ShowCHinese(0,6,57);//日
	OLED_ShowCHinese(16,6,54);//:
	OLED_ShowNum(16+16+8+8 +8+8,6,ri,2,16);
	
}
//按键
void Key()
{
	if(isKey4Pressed())
	{
		resetKey4();
		OLED_Clear();//屏幕清除
		Setup_Diagram();//设置图
		//显示三角型
		tu++;if(tu > 2)tu = 1;//切换图
		WriteFlashTest(nian_FLASH,nian);
		WriteFlashTest(yue_FLASH,yue);
		WriteFlashTest(ri_FLASH,ri);
		//WriteFlashTest(uint32_t Addr,uint32_t WriteFlashData);//写入
	}
	
	if(isKey2Pressed())//上移动用 -
	{
		resetKey2();
		if(tu == 1)
		{
			y_cache = y;
			y = y - 3;
			if(y > 6)  y = 6;// 确保 y 不会小于 0
		}
		if(tu == 2 && y == 0) nian++;
		if(tu == 2 && y == 3)	yue++;
		if(tu == 2 && y == 6) ri++;
		if(yue > 12)yue = 1;
		if(ri > 30)ri = 1;
	}
	if(isKey3Pressed())//下移动用 +
	{
		resetKey3();
		if(tu == 1)
		{
			y_cache = y;
			y = y + 3;
			if(y > 6) y = 0;// 确保 y 不会大于 6
		}
		if(tu == 2 && y == 0) nian--;
		if(tu == 2 && y == 3)	yue--;
		if(tu == 2 && y == 6) ri--;
		if(yue > 12 || yue == 0 )yue = 12;
		if(ri > 30 || ri == 0)ri = 30;
	}
	if(tu == 1)
	{
		OLED_ShowString(16+16 +8+8 +4*8 +4*8 - 2*8,y_cache,(uint8_t *)"   ");//清除三角
		OLED_ShowString(16+16 +8+8 +4*8 +4*8 - 2*8,y,(uint8_t *)"<  ");//显示三角
		GpioWrite(&Led2,1);//关闭*符号,板上的LED2 灯熄灭
	}
	if(tu == 2)
	{
		OLED_ShowString(16+16 +8+8 +4*8 +4*8 - 2*8,y,(uint8_t *)"< *");//显示*
		GpioWrite(&Led2,0);//在当前设置项开启*符号,板上的LED2 灯点亮,
		Setup_Diagram();//刷新数据
	}
}

//串口接收
void ck()
{
	if(Get_F_USART1_RX_FINISH())
	{
		//存储成功的返回.
		uint8_t ck_data_true[]  = {0xFB, 0x01, 0xFE};
		//存储失败的返回
		uint8_t ck_data_false[] = {0xFB, 0x00, 0xFE};
		bool USART1_TX_Flag = false;//发送成功失败标志位
		if(USART1_RX_BUF[0] == 0xFB)
		{
			//年
			if(USART1_RX_BUF[1] == 0x01 && USART1_RX_BUF[4] == 0xFE)
			{
				nian = USART1_RX_BUF[2] * 100;//千位百位
				nian = nian + USART1_RX_BUF[3];//十位个位
				USART1_TX_Flag = true;//成功
				//USART1_SendStr(uint8_t *Data, uint16_t length);
			}
			//月
			else if(USART1_RX_BUF[1] == 0x02 && USART1_RX_BUF[3] == 0xFE)
			{
				if(USART1_RX_BUF[2] < 0x0D && USART1_RX_BUF[2] > 0x00)
				{
					yue = USART1_RX_BUF[2];//修改月
					USART1_TX_Flag = true;//成功
				}
			}
			//日
			else if(USART1_RX_BUF[1] == 0x03 && USART1_RX_BUF[3] == 0xFE)
			{
				if(USART1_RX_BUF[2] < 0x1F && USART1_RX_BUF[2] > 0x00)
				{
					ri = USART1_RX_BUF[2];//修改日
					USART1_TX_Flag = true;//成功
				}
			}
			if(USART1_TX_Flag)USART1_SendStr(ck_data_true,3);//发送成功
			else USART1_SendStr(ck_data_false,3);//发送失败
			
			USART1_ReceiveClr();//串口1相关寄存器和标志位清空
			if(tu == 0) Initial_operation_diagram();//刷新数据
			if(tu == 1 || tu == 2)Setup_Diagram();//刷新数据
			WriteFlashTest(nian_FLASH,nian);
			WriteFlashTest(yue_FLASH,yue);
			WriteFlashTest(ri_FLASH,ri);
		}
	}
}

/**
 * Main application entry point.
 */
int main( void )
{
    Init();
		OLED_Init();//OLED屏幕初始化
		USART1_Init(115200);//串口初始化
		nian = PrintFlashTest(nian_FLASH);
		yue = PrintFlashTest(yue_FLASH);
		yue = PrintFlashTest(yue_FLASH);
		//uint32_t PrintFlashTest(uint32_t FLASH_ADDR);//读取	
		Initial_operation_diagram();//初始运行图显示当前日期(年、月、日)。
    while( 1 )   
    {
			Key();//按键
			ck();//串口
    }
}

工程

1.7zicon-default.png?t=N7T8https://www.yuque.com/attachments/yuque/0/2024/7z/29730975/1709717846383-1b7bb93a-0342-4708-b646-f04997130c6d.7z

视频

External Player - 哔哩哔哩嵌入式外链播放器icon-default.png?t=N7T8https://player.bilibili.com/player.html?bvid=BV1Jz421Q723&autoplay=0

交流方式

联系QQ:1546077713(可能搜索不到)

微信号:QQ1546077713

交流群企鹅:811789852

知识库:[物联网技能大赛]2023年至2024年竞赛笔记_持续更新

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值