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

📄 menu.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
字号:
/***********************************
project: 凌阳SPCE61A单片机应用例程
item:菜单操作
version: V1.0

Description:

Author: 江苏大学电气信息工程学院

History:
     Date    Author
 08/15/2005  秦云
***********************************/
#include "spce061v004.h"
#include "main.h"
#include "string.h"

typedef struct{
int MenuPage;
int MenuPointer;
int MenuUP;
int MenuNo;
}MenuCtrl;
MenuCtrl MCtrl;

//=========================================================================================
//菜单操作
//响应按键输入,根据菜单状态执行操作
//=========================================================================================
void Menu(int key)
{
	switch(key)
	{
		case 0x000d:			//up
			MCtrl.MenuPointer=MCtrl.MenuPointer+0x0001;
			if(MCtrl.MenuPointer>MCtrl.MenuNo) MCtrl.MenuPointer=MCtrl.MenuPointer-1;
			if(MCtrl.MenuPointer>MCtrl.MenuUP+2)
			{
				MCtrl.MenuUP=MCtrl.MenuUP+2;
				if(MCtrl.MenuUP+5>MCtrl.MenuNo) MCtrl.MenuUP=MCtrl.MenuUP-2;
			}
			MenuDisp();
			break;
		case 0x000b:			//down
			MCtrl.MenuPointer=MCtrl.MenuPointer-0x0001;
			if(MCtrl.MenuPointer<1) MCtrl.MenuPointer=1;
			if(MCtrl.MenuPointer<MCtrl.MenuUP)
			{
				MCtrl.MenuUP=MCtrl.MenuUP-2;
				if(MCtrl.MenuUP<1) MCtrl.MenuUP=1;
			}
			MenuDisp();
			break;
		case 0x0007:			//ok
			switch(MCtrl.MenuPage)				
			{
				case 1:			//菜单页1
					switch(MCtrl.MenuPointer)
					{
						case 1:			//系统
							PositionPage();			//打开设置菜单
							break;
						case 2:			//启动
							CirclePage();//OpenMenu(2,1);				//进入运行窗口
							break;
						case 3:			//系统
							TrackPage();			//打开设置菜单
							break;
						case 4:			//系统
							FollowPage();			//打开设置菜单
							break;
					}
					break;
				case 2:			//菜单页2

			}
			break;
	}

}

//=========================================================================================
//显示菜单
//根据当前菜单页信息MCtrl,显示MCtrl.MenuUP开始的4个菜单项,
//每个菜单项首先读取文字首地址的指针,由该指针获得文字首地址,
//而后从该地址开始读取菜单项文字。组成液晶显示行输出。
//=========================================================================================

void MenuDisp()
{
	int i,line=0;
	unsigned int *HZTable;
	unsigned int j;
	
	for(i=MCtrl.MenuUP;i<MCtrl.MenuUP+6;i=i+2)
	{
		unsigned int HZCode[10]={0xa1a0,0xa1a0,0xa1a0,0xa1a0,0xa1a0,
								 0xa1a0,0xa1a0,0xa1a0,0xa1a0,0xa1a0};		//为液晶行复初值

		if(i<=MCtrl.MenuNo)
		{
			HZTable=ReadMenuCodeAddr(MCtrl.MenuPage)+i;			//读取"Ctrl.MenuPage"菜单页第i项菜单文字的首地址指针
			j=1;
			HZTable=*HZTable;						//菜单页文字的首地址
			while(*HZTable!=0)
			{
				HZCode[j]=*HZTable;					//读取文字
				HZTable++;
				j++;
			}
			
			if(i==MCtrl.MenuPointer)				//如果该项菜单是指针指向的当前项,则文字首位增加【】
			{
				HZCode[0]=0xa1bc;
				HZCode[j]=0xa1bd;
			}
			else
			{
				HZCode[0]=0xa1a0;
				HZCode[j]=0xa1a0;
			}
		}

		if(i<=MCtrl.MenuNo-1)
		{
			HZTable=ReadMenuCodeAddr(MCtrl.MenuPage)+i+1;			//读取"Ctrl.MenuPage"菜单页第i项菜单文字的首地址指针
			j=5;
			HZTable=*HZTable;						//菜单页文字的首地址
			while(*HZTable!=0)
			{
				HZCode[j]=*HZTable;					//读取文字
				HZTable++;
				j++;
			}
	
			if(i==MCtrl.MenuPointer-1)				//如果该项菜单是指针指向的当前项,则文字首位增加【】
			{
				HZCode[4]=0xa1bc;
				HZCode[j]=0xa1bd;
			}
			else
			{
				HZCode[7]=0xa1a0;
				HZCode[j]=0xa1a0;
			}
		}
		line++;
		LCDWriteLine(line,HZCode);
	}
}

//=========================================================================================
//打开菜单页
//=========================================================================================

void OpenMenu(int MenuNo,int Pointer)
{
	int* addr;

	MCtrl.MenuPage=MenuNo;				//本菜单页是几号菜单页
	addr=ReadMenuCodeAddr(MenuNo);
	MCtrl.MenuNo=*addr;					//本菜单页一共有多少菜单项
	MCtrl.MenuPointer=Pointer;			//当前菜单项
	MCtrl.MenuUP=1;						//菜单显示第一行

	MenuDisp();							//显示菜单
}

⌨️ 快捷键说明

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