高职物联网屏幕控制LED灯

高职物联网模拟5

题目

5、LoRa显示与控制

请选手选择一块LoRa模块控制功能,并根据任务要求完成相关功能的开发,并发布程序到LoRa模块中,通上电源等待裁判评判。

任务要求****:

Ø 本题提供了工程项目供选手使用。

Ø 设备上电,默认情况下LoRa模块上的LED1和LED2灯都是熄灭的。LoRa模块液晶屏显示界面如下图所示

image-20221014103145945

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

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

img

Ø 当LoRa中选中某个灯开或者关时,点击Key4键,可以控制LoRa中对应LED1或者LED2的常亮或者熄灭。

分析

  • 按钮控制箭头的4个位置,其余文字位置不动
image-20221014110812437

代码

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

			
    }
}

posted @ 2022-10-17 10:27  ~内个臣呐~  阅读(412)  评论(0)    收藏  举报