高职物联网屏幕控制亮灯模式

高职物联网模拟2

题目

通电后 LED1,LED2 亮,液晶屏显示如下信息:

                        |----------------|
			|    亮灯模式	 |
			|  1.常亮模式 <	 |
			|  2.呼吸模式	 |
			|  3.交替亮灭	 |
			|----------------|
1. 以上三项所对应的模式,1 为 LED1,LED2 常亮,2 为 LED1,LED2 呼吸灯模式,3 为 LED1,LED2 交替亮灭, LED1 亮则 LED2 灭,LED1 灭则LED2 亮,其间隔时间为 0.5 秒。
2. 对 < 符号进行上下的移动,当按下 KEY2 时向上移,当按下 KEY3 时向下移动。
3. 当 < 所处的选项,按下 KEY4 时,LED1,LED2 进入相应的模式。
4. 能重复以上步骤。

分析

  • 屏幕显示文字会造成延迟效果,所以每次按键后显示文字和状态
  • 延时的时候按键不能控制的解决方法 定义变量每次延时一秒
  • 呼吸灯需要一直延时
/*头文件*/
#include "led_light.h"//呼吸灯头文件
/*所用函数*/
setBreathLedArg(64,128);//设置占空比 一般为64 128
switchLed1Breath();//设置LED1呼吸灯
switchLed2Breath();//设置LED2呼吸灯
breathLed();//开启呼吸灯
stopLedBreath();//停止呼吸

代码

/**
  ******************************************************************************
  * 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 "led_light.h"//呼吸灯头文件




/*--------------------------------- 取模-----------------------------------------*/

uint8_t liang[] = {0x00,0x04,0x04,0x74,0x54,0x54,0x55,0x56,0x54,0x54,0x54,0x74,0x04,0x04,0x00,0x00,
0x84,0x83,0x41,0x21,0x1D,0x05,0x05,0x05,0x05,0x05,0x7D,0x81,0x81,0x85,0xE3,0x00};//liang

uint8_t deng[] = {0x80,0x70,0x00,0xFF,0x20,0x10,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,
0x80,0x60,0x18,0x07,0x08,0x30,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00};//deng

uint8_t mo[] = {0x10,0x10,0xD0,0xFF,0x90,0x14,0xE4,0xAF,0xA4,0xA4,0xA4,0xAF,0xE4,0x04,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x89,0x4B,0x2A,0x1A,0x0E,0x1A,0x2A,0x4B,0x88,0x80,0x00};//mo

uint8_t shi[] = {0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x10,0x10,0xFF,0x10,0x10,0x11,0x16,0x10,0x00,
0x00,0x20,0x60,0x20,0x3F,0x10,0x10,0x10,0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00};//shi

uint8_t chang[] = {0x20,0x18,0x08,0xEA,0xAC,0xA8,0xA8,0xAF,0xA8,0xA8,0xAC,0xEA,0x08,0x28,0x18,0x00,
0x00,0x00,0x3E,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,0x00};//chang

uint8_t hu[] = {0x00,0xFC,0x04,0x04,0xFC,0x00,0x04,0x14,0x64,0x04,0xFE,0x02,0x43,0x32,0x00,0x00,
0x00,0x0F,0x04,0x04,0x0F,0x00,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x00};//hu

uint8_t xi[] = {0x00,0xFC,0x04,0x04,0xFC,0x02,0x02,0xFE,0x02,0x02,0x62,0x5A,0x46,0xC0,0x00,0x00,
0x00,0x0F,0x04,0x04,0x4F,0x30,0x8E,0x81,0x46,0x28,0x10,0x28,0x46,0x81,0x80,0x00};//xi

uint8_t jiao[] = {0x08,0x08,0x88,0x68,0x08,0x08,0x09,0x0E,0x08,0x08,0x88,0x28,0x48,0x88,0x08,0x00,
0x80,0x81,0x40,0x40,0x21,0x22,0x14,0x08,0x14,0x22,0x41,0x40,0x80,0x81,0x80,0x00};//jiao

uint8_t ti[] = {0x10,0x94,0x54,0x34,0x1F,0x34,0x54,0x80,0x54,0x34,0x1F,0x34,0x54,0x94,0x90,0x00,
0x01,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00};//ti

uint8_t mie[] = {0x02,0x02,0x82,0x72,0x02,0x02,0x02,0xFE,0x02,0x02,0x82,0x42,0x32,0x02,0x02,0x00,
0x80,0x81,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00};//mie



/*----------------------------------------------------------------------------------*/






/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
    // 开发板平台初始化
    BoardInitMcu();
    BoardInitPeriph();
    keys_init();//按键初始化
    setTimer2Callback(Time2Handler);
    Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
	 
}

/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/



uint8_t F = 2;//标志位置

uint8_t State = 0;//状态

uint32_t time = 0; //等待时间




//按键检测
void KeyDownHandler(void) {

            if(isKey2Pressed()){
                resetKey2();
                F -= 2;
                if(F == 0)F = 6;
                OLED_Clear();
        OLED_ShowCHineseArray(32,0,liang);OLED_ShowCHineseArray(48,0,deng);OLED_ShowCHineseArray(64,0,mo);OLED_ShowCHineseArray(80,0,shi);
        OLED_ShowString(16,2,"1.");OLED_ShowCHineseArray(32,2,chang);OLED_ShowCHineseArray(48,2,liang);OLED_ShowCHineseArray(64,2,mo);OLED_ShowCHineseArray(80,2,shi);
        OLED_ShowString(16,4,"2.");OLED_ShowCHineseArray(32,4,hu);OLED_ShowCHineseArray(48,4,xi);OLED_ShowCHineseArray(64,4,mo);OLED_ShowCHineseArray(80,4,shi);
        OLED_ShowString(16,6,"3.");OLED_ShowCHineseArray(32,6,jiao);OLED_ShowCHineseArray(48,6,ti);OLED_ShowCHineseArray(64,6,liang);OLED_ShowCHineseArray(80,6,mie);

            OLED_ShowString(96,F,"<");

            }

            if(isKey3Pressed()){
                resetKey3();
                F += 2;
                if(F == 8)F = 2;
                OLED_Clear();

        OLED_ShowCHineseArray(32,0,liang);OLED_ShowCHineseArray(48,0,deng);OLED_ShowCHineseArray(64,0,mo);OLED_ShowCHineseArray(80,0,shi);
        OLED_ShowString(16,2,"1.");OLED_ShowCHineseArray(32,2,chang);OLED_ShowCHineseArray(48,2,liang);OLED_ShowCHineseArray(64,2,mo);OLED_ShowCHineseArray(80,2,shi);
        OLED_ShowString(16,4,"2.");OLED_ShowCHineseArray(32,4,hu);OLED_ShowCHineseArray(48,4,xi);OLED_ShowCHineseArray(64,4,mo);OLED_ShowCHineseArray(80,4,shi);
        OLED_ShowString(16,6,"3.");OLED_ShowCHineseArray(32,6,jiao);OLED_ShowCHineseArray(48,6,ti);OLED_ShowCHineseArray(64,6,liang);OLED_ShowCHineseArray(80,6,mie);

            OLED_ShowString(96,F,"<");

            }

			if(isKey4Pressed()){
                    resetKey4();
                    State = F;

            }
            


}

/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
    for (int delay = 0; delay < 30; delay++) {
        HAL_Delay(10);
        
    }
}

void LED_State(uint8_t S){
    if(S == 2){

        stopLedBreath();
        GpioWrite(&Led1,0);
        GpioWrite(&Led2,0);
        switchLed1Breath();
        switchLed2Breath();

    }
    if(S == 4){
 
            breathLed();//开启呼吸灯
            

        

    }
    if(S == 6){//交替闪烁
        
        HAL_Delay(1);
        time ++;
        if(time == 500){
            stopLedBreath();
            GpioWrite(&Led1,0);
            GpioWrite(&Led2,1);
        }
        if(time == 1000){
            GpioWrite(&Led1,1);
            GpioWrite(&Led2,0);
            time = 0;

        }
        //再次初始化呼吸灯
        switchLed1Breath();
        switchLed2Breath();

    }

}


/**
 * Main application entry point.
 */
int main(void)
{
    Init();
OLED_Init();//初始化屏幕
OLED_Clear();//请屏幕

setBreathLedArg(64,128);//设置占空比

switchLed1Breath();//设置LED1呼吸灯
switchLed2Breath();//设置LED2呼吸灯

        OLED_ShowCHineseArray(32,0,liang);OLED_ShowCHineseArray(48,0,deng);OLED_ShowCHineseArray(64,0,mo);OLED_ShowCHineseArray(80,0,shi);
        OLED_ShowString(16,2,"1.");OLED_ShowCHineseArray(32,2,chang);OLED_ShowCHineseArray(48,2,liang);OLED_ShowCHineseArray(64,2,mo);OLED_ShowCHineseArray(80,2,shi);
        OLED_ShowString(16,4,"2.");OLED_ShowCHineseArray(32,4,hu);OLED_ShowCHineseArray(48,4,xi);OLED_ShowCHineseArray(64,4,mo);OLED_ShowCHineseArray(80,4,shi);
        OLED_ShowString(16,6,"3.");OLED_ShowCHineseArray(32,6,jiao);OLED_ShowCHineseArray(48,6,ti);OLED_ShowCHineseArray(64,6,liang);OLED_ShowCHineseArray(80,6,mie);
        OLED_ShowString(96,F,"<");
//显示一次文字
    while( 1 )
    {
        LED_State(State);//LED灯的状态

        KeyDownHandler();//按键检测
            
            

    }
}

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