高职物联网模拟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();//按键检测
}
}