📄 menu.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 + -