📄 menu.c
字号:
#include <string.h>
#include "System.h"
#include "Lcd.h"
#include "Menu.h"
#include "UART.h"
#include "USBCLOCK.h"
//#include "GPS.h"
#include "mmc.h"
#include "adda.h"
void GPS();
void Test()
{
Clear(0,240);
circle(100,100,50);
}
char Len(char *ptr) //求参数字符串长度
{
char n=0;
while(*ptr!=',')
{
n++;
ptr++;
}
return n;
}
char *Jump(char *ptr, char n) //跳过n项参数字符串
{
while(*ptr!='(' && *ptr!='\0' && n>0)
{
if(*ptr==',')
n--;
ptr++;
}
return ptr;
}
char GetValue(char *ptr) //返回ptr指向处ASCII码所对应的数字(char),失败返回0
{
char TempBuf[3]={0,0,0};
char n=0;
while (*ptr>=48 && *ptr<=57)
{
TempBuf[n]=*ptr-48;
ptr++;
n++;
}
if(n==0)
return (0);
if(n==1)
return (TempBuf[0]);
if(n==2)
return (TempBuf[0]*10+TempBuf[1]);
if(n==3)
return (TempBuf[0]*100+TempBuf[1]*10+TempBuf[0]);
}
char GetParaTotal(char *ptr) //检测某条目选项个数
{
char counter=0;
while(*ptr!='(' && *ptr!='\0')
{
if(*ptr==',') counter++;
ptr++;
}
return counter;
}
char *MyPrintf(unsigned char X,unsigned char Y,char *ptr,char Type) //显示某参数字符串
{
char temp[20];
char *p;
p=temp;
while(*ptr!=',')
{
*p=*ptr;
ptr++;
p++;
}
*p='\0';
if(Type)
Udprintf(X,Y,temp);
else
dprintf(X,Y,temp);
return ptr;
}
//主菜单函数
void MainMenu()
{
char code *Item[]={"01 串行接口传输实验","02 串行接口GPS接收机实验","03 并行接口传输实验",\
"04 并行接口驱动LED显示器实验","05 USB接口传输控制实验","06 USB接口读卡实验"};
void (*funp[])()={Uart,GPS,ADDA,Test,USBCLOCK,MMC};
int i;
char total=6;
char refresh=1;
char DisItem=1;
char ItemSel=0;
Init_LCD();
while(1)
{
if(DisItem==1) //显示界面
{
dprintf(13,2,"选择实验项目");
dprintf(0,20,line);
dprintf(0,200,line);
dprintf(1,220,"芗 兦");
dprintf(30,220,"说明 开始");
for(i=0;i<total;i++)
dprintf(2,i*16+36,Item[i]);
DisItem=0;
}
if(refresh==1) //移动小手
{
for(i=0;i<total;i++)
{
if(ItemSel==i)
dprintf(0,i*16+36,"贲");
else
dprintf(0,i*16+36," ");
}
refresh=0;
}
if(CheckKeyF==1) //键盘检测
{
CheckKey();
CheckKeyF=0;
}
if(Key[0].pressed==1) //检测到上键
{
Key[0].pressed=0;
if(ItemSel>0)
ItemSel--;
else
ItemSel=total-1;
refresh=1;
}
if(Key[1].pressed==1) //检测到下键
{
Key[1].pressed=0;
if(ItemSel<total-1)
ItemSel++;
else
ItemSel=0;
refresh=1;
}
if(Key[7].pressed==1) //检测到开始键,调用各模块函数
{
ClearKey();
(funp[ItemSel])();
DisItem=1;
refresh=1;
}
}
}
char MenuActive(char *Menu, unsigned char *ParaValueTable) //激活参数设置菜单
{
int i;
char *p;
char ParaTotal[10]; //各选项参数个数
char ItemSel=0; //当前选项
char ItemNum; //选项计数器
char ItemTotal; //总选项数
char ReFresh=1; //屏幕刷新标志位
char TempList[20]; //临时存放参数值
for(i=0;i<20;i++)
TempList[i]=ParaValueTable[i]; //copy
//显示分割线
dprintf(0,20,line);
dprintf(0,200,line);
//显示按钮
dprintf(1,220,"芗 兦 戛 戋 放弃 确定");
while(1)
{
if(ReFresh==1) //显示菜单
{
unsigned char X,Y;
Clear(36,200);
p=Menu;
p++;
X=GetValue(p);
p=Jump(p,1);
Y=GetValue(p);
p=strchr(p,')');
p++;
p=MyPrintf(X,Y,p,0);
ItemNum=0;
while(( p=strchr(p,'(') )!=NULL)
{
//Item
char TYPE=0;
p++;
X=GetValue(p);
p=Jump(p,1);
Y=GetValue(p);
p=strchr(p,')');
p++;
p=MyPrintf(X,Y,p,0);
p++;
ParaTotal[ItemNum]=GetParaTotal(p);
//Para
p=Jump(p,TempList[ItemNum]);
if(ItemSel==ItemNum)
{
TYPE=1;
//显示左箭头
if(TempList[ItemSel]!=0)
dprintf(X+18,Y,LeftArrow);
//显示右箭头
if(TempList[ItemSel]!=ParaTotal[ItemSel]-1)
dprintf(X+20+Len(p),Y,RightArrow);
}
p=MyPrintf(X+20,Y,p,TYPE);
ItemNum++;
}
ItemTotal=ItemNum;
ReFresh=0;
}
if(CheckKeyF==1) //键盘检测
{
CheckKey();
CheckKeyF=0;
}
if(Key[0].pressed==1) //检测到上键
{
Key[0].pressed=0;
if(ItemSel>0)
{
ItemSel--;
ReFresh=1;
}
}
if(Key[1].pressed==1) //检测到下键
{
Key[1].pressed=0;
if(ItemSel<(ItemTotal-1))
{
ItemSel++;
ReFresh=1;
}
}
if(Key[2].pressed==1) //检测到-键
{
Key[2].pressed=0;
if(TempList[ItemSel]>0)
{
TempList[ItemSel]--;
ReFresh=1;
}
}
if(Key[3].pressed==1) //检测到+键
{
Key[3].pressed=0;
if(TempList[ItemSel]<ParaTotal[ItemSel]-1)
{
TempList[ItemSel]++;
ReFresh=1;
}
}
if(Key[6].pressed==1) //检测到放弃键,不修改参数值
{
ClearKey();
Clear(0,240);
return 0;
}
if(Key[7].pressed==1) //检测到确定键,修改参数值
{
for(i=0;i<ItemTotal;i++)
ParaValueTable[i]=TempList[i];
ClearKey();
Clear(0,240);
return 1;
}
}//while
}
void Help(char * ptr) //文本分页显示函数,用于显示说明
{
int i;
char *p[5]; //支持最多5页显示
unsigned char currentp=0; //记录当前页
char temp=1;
for(i=1;i<5;i++) p[i]=&temp;
SFRPAGE=0x0F;
Clear(0,240);
p[0]=ptr;
p[1]=tprintf(0,0,p[0]);
dprintf(0,208,line);
dprintf(26,224,"确定");
if(*p[1]!='\0') dprintf(6,224,"兦"); //一页未显示完
while(1)
{
if(CheckKeyF==1) //键盘检测
{
CheckKey();
CheckKeyF=0;
}
if(Key[0].pressed==1) //检测到上键
{
if(currentp>0) //可以向上翻页
{
Clear(0,240);
currentp--;
tprintf(0,0,p[currentp]);
dprintf(0,208,line);
dprintf(26,224,"确定");
dprintf(6,224,DownArrow);
if(currentp==0)
dprintf(1,224," ");
else
dprintf(1,224,UpArrow);
}
Key[0].pressed=0;
}
if(Key[1].pressed==1) //检测到下键
{
if(*p[currentp+1]!='\0') //可以向下翻页
{
Clear(0,240);
currentp++;
p[currentp+1]=tprintf(0,0,p[currentp]);
dprintf(0,208,line);
dprintf(26,224,"确定");
dprintf(1,224,UpArrow);
if(p[currentp+1]==NULL)
dprintf(6,224," ");
else
dprintf(6,224,DownArrow);
}
Key[1].pressed=0;
}
if(Key[5].pressed==1)
{
ClearKey();
Clear(0,240);
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -