在线时间98 小时
UID21701
注册时间2007-5-3
NXP金币56
TA的每日心情 | 开心 2022-5-13 12:47 |
---|
签到天数: 95 天 连续签到: 1 天 [LV.6]常住居民II
金牌会员
 
- 积分
- 1533
- 最后登录
- 2022-8-15
|

楼主 |
发表于 2016-10-18 12:54:09
|
显示全部楼层
本帖最后由 cos12a-21701 于 2016-10-18 12:55 编辑
这么久了也就发了几张图片,可能大家还以为我在忽悠呢,其实我一直在努力。那就先将我的菜单的数据结构和调用函数先放上来大家可以先理解一下。
我觉得最好是回想一下链表,不是有专家说:程序绝大多数问题的解决方法都可以用链表来达到吗?
直接粘贴代码吧:
说明一下:此代码是在其它开源程序基础上改编而成,数据结构等未作更新,仅用作学习之用,不可用于商业用途。
如有侵权,请通知我。
/**
****************** (C) ^^^^^^^^^^^^^^^^^^^^^^^^******************
* @file menu.h
* @author cos12a@163.com
* @version V1.0.0
* @date 10/10/2016
* @brief This file contains all the functions prototypes for the
* menu navigation firmware driver.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MENU_H
#define __MENU_H
/* Includes ------------------------------------------------------------------*/
#include "key.h"
/* Private types ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
typedef void (* tMenuFunc)(void);
typedef const struct sMenuItem * tMenuItem;
typedef const struct sMenu * tMenu;
struct sMenuItem
{
uint8_t* pszTitle;
tMenuFunc pfMenuFunc;
tMenuFunc pfUpDownMenuFunc;
tMenu psSubMenu;
};
struct sMenu
{
uint8_t* pszTitle;
tMenuItem psItems;
uint8_t nItems;
};
/* Private constants --------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
#define MAX_DISPLAY_ITEMS 3
#define MAX_MENU_LEVELS 4
/* Module private variables --------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
/* Private functions ---------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void IdleFunc_bak(void);
void ReturnFunc(void);
void IdleFunc(void);
void DisplayMenu(void);
void Menu_Init(void);
void ShowMenuIcons(void);
void UpFunc(void);
void DownFunc(void);
void SelFunc(void);
#endif /* __MENU_H */
/******************* (C) COPYRIGHT 2016 *****END OF FILE****/
/**
****************** (C) ^^^^^^^^^^^^^^^^^^^^^^^^******************
* @file menu.h
* @author cos12a@163.com
* @version V1.0.0
* @date 10/10/2016
* @brief This file contains all the functions prototypes for the
* menu navigation firmware driver.
******************************************************************************
* @attention
*
*
******************************************************************************
*/
#include "includes.h"
#include "menu.h"
#include "menu_table.c"
/* Module private variables --------------------------------------------------*/
static uint8_t MenuItemIndex = 0, nMenuLevel = 0;
static uint8_t ItemNumb[MAX_MENU_LEVELS];
static tMenuItem psMenuItem, psCurrentMenuItem;
static tMenu psPrevMenu[MAX_MENU_LEVELS];
static tMenu psCurrentMenu;
static uint8_t display_con = 0;
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void DisplayMenuItems(void);
/**
* @brief Initializes the navigation menu.
* @param None
* @retval None
*/
void Menu_Init(void)
{
psCurrentMenu = &MainMenu;
psPrevMenu[nMenuLevel] = psCurrentMenu;
psMenuItem = MainMenuItems;
/* Initializes the Menu state machine */
MenuItemIndex = 0;
display_con = 0;
nMenuLevel = 0;
}
/**
* @brief Displays the current menu Title.
* @param None
* @retval None
*/
void DisplayMenuTitle(void)
{
clear_all(); /* 清屏 */
Display_LCD_String(0, psCurrentMenu->pszTitle, 1); /* 显示菜单标题 */
}
/**
* @brief Displays the current menu.
* @param None
* @retval None
*/
void DisplayMenu(void)
{
DisplayMenuTitle();
DisplayMenuItems();
}
/**
* @brief Displays the current menu.
* @param None
* @retval None
*/
void DisplayMenuItems(void)
{
uint32_t Line = 0, index = 0;
tMenuItem psMenuItem2;
// clear_all(); /* 清屏 */
Write_LCD_Command(0x90);
for(Line=0;Line<16;Line++) //清除第二行
{
Write_LCD_Data(0x20);
}
Write_LCD_Command(0x88);
for(Line=0;Line<16;Line++) //清除第三行
{
Write_LCD_Data(0x20);
}
Write_LCD_Command(0x98);
for(Line=0;Line<16;Line++) //清除第四行
{
Write_LCD_Data(0x20);
}
con_disp((display_con+1),0); /* 清除前一个反白项目 */
display_con = MenuItemIndex%3;
con_disp((display_con+1), 1); /* 将当前菜单项目反白 */
index = MenuItemIndex-display_con;
for(Line = 1; Line < 4; Line ++){
psMenuItem2 = &(psCurrentMenu->psItems[index]);
Display_LCD_String(Line, psMenuItem2->pszTitle, 1);
if(++index >= (psCurrentMenu->nItems)) break;
}
// }
/* Get the current menu */
psMenuItem = &(psCurrentMenu->psItems[MenuItemIndex]);
// con_disp((display_con+1), 1); /* 将当前菜单项目反白 */
}
/**
* @brief Idle function.
* @param None
* @retval None
*/
void IdleFunc(void)
{
/* Nothing to execute: return */
return;
}
/**
* @brief Idle function.
* @param None
* @retval None
*/
void IdleFunc_bak(void)
{
/* Nothing to execute: return */
return;
}
/**
* @brief This function is executed when any of "UP" push-butttons is pressed.
* @param None
* @retval None
*/
void UpFunc(void)
{
uint8_t con_temp = 0;
psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
con_disp(display_con+1,0);
display_con = MenuItemIndex%3;
if(MenuItemIndex > 0)
{
MenuItemIndex--;
}
else
{
MenuItemIndex = psCurrentMenu->nItems - 1;
}
if((display_con == 0)&&( psCurrentMenu->nItems > MAX_DISPLAY_ITEMS)){
DisplayMenuItems();
}else{
display_con = MenuItemIndex%3;
psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
con_disp(display_con+1,1); /* 反选当前菜单项目 */
}
ItemNumb[nMenuLevel] = MenuItemIndex;
}
/**
* @brief This function is executed when any of "DOWN" push-butttons is pressed.
* @param None
* @retval None
*/
void DownFunc(void)
{
uint8_t con_temp = 0;
psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
con_disp((display_con+1),0); /* 清除上一个菜单项目的返选 */
/* Test on the MenuItemIndex value before incrementing it */
if(MenuItemIndex >= ((psCurrentMenu->nItems)-1))
{
MenuItemIndex = 0;
}
else
{
MenuItemIndex++;
}
display_con = MenuItemIndex%3;
if((display_con == 0)&&( psCurrentMenu->nItems > MAX_DISPLAY_ITEMS)){
DisplayMenuItems();
}else{
psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
con_disp((display_con+1),1); /* 反选当前菜单项目 */
}
ItemNumb[nMenuLevel] = MenuItemIndex; /* 保存当前项目索引 */
}
/**
* @brief This function is executed when "SEL" push-button is pressed.
* @param None
* @retval None
*/
void SelFunc(void)
{
psCurrentMenuItem = psMenuItem; /* 将原菜单项目提升为当前菜单 */
if(psMenuItem->psSubMenu != '\0') /* 是否还有子菜单,则进入下一个子菜单 */
{
/* Update the current Item by the submenu */
MenuItemIndex = 0; /* 索引号从0开始 */
psCurrentMenu = psMenuItem->psSubMenu; /* 传递,当前菜单的子项目 */
/* 传递,子项目内所对应下一次菜单项目 */
psMenuItem = &(psCurrentMenu->psItems)[MenuItemIndex];
DisplayMenuTitle(); /* 显示菜单标题 */
DisplayMenuItems(); /* 显示子菜单项目 */
nMenuLevel++; /* 菜单层数,加一层 */
psPrevMenu[nMenuLevel] = psCurrentMenu; /* 暂存当前层的菜单项目 */
/* 如果进入下一层菜单则退出,不执行函数 */
} else{ /* 如果没有子菜单则执行函数 */
psCurrentMenuItem->pfMenuFunc();
}
}
/**
* @brief This function is executed when the "RETURN" menu is selected.
* @param None
* @retval None
*/
/* 返回上一个菜单 */
void ReturnFunc(void)
{
psMenuItem->pfUpDownMenuFunc(); /* 执行UpDown对应函数 */
if(nMenuLevel == 0) /* 层数不能变为零 */
{
nMenuLevel++;
}
/* 读取保存的上一个菜单项目 */
psCurrentMenu = psPrevMenu[nMenuLevel-1];
/* 获取菜单子项目 */
psMenuItem = &psCurrentMenu->psItems[0];
ItemNumb[nMenuLevel] = 0; /* 将返回前的菜单索引项目缓存清零 */
MenuItemIndex = 0; /* 将返回前的菜单索引清零 */
nMenuLevel--; /* 菜单层数减少一层 */
MenuItemIndex = ItemNumb[nMenuLevel]; /* 获得上一次记录的索引号 */
DisplayMenuTitle();
DisplayMenuItems(); /* 显示子菜单项目 */
}
|
|