⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 LCD12864
💻 C
字号:
#include "menu.h"
#include "key.h"
#include "utili.h"
#include "lcd.h"
#include "param.h"
#include "query.h"
#include "time.h"

#include "coulometry.h"
#include "objdetect.h"

//第一层菜单:
struct MENU_ITEM code MainMenu[] = {
	{1,"手动测试",32,2  ,NULL},//coulometry.c
	{2,"自动检测",32,22 ,NULL},//objdetect.c
	{3,"参数设定",32,42 ,NULL},//param.c
	{4,"数值查询",32,2  ,NULL},//query.c
	{5,"调整时间",32,22 ,NULL},//time.c
	{6,"仪器标定",32,42 ,NULL},//
	{0,NULL,0,0,NULL}
};


//菜单控制
uchar MenuItemCount;	//菜单项数, 在初始化一个菜单时计算出来
uchar MenuItemIndex;	//当前指向(是相对本页)
uchar MenuPageCount;	//菜单页数, 每页显示3项
uchar MenuCurPage;	//当前页面数. 
uchar MenuCurPageItemCount;//当前页有几个菜单项
int8  MenuSelectItem;

//指向当前菜单的指针
struct MENU_ITEM *PrevMenu,*PMenu;

void onMenuKeyDown(uchar key);

void MenuInit()
{
	MenuItemCount = 0;
	MenuItemIndex = 0;
	MenuPageCount = 0;
	MenuCurPage = 0;
	MenuCurPageItemCount = 0;
	MenuSelectItem = -1;
	
	PMenu = NULL;
	PrevMenu = NULL;
}

//反选一个菜单项
void FocusMenuItem(struct MENU_ITEM *item)
{
	uchar len;
	uchar x,w;
	
	//项目名字长度
	len = strlen(item->name);
	
	//控制最小边界
	if( item->x < 8) 
		x = 0;
	else
		x = item->x -8;
	//控制最大边界
	if( len + 2 > 16)
		w = 16;
	else 
		w = len + 2;
	//反选一个区域		
	LCD_ReverseRect(x,item->y-1,w,18);
}

//初始化菜单
void InitMenuItem()
{
	MenuItemCount = 0;
	MenuItemIndex = 0;
	MenuPageCount = 0;
	MenuCurPage = 0;
	MenuCurPageItemCount = 0;
	
	if( PMenu == NULL)
		return;
		
	//计算有几个菜单项
	while( PMenu[MenuItemCount++].id != 0);

	if( MenuItemCount > 0) MenuItemCount --; //去掉最后一行才正确

	//计算一下需要多少页
	MenuPageCount = MenuItemCount / PAGE_ITEM_COUNT;
	
	if( MenuPageCount * PAGE_ITEM_COUNT < MenuItemCount) 
		MenuPageCount ++;
	
	RefreshMenu(); //刷新菜单
	
}
//重新加载菜单
void RefreshMenu()
{
	uchar index;
	uchar count;
	
	
	if( PMenu == NULL) 
		return;
	
	LCD_Cls();
	
	MenuCurPageItemCount = 0;
	
	index = MenuCurPage * PAGE_ITEM_COUNT;	//页面起始项的索引号
	
	count = 0;
	while( PMenu[index].id != 0 && count < PAGE_ITEM_COUNT)
	{
		LCD_PrintHz16(PMenu[index].x,PMenu[index].y,PMenu[index].name);
		MenuCurPageItemCount ++;
		index++;
		count ++;
	}
	
	if( MenuCurPage < (MenuPageCount - 1))
	{
		//如果还有下一页则显示">>"
		LCD_PrintHz12(112,52,">>");
	}
	
	if( MenuCurPage > 0)
	{
		//如果不是第一页则显示"<<"
		LCD_PrintHz12(0,52,"<<");
	}
	else	//没有 << 是为退出菜单
	{
		//
		if( PMenu != MainMenu)	//主菜单就没有退出了
		{
			LCD_PrintHz12(0,52,"<-");
		}
	}
	
	MenuItemIndex = 0;
	
	//反选第一项
	FocusMenuItem(&PMenu[MenuCurPage * PAGE_ITEM_COUNT]);

	//LCD_PrintWord(0,0,MenuCurPage,0,0);
}

//选择页面
void SelectMenuPage(bool dir)
{
	if( dir )	//下一页
	{
		if( MenuCurPage < (MenuPageCount - 1)) 
		{	
			MenuCurPage ++;
			RefreshMenu();
		}
	}
	else
	{
		if( MenuCurPage > 0) 
		{	
			MenuCurPage --;
			RefreshMenu();
		}
		else
		{
			if( PMenu != MainMenu)
			{
				ReturnMainMenu();
			}
		}
	}
}
void MoveMenuItem(bool dir)
{
	uchar FirstItemIndex;
	
	if( PMenu == NULL) 
		return;
		
	//这是当前页面首个菜单项的索引号
	FirstItemIndex = MenuCurPage * PAGE_ITEM_COUNT;
	
	//取消原来选择的菜单项
	FocusMenuItem(&PMenu[FirstItemIndex + MenuItemIndex]);
	
	//改变到下一项
	if( dir )
		MenuItemIndex = (MenuItemIndex + 1 ) % MenuCurPageItemCount;
	else
	{
		if( MenuItemIndex == 0)
			MenuItemIndex = MenuCurPageItemCount-1;
		else
			MenuItemIndex = (MenuItemIndex - 1 ) % MenuCurPageItemCount;
	}

	//选择当前项
	FocusMenuItem(&PMenu[FirstItemIndex + MenuItemIndex]);
}
void SelectMenuItem()
{
	if( PMenu == NULL)
		return;
		
	//这是当前页面首个菜单项的索引号
	MenuSelectItem = MenuCurPage * PAGE_ITEM_COUNT + MenuItemIndex;
}

void SetMenu(struct MENU_ITEM *p)
{
	//if( p == PMenu)
	//	return;
		
	PrevMenu = PMenu;	//保存一下上一层的菜单
	
	PMenu = p;

	InitMenuItem();

	onKeyUp = onMenuKeyDown;
}
void ReturnBackMenu()	//只能返回到前一层菜单
{
	if( PrevMenu == NULL)
		return;
	PMenu = PrevMenu;

	PrevMenu = NULL;	
	InitMenuItem();
	
	//重置键盘映射
	onKeyUp = onMenuKeyDown;
}

//这个是反回主菜单
void ReturnMainMenu()
{
	SetMenu(MainMenu);

	//把按键事件设置为菜单按键事件处理函数
	//onKeyUp = onMenuKeyDown;
}

//处理菜单键盘事件
void onMenuKeyDown(uchar key)
{
	switch(key)
	{
	case KEY_UP:
		MoveMenuItem(false); //选择上一项
		break;
	case KEY_DOWN:
		MoveMenuItem(true);   //选择下一项
		break;
	case KEY_LEFT:
		SelectMenuPage(false);//向前一页
		break;
	case KEY_RIGHT:
		SelectMenuPage(true); //向后一页
		break;
	case KEY_ENTER:
		SelectMenuItem();
		break;
	}
	
} 
//处理菜单命令
void MenuEvent()
{
	if( MenuSelectItem != -1 && PMenu != NULL)
	{		
		if(PMenu[MenuSelectItem].func != NULL)
		{
			PMenu[MenuSelectItem].func(PMenu[MenuSelectItem].id);
		}
		else
		{
			LCD_PrintHz16(24,24,"欢迎使用!");
		}
	}
		
	MenuSelectItem = -1;	
	
}


//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -