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

📄 menu.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 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 + -