|
主函數(shù)程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "timer.h"
#include "lcd.h"
#include "menu.h"
#include "opencv_uart.h"
int main(void)
{
uint8_t key_value;
uint32_t main_time,key_time;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
delay_init(168); //初始化延時(shí)函數(shù)
uart_init(115200); //初始化串口波特率為115200
usart2_init(115200);
TIMER2_Init();
LED_Init(); //初始化LED
KEY_Init();
LCD_Init(); //初始化LCD FSMC接口
POINT_COLOR=RED; //畫筆顏色:紅色
SetDefaultMenuHandler(Str_Test);//設(shè)置功能函數(shù)
while(1)
{
Thebeginningoftheinterface();
if(KEY_UP==0)
break;
}
delay_ms(200);
DispCrtMenu(); //將主菜單頁面先顯示,去掉此句進(jìn)入為黑屏
while(1)
{
main_time = Get_RunTime(); //獲取系統(tǒng)時(shí)間
if(main_time > key_time) //按鍵掃描,10毫秒1次
{
key_time = main_time;
key_value = KEY_Scan(0);
if(key_value!=0xff)
{
Display(key_value);
}
}
}
}
menu.c文件如下:
#include "menu.h"
#include <stdio.h>
#include "string.h"
#include "lcd.h"
#include "key.h"
#include "led.h"
#include "delay.h"
#include "image.h"
#include "picture.h"
//各級(jí)菜單頁面結(jié)構(gòu)體聲明
Menu menu1_main[5];
Menu menu2_file[4];
Menu menu2_edit[4];
Menu menu2_view[4];
Menu menu2_set[3];
Menu menu3_test[2];
//結(jié)構(gòu)體初始化//菜單定義,在這里將每一個(gè)菜單的關(guān)聯(lián)設(shè)置好
Menu menu1_main[5] = // 第1級(jí) 主菜單
{
{5, "主菜單", "文件 >>", TYPE_SUBMENU, NULL, menu2_file, NULL},
{5, "", "編輯 >>", TYPE_SUBMENU, NULL, menu2_edit, NULL},
{5, "", "視圖 >>", TYPE_SUBMENU, NULL, menu2_view, NULL},
{5, "", "設(shè)置 >>", TYPE_SUBMENU, NULL, menu2_set, NULL},
{5, "", "幫助 --", TYPE_PARAM, NULL, NULL, NULL},
};
Menu menu2_file[4] = // 第2級(jí) 文件菜單
{
{4, "文件", "open ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "close ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "save ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "exit ", TYPE_SUBMENU, NULL, NULL, menu1_main},
};
Menu menu2_edit[4] = // 第2級(jí) 編輯菜單
{
{4, "編輯", "cut ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "copy ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "paste ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "delete ", TYPE_SUBMENU, NULL, NULL, menu1_main},
};
Menu menu2_view[4] = // 第2級(jí) 視圖菜單
{
// {4, "視圖", "open ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "視圖", "open ", TYPE_PARAM, NULL, NULL, menu1_main},
{4, "", "close ", TYPE_PARAM, NULL, NULL, menu1_main},
{4, "", "save ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{4, "", "ColorText ", TYPE_PARAM, NULL, NULL, menu1_main},
};
Menu menu2_set[3] = // 第2級(jí) 設(shè)置菜單
{
{3, "設(shè)置", "option ", TYPE_SUBMENU, NULL, NULL, menu1_main},
{3, "", "set ", NULL, NULL, NULL, menu1_main},
{3, "", "on/off test ", TYPE_SUBMENU, NULL, menu3_test, menu1_main},
// {3, "", "on/off test ", TYPE_SUBMENU, NULL, NULL, menu1_main},
};
Menu menu3_test[2] = // 第3級(jí)菜單,menu_tool子菜單
{
{2, "Text", "ON ", TYPE_PARAM, NULL, NULL, menu2_set},
{2, "", "OFF ", TYPE_PARAM, NULL, NULL, menu2_set},
};
//顏色測試函數(shù),作為菜單中一個(gè)子功能,移植時(shí)可以刪除
void Test_Color()
{
u16 ColorTab[8]= {WHITE,BRED,BROWN,YELLOW,BLUE,RED,GREEN,GRAY};//定義顏色數(shù)組
char *ColorText[] = {"WHITE","BRED","BROWN","YELLOW","BLUE","RED","GREEN","GRAY"};
//繪制顯示區(qū)域
LCD_Fill(0,40,lcddev.width,lcddev.height-40,BLACK);
for(u8 i=0;i<=7;i++)
{
LCD_Fill(90,250,390,550,ColorTab[i]);
Gui_StrCenter(0,220,(u8 *)ColorText[i],24,1);delay_ms(1000);
LCD_Fill(0,40,lcddev.width,lcddev.height-40,BLACK);
}
}
//各項(xiàng)功能函數(shù)
void Str_Test(const char *str)
{
POINT_COLOR = WHITE;
if(strstr((char *)str,"幫助"))
{
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
Gui_StrCenter(0,lcddev.height-32,"菜單測試程序",24,1);//居中顯示
}
if(strstr((char *)str,"ColorText"))
{
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
Gui_StrCenter(0,lcddev.height-32,"ColorText",24,1);//居中顯示
Test_Color();
}
if(strstr((char *)str,"ON"))
{
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
LED01_ON(); //實(shí)際功能函數(shù)
Gui_StrCenter(0,lcddev.height-32,"LED已打開",24,1);//居中顯示
}
if(strstr((char *)str,"OFF"))
{
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
LED01_OFF(); //實(shí)際功能函數(shù) LED0 LED1關(guān)閉
Gui_StrCenter(0,lcddev.height-32,"LED已關(guān)閉",24,1);//居中顯示
}
if(strstr((char *)str,"open"))
{
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
LED01_ON(); //實(shí)際功能函數(shù)
Gui_StrCenter(0,lcddev.height-32,"LED已打開",24,1);//居中顯示
}
if(strstr((char *)str,"close"))
{
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
LED01_OFF(); //實(shí)際功能函數(shù) LED0 LED1關(guān)閉
Gui_StrCenter(0,lcddev.height-32,"LED已關(guān)閉",24,1);//居中顯示
}
}
//設(shè)置相應(yīng)項(xiàng)按確定鍵后執(zhí)行的函數(shù)
//將上面的功能函數(shù) 賦值到各功能項(xiàng)
void SetDefaultMenuHandler(MENU_FUN pFun)
{
menu1_main[4].Function = pFun;
menu2_view[3].Function = pFun;
menu2_view[1].Function = pFun;
menu2_view[0].Function = pFun;
menu3_test[0].Function = pFun;
menu3_test[1].Function = pFun;
}
//定義菜單操作需要的全局變量
Menu *cur_item = menu1_main; //初始化當(dāng)前菜單為第一級(jí)(main_menu)
Menu *prev_item = NULL; //初始化上一級(jí)菜單為空
uint8_t item_index = 0;//當(dāng)前菜單項(xiàng)索引
//繪制測試界面
//str :字符串指針
void DrawTestPage(u8 *str)
{
//繪制固定欄up
LCD_Fill(0,0,lcddev.width,40,BLUE);
//繪制固定欄down
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
POINT_COLOR=WHITE;
Gui_StrCenter(0,9,str,24,1); //菜單頂部標(biāo)題 居中顯示
Gui_StrCenter(0,lcddev.height-32,"",24,1);//菜單底部 居中顯示
POINT_COLOR=RED;
LCD_ShowString(10,lcddev.height-32,100,30,24, "右鍵確定",0);
LCD_ShowString(374,lcddev.height-32,100,30,24, "左鍵取消",0);
//繪制顯示區(qū)域
LCD_Fill(0,40,lcddev.width,lcddev.height-40,BLACK);
}
void Thebeginningoftheinterface()
{
u8 lcd_id[]="20181106074";
// LCD_ShowString(40,40,200,24,24,"Explorer STM32F4",0);
LCD_ShowString(45,40,200,30,24,"武昌首義學(xué)院",0);
// LCD_ShowString(20,90,200,16,16,lcd_id,0);
LCD_ShowString(65,80,200,16,24,"2020/9/18",0);
POINT_COLOR=RED; //畫筆顏色:紅色
//LCD_ShowString(20,150,200,30,24,"武昌首義學(xué)院",0); //30,300,200,30,24
LCD_ShowString(20,120,200,30,24,"作者:熊明煒",0);
LCD_ShowString(20,150,200,30,24,"作者:楊志偉",0);
LCD_ShowString(20,180,200,30,24,"作者:舒 淦",0);
LCD_ShowString(20,230,100,30,24, "右鍵進(jìn)入",0);
image_display(310,168,(u8*)gImage_1);//在指定地址顯示圖片
//image_display(310,450,(u8*)gImage_2);//在指定地址顯示圖片
}
void DispCrtMenu(void)//繪制當(dāng)前菜單項(xiàng)
{
uint8_t menu_num = cur_item[0].num;//獲取當(dāng)前菜單的項(xiàng)目數(shù)量
uint8_t i, num = menu_num>MENU_MAX_ROW ? MENU_MAX_ROW : menu_num;//繪制數(shù)量不能超過每一屏的最大繪制數(shù)量
if(item_index>=MENU_MAX_ROW || item_index>=menu_num)//菜單項(xiàng)上下選擇是否越界
{
if(item_index==0XFF) //此情況為 item_index=0 再按上鍵,0-1=0XFF
{
item_index = menu_num - 1; //循環(huán),回到最后一個(gè)功能索引值
}
if(item_index>=menu_num) //此情況為到達(dá)最下面一個(gè)功能索引值
{
item_index = 0; //循環(huán),回到第一個(gè)功能索引值
}
if(item_index>=MENU_MAX_ROW)
{
item_index = 0;
}
}
DrawTestPage((u8 *)cur_item[0].title);
for (i=0; i<num; i++)//繪制某一級(jí)菜單下的功能鍵
{
POINT_COLOR = RED;
//Show_Str_1(0, (i+1)*40, (u8 *)cur_item[i].label, 32, i==item_index ? 0:1);//繪制單個(gè)菜單項(xiàng)
LCD_ShowString(144,150+(i+1)*40,200,30,24, (u8 *)cur_item[i].label,i==item_index ? 0:1);
}
}
#define KEY_ENTER_PRESS 3 //對(duì)應(yīng)原子開發(fā)板的左鍵
#define KEY_RETURN_PRESS 4 //對(duì)應(yīng)原子F4板的右鍵
void Display(uint8_t value)
{
if(value==KEY_UP_PRESS || value==KEY_DOWN_PRESS || value==KEY_ENTER_PRESS || value==KEY_RETURN_PRESS)
{
switch(value)//檢測按鍵,進(jìn)入相應(yīng)動(dòng)作
{
case KEY_UP_PRESS:
item_index--;
DispCrtMenu();
break;
case KEY_DOWN_PRESS:
item_index++;
DispCrtMenu();
break;
case KEY_ENTER_PRESS:
switch(cur_item[item_index].type)//檢測功能項(xiàng)的類型,進(jìn)入相應(yīng)動(dòng)作
{
case TYPE_SUBMENU: //具有子菜單的菜單項(xiàng)
if(cur_item[item_index].next != NULL)
{
prev_item = cur_item;//此級(jí)菜單變成了上一級(jí)菜單
cur_item = cur_item[item_index].next;//將指向的下一級(jí)菜單設(shè)置為當(dāng)前菜單
item_index = 0;//重置子菜單項(xiàng)索引
DispCrtMenu();
}
else
{
POINT_COLOR = WHITE;
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
Gui_StrCenter(0,lcddev.height-32,"待設(shè)置~~~",24,1);//居中顯示
PFout(9)=0;
delay_ms(1000);
PFout(9)=1;
}
break;
case TYPE_PARAM: //具有參數(shù)設(shè)置的菜單項(xiàng)
if(cur_item[item_index].Function != NULL)
{
//調(diào)用相應(yīng)的動(dòng)作函數(shù),并傳遞參數(shù)
cur_item[item_index].Function((const char *)cur_item[item_index].label);
}
else
{
POINT_COLOR = WHITE;
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
Gui_StrCenter(0,lcddev.height-32,"待設(shè)置~~~",24,1);//居中顯示
}
break;
default:
break;
}
break;
case KEY_RETURN_PRESS:
if (prev_item != NULL)//返回上一級(jí)菜單的操作
{
cur_item = prev_item; //設(shè)置上一級(jí)菜單為當(dāng)前菜單
prev_item = cur_item[0].prev; //設(shè)置當(dāng)前菜單的上一級(jí)菜單
item_index = 0; //重置子菜單項(xiàng)索引
DispCrtMenu();
}
else
{
POINT_COLOR = WHITE;
LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
Gui_StrCenter(0,lcddev.height-32,"已是主菜單",24,1);//居中顯示
}
break;
default:
break;
}
}
}
|
|