- #include "menu.h"
- #include "oled.h"
- #include "gpio.h"
- #include "dinogame.h"
- #include "control.h"
- #include "DHT11.h"
- #include "rtc.h"
-
- RTC_DateTypeDef GetData; //获取日期结构体
-
- RTC_TimeTypeDef GetTime; //获取时间结构体
-
-
- //UI界面
- //主页
- /****************************************************/
- //UI库
-
- /****************************************************/
-
- void (*current_operation_index)();
-
- Menu_table table[30]=
- {
- {0,0,1,0,(*home)}, //一级界面(主页面) 索引,向下一个,确定,退出
-
- {1,2,5,0,(*Temperature)}, //二级界面 温湿度
- {2,3,6,0,(*Palygame)}, //二级界面 游戏
- {3,4,7,0,(*Setting)}, //二级界面 设置
- {4,1,8,0,(*Info)}, //二级界面 信息
-
- {5,5,5,1,(*TestTemperature)}, //三级界面:DHT11测量温湿度
- {6,6,6,2,(*ConrtolGame)}, //三级界面:谷歌小恐龙Dinogame
- {7,7,9,3,(*Set)}, //三级界面:设置普通外设状态 LED
- {8,8,8,4,(*Information)}, //三级界面:作者和相关项目信息
-
- {9,9,7,3,(*LED)}, //LED控制
- };
-
- uint8_t func_index = 0; //主程序此时所在程序的索引值
-
- void Menu_key_set(void)
- {
- if((KEY_Scan(1) == 1) && (func_index != 6))
- {
- func_index=table[func_index].next; //按键next按下后的索引号
- OLED_Clear();
- }
-
- if((KEY_Scan(1) == 2) && (func_index != 6))
- {
- func_index=table[func_index].enter; //按键enter按下后的索引号
- OLED_Clear();
- }
-
- if(KEY_Scan(1) == 3)
- {
- func_index=table[func_index].back; //按键back按下后的索引号
- OLED_Clear();
- }
-
- current_operation_index=table[func_index].current_operation; //执行当前索引号所对应的功能函数
- (*current_operation_index)();//执行当前操作函数
- }
-
-
- void home()
- {
- RTC_display();
- OLED_DrawBMP(0,0,20,3,signal_BMP);
- OLED_DrawBMP(20,0,36,2,gImage_bulethouch);
- OLED_DrawBMP(112,0,128,2,gImage_engery);
- OLED_DrawBMP(4,6,20,8,gImage_yes);
- OLED_DrawBMP(12,4,28,6,gImage_left);
- OLED_DrawBMP(40,2,88,8,gImage_home);
- OLED_DrawBMP(99,4,115,6,gImage_right);
- OLED_DrawBMP(107,6,123,8,gImage_back);
- }
-
- void Temperature()
- {
- RTC_display();
- OLED_DrawBMP(0,0,20,3,signal_BMP);
- OLED_DrawBMP(20,0,36,2,gImage_bulethouch);
- OLED_DrawBMP(112,0,128,2,gImage_engery);
- OLED_DrawBMP(4,6,20,8,gImage_yes);
- OLED_DrawBMP(12,4,28,6,gImage_left);
- OLED_DrawBMP(40,2,88,8,gImage_temp);
- OLED_DrawBMP(99,4,115,6,gImage_right);
- OLED_DrawBMP(107,6,123,8,gImage_back);
- }
-
- void Palygame()
- {
- RTC_display();
- OLED_DrawBMP(0,0,20,3,signal_BMP);
- OLED_DrawBMP(20,0,36,2,gImage_bulethouch);
- OLED_DrawBMP(112,0,128,2,gImage_engery);
- OLED_DrawBMP(4,6,20,8,gImage_yes);
- OLED_DrawBMP(12,4,28,6,gImage_left);
- OLED_DrawBMP(40,2,88,8,gImage_playgame);
- OLED_DrawBMP(99,4,115,6,gImage_right);
- OLED_DrawBMP(107,6,123,8,gImage_back);
- }
-
- void Setting()
- {
- RTC_display();
- OLED_DrawBMP(0,0,20,3,signal_BMP);
- OLED_DrawBMP(20,0,36,2,gImage_bulethouch);
- OLED_DrawBMP(112,0,128,2,gImage_engery);
- OLED_DrawBMP(4,6,20,8,gImage_yes);
- OLED_DrawBMP(12,4,28,6,gImage_left);
- OLED_DrawBMP(40,2,88,8,gImage_setting);
- OLED_DrawBMP(99,4,115,6,gImage_right);
- OLED_DrawBMP(107,6,123,8,gImage_back);
- }
-
- void Info()
- {
- RTC_display();
- OLED_DrawBMP(0,0,20,3,signal_BMP);
- OLED_DrawBMP(20,0,36,2,gImage_bulethouch);
- OLED_DrawBMP(112,0,128,2,gImage_engery);
- OLED_DrawBMP(4,6,20,8,gImage_yes);
- OLED_DrawBMP(12,4,28,6,gImage_left);
- OLED_DrawBMP(40,2,88,8,gImage_info);
- OLED_DrawBMP(99,4,115,6,gImage_right);
- OLED_DrawBMP(107,6,123,8,gImage_back);
- }
-
-
- //按键函数,不支持连按
- u8 KEY_Scan(u8 mode)
- {
- static u8 key_up=1;
- if(mode)key_up=1;
- if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
- {
- HAL_Delay(100); //消抖
- key_up=0;
- if(KEY0==0)return 1;
- else if(KEY1==0)return 2;
- else if(WK_UP==1)return 3;
- }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
- return 0;
- }
-
- void TestTemperature()
- {
- DHT11();
- }
-
- void ConrtolGame()
- {
- Game_control();
- }
-
- void Set()
- {
- OLED_ShowString(0,0,"Peripherals: Lights",16);
- OLED_ShowString(0,2,"Status: Closed",16);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
- }
-
- void Information()
- {
- OLED_ShowString(0,0,"Author:Sneak",16);
- OLED_ShowString(0,2,"Date:2022/8/23",16);
- OLED_ShowString(0,4,"Lab: Multi-level menu",16);
- }
-
- void LED()
- {
- OLED_ShowString(0,0,"Peripherals: Lights",16);
- OLED_ShowString(0,2,"Status: Open",16);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
- }
-
-
-
- void RTC_display() //RTC????
- {
- /* Get the RTC current Time */
- HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
- /* Get the RTC current Date */
- HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
-
- /* Display date Format : yy/mm/dd */
-
- /* Display time Format : hh:mm:ss */
- OLED_ShowNum(40,0,GetTime.Hours,2,16); //hour
- OLED_ShowString(57,0,":",16);
- OLED_ShowNum(66,0,GetTime.Minutes,2,16); //min
- OLED_ShowString(83,0,":",16);
- OLED_ShowNum(93,0,GetTime.Seconds,2,16); //seconds
- }