久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3297|回復: 0
收起左側

基于STM32LCD多級菜單顯示

[復制鏈接]
ID:825317 發表于 2020-10-2 19:14 | 顯示全部樓層 |閱讀模式
主函數程序如下:
#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);//設置系統中斷優先級分組2
        delay_init(168);      //初始化延時函數
        uart_init(115200);                //初始化串口波特率為115200
        usart2_init(115200);
        TIMER2_Init();
        LED_Init();                          //初始化LED
        KEY_Init();
        LCD_Init();           //初始化LCD FSMC接口
       
        POINT_COLOR=RED;      //畫筆顏色:紅色
        SetDefaultMenuHandler(Str_Test);//設置功能函數
        while(1)
        {
           Thebeginningoftheinterface();
                if(KEY_UP==0)
                        break;
        }
        delay_ms(200);
        DispCrtMenu();        //將主菜單頁面先顯示,去掉此句進入為黑屏          
       
          while(1)
        {                 
                main_time = Get_RunTime();  //獲取系統時間
                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"
//各級菜單頁面結構體聲明  
Menu menu1_main[5];
Menu menu2_file[4];
Menu menu2_edit[4];
Menu menu2_view[4];
Menu menu2_set[3];
Menu menu3_test[2];  

//結構體初始化//菜單定義,在這里將每一個菜單的關聯設置好
Menu menu1_main[5] = // 第1級 主菜單
{
        {5, "主菜單", "文件          >>", TYPE_SUBMENU, NULL, menu2_file, NULL},
        {5, "", "編輯          >>", TYPE_SUBMENU, NULL, menu2_edit, NULL},
        {5, "", "視圖          >>", TYPE_SUBMENU, NULL, menu2_view, NULL},
        {5, "", "設置          >>", TYPE_SUBMENU, NULL, menu2_set, NULL},
        {5, "", "幫助          --", TYPE_PARAM, NULL, NULL, NULL},
};

Menu menu2_file[4] =  // 第2級 文件菜單
{
        {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級 編輯菜單
{
        {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級 視圖菜單
{
//        {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級 設置菜單
{
        {3, "設置", "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級菜單,menu_tool子菜單
{
        {2, "Text", "ON              ", TYPE_PARAM, NULL, NULL, menu2_set},
        {2, "",     "OFF             ", TYPE_PARAM, NULL, NULL, menu2_set},
};

//顏色測試函數,作為菜單中一個子功能,移植時可以刪除
void Test_Color()
{
        u16 ColorTab[8]= {WHITE,BRED,BROWN,YELLOW,BLUE,RED,GREEN,GRAY};//定義顏色數組
        char *ColorText[] = {"WHITE","BRED","BROWN","YELLOW","BLUE","RED","GREEN","GRAY"};
        //繪制顯示區域
        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);
        }
}
//各項功能函數
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();  //實際功能函數
                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(); //實際功能函數 LED0 LED1關閉
                Gui_StrCenter(0,lcddev.height-32,"LED已關閉",24,1);//居中顯示
        }
        if(strstr((char *)str,"open"))
        {
                LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
                LED01_ON();  //實際功能函數
                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(); //實際功能函數 LED0 LED1關閉
                Gui_StrCenter(0,lcddev.height-32,"LED已關閉",24,1);//居中顯示
        }
}

//設置相應項按確定鍵后執行的函數
//將上面的功能函數 賦值到各功能項
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;  //初始化當前菜單為第一級(main_menu)
Menu *prev_item = NULL;            //初始化上一級菜單為空
uint8_t item_index = 0;//當前菜單項索引

//繪制測試界面
//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);  //菜單頂部標題 居中顯示
        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);
        //繪制顯示區域
        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,"武昌首義學院",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,"武昌首義學院",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, "右鍵進入",0);
        image_display(310,168,(u8*)gImage_1);//在指定地址顯示圖片
        //image_display(310,450,(u8*)gImage_2);//在指定地址顯示圖片
}
void DispCrtMenu(void)//繪制當前菜單項
{
        uint8_t menu_num = cur_item[0].num;//獲取當前菜單的項目數量
        uint8_t i, num = menu_num>MENU_MAX_ROW ? MENU_MAX_ROW : menu_num;//繪制數量不能超過每一屏的最大繪制數量
        if(item_index>=MENU_MAX_ROW || item_index>=menu_num)//菜單項上下選擇是否越界
        {
                if(item_index==0XFF)  //此情況為 item_index=0 再按上鍵,0-1=0XFF
                {
                        item_index = menu_num - 1;   //循環,回到最后一個功能索引值
                }
                if(item_index>=menu_num)  //此情況為到達最下面一個功能索引值
                {
                        item_index = 0;  //循環,回到第一個功能索引值
                }
                if(item_index>=MENU_MAX_ROW)
                {
                        item_index = 0;
                }
        }
        DrawTestPage((u8 *)cur_item[0].title);
       
        for (i=0; i<num; i++)//繪制某一級菜單下的功能鍵
        {
                POINT_COLOR = RED;
                //Show_Str_1(0, (i+1)*40, (u8 *)cur_item[i].label, 32, i==item_index ? 0:1);//繪制單個菜單項
                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 //對應原子開發板的左鍵
#define KEY_RETURN_PRESS 4 //對應原子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)//檢測按鍵,進入相應動作
                {
                        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)//檢測功能項的類型,進入相應動作
                                {
                                        case TYPE_SUBMENU: //具有子菜單的菜單項
                                                if(cur_item[item_index].next != NULL)
                                                {
                                                        prev_item = cur_item;//此級菜單變成了上一級菜單
                                                        cur_item = cur_item[item_index].next;//將指向的下一級菜單設置為當前菜單
                                                        item_index = 0;//重置子菜單項索引
                                                        DispCrtMenu();
                                                }
                                                else
                                                {
                                                        POINT_COLOR = WHITE;
                                                        LCD_Fill(0,lcddev.height-40,lcddev.width,lcddev.height,BLUE);
                                                        Gui_StrCenter(0,lcddev.height-32,"待設置~~~",24,1);//居中顯示
                                                        PFout(9)=0;
                                                        delay_ms(1000);
                                                        PFout(9)=1;
                                                }
                                                break;
                                        case TYPE_PARAM:  //具有參數設置的菜單項
                                                if(cur_item[item_index].Function != NULL)
                                                {
                                                        //調用相應的動作函數,并傳遞參數
                                                        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,"待設置~~~",24,1);//居中顯示
                                                }
                                                break;
                                        default:
                                                break;
                                }
                                break;
                        case KEY_RETURN_PRESS:
                                if (prev_item != NULL)//返回上一級菜單的操作
                                {
                                        cur_item = prev_item;  //設置上一級菜單為當前菜單
                                        prev_item = cur_item[0].prev;  //設置當前菜單的上一級菜單
                                        item_index = 0;  //重置子菜單項索引
                                        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;
                }
        }
}









回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美久久免费观看 | 美女高潮网站 | 夜夜爽99久久国产综合精品女不卡 | 免费久久久久久 | 久草视频在线播放 | 黄色成人国产 | 国产精品视频一区二区三区, | 国产91色在线 | 亚洲 | 亚洲一区二区三区免费在线观看 | 欧美成ee人免费视频 | 操视频网站 | 成人在线精品视频 | 欧美成视频 | 精品日韩一区二区三区av动图 | 一区二区三区在线播放 | 国产一区久久 | 欧美日韩国产中文字幕 | 国产成人精品久久 | 国产精品特级毛片一区二区三区 | 欧美激情精品久久久久久变态 | 中文字幕日韩一区 | 一区二区三区亚洲 | 亚洲欧美日韩精品久久亚洲区 | 不卡视频一区二区三区 | 久久国产精品-久久精品 | 久久久精 | 亚洲综合无码一区二区 | 很很干很很日 | 日韩精品一区二区三区中文在线 | 久久久久久色 | 久久国产日韩 | 自拍偷拍亚洲视频 | 日韩高清www | 91精品国产91久久久久久丝袜 | 一级黄色片一级黄色片 | 精品91久久久 | 九九综合| 青青草视频免费观看 | a级大毛片| 色综合久久久久 | 精品国产一区二区三区久久久蜜月 |