高职物联网屏幕控制LED灯
高职物联网模拟5
题目
5、LoRa显示与控制
请选手选择一块LoRa模块控制功能,并根据任务要求完成相关功能的开发,并发布程序到LoRa模块中,通上电源等待裁判评判。
任务要求****:
Ø 本题提供了工程项目供选手使用。
Ø 设备上电,默认情况下LoRa模块上的LED1和LED2灯都是熄灭的。LoRa模块液晶屏显示界面如下图所示

Ø 每按一次Key2键可以控制LoRa屏幕中小箭头以LED1开 → LED2关 → LED2开 → LED1关 → LED1开这样的顺序循环切换小箭头指示。
每按一次Key3键可以控制LoRa屏幕中小箭头以LED1开 → LED1关 → LED2开 → LED2关 → LED1开这样的顺序循环切换小箭头指示。效果如下图所示

Ø 当LoRa中选中某个灯开或者关时,点击Key4键,可以控制LoRa中对应LED1或者LED2的常亮或者熄灭。
分析
- 按钮控制箭头的4个位置,其余文字位置不动
代码
/**
******************************************************************************
* 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"
uint8_t xy = 1;
void showtest();//声明函数
unsigned char KG[][32] = {
/*-- 文字: 开 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 关 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,
};
//三角形
uint8_t image[] ={
/*-- 调入了一幅图像:C:\Users\Newland\Desktop\物联网大赛_开发题解题\高职物联网模拟_屏幕控制LED灯.assets\image-20221014110812437.bmp --*/
/*-- 宽度x高度=32x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFE,0xFF,
0xFF,0xFE,0xFC,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,
};
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {//按键检测
if(isKey2Pressed()){
OLED_Clear();
resetKey2();
xy++;
if(xy > 2)xy = 1;
showtest();//显示一次文字加箭头
}
if(isKey3Pressed()){
OLED_Clear();
resetKey3();
xy++;
if(xy == 5)xy = 1;//设置箭头位置
showtest();
}
if(isKey4Pressed()){
resetKey4();
switch (xy)//是否亮灯
{
case 1:
GpioWrite(&Led1,0);
break;
case 2:
GpioWrite(&Led1,1);
break;
case 3:
GpioWrite(&Led2,0);
break;
case 4:
GpioWrite(&Led2,1);
break;
}
}
}
/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
for (int delay = 0; delay < 30; delay++) {
HAL_Delay(10);
}
}
//显示内容
void showtest(){ //屏幕布局定义
OLED_ShowString(0,0,(unsigned char *)"LED1:");
OLED_ShowCHineseArray(64-16,0,KG[0]);
OLED_ShowCHineseArray(96,0,KG[1]);
OLED_ShowString(0,4,(unsigned char *)"LED2:");
OLED_ShowCHineseArray(64-16,4,KG[0]);
OLED_ShowCHineseArray(96,4,KG[1]);
OLED_DrawBMP(64-16+(xy % 2==0?96-64+16:0)-8,2+(xy>=3?4:0),32,16,image);
//根据位置得出公式进行位置判断
}
/**
* Main application entry point.
*/
int main( void )
{
//一些必要初始化
Init();
OLED_Init();
OLED_Clear();
showtest();
while( 1 )
{
KeyDownHandler();
}
}

浙公网安备 33010602011771号