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

📄 menu.c.bak

📁 一个以前开发的实际应用的交通灯控制器程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#include "iic.h"

///////////菜单管理体系/////////////////////////////////////////////////////
char* GetSubMenuHead(unsigned int id)
{//查找该菜单下子菜单的头指针
//输入:菜单ID
//返回:菜单的下一级子菜单的指针,否则返回SNULL
	unsigned char *t;
	unsigned char xdata i;

	switch(id)
	{
		case 0x0000:
			if(!DeskTopFlag)//
				t=DeskMenuData;//桌面
			else
			{
				ShowDesk();
				t=SNULL;
			}
			break;
		case 0x0001://
		case 0x0002:
			t=ShiDuanMenuData;//时段:2
			break;
		case 0x0011:case 0x0021:case 0x0031:case 0x0041:case 0x0051:case 0x0061:
		case 0x0071:case 0x0081:case 0x0091:case 0x00a1:case 0x00b1:case 0x00c1:
		case 0x0012:case 0x0022:case 0x0032:case 0x0042:case 0x0052:case 0x0062:
		case 0x0072:case 0x0082:case 0x0092:case 0x00a2:case 0x00b2:case 0x00c2:
			t=XiangZuMenuData;//相组:2*12
			break;
		case 0x00d1:
		case 0x00d2:
			t=XiangZuMenuData2;//相组2:2
			break;
		//case **://相位
		//	break;//太多了,另行处理
		case 0x0003://
			t=XitongMenuData;//系统
			break;
		case 0x0004:
			t=ShouDongMenuData;//手动
			break;
		case 0x0005:
			t=LvSeMenuData;//绿色
			break;
		default:
			MenuItemCnt=0;//没有子项
			t=SNULL;//已经到达叶子菜单
	}
	
	if((t==SNULL)&&(id!=0))
	{//特殊的处理:相位
		if(((id & 0x000f)<=0x0002)&&((id & 0x000f)>=0x0001))
		{	
			if(((id&0x00f0)<=0x00c0)&&((id & 0x00f0)>=0x0010))
			{
				if(((id&0x0f00)<=0x0800)&&((id & 0x0f00)>=0x0100))
					t=XiangWeiMenuData;
			}
		}
	}
	
	if(t==SNULL)
	{
		MenuItemCnt=0;
		return;		
	}
	
	//生成子项数目
	i=0;
	MenuItemCnt=1;
	while(*(t+i)!=NULL)
	{
		if(*(t+i)=='\n')
			MenuItemCnt+=1;
		i++;
	}
	return t;
}

void ShowMenu()
{
	//默认显示MenuID子菜单的内容
	unsigned char *Head;
	unsigned char xdata i,k;
	unsigned char xdata ch1,ch2;
//	WriteCmd(0x02);//地址归位
	LcdInit();
	
	Head=GetSubMenuHead(MenuID);
	if(Head==SNULL)//叶子
		return;
	if(MenuPos>=MenuItemCnt)
		MenuPos=0;
	
	i=0;
	k=0;
	while(k<MenuPos)
	{//寻找到开始的菜单
		if(*(Head+i)==NULL)
			break;//不可能出现?

		if((*(Head+i) == '\n'))//&&(*(Head+i)!=NULL))
		{
			i+=1;
			k++;
			continue;
		}
		else
		{
			i+=2;
		}
	}
	Head=Head+i;//第一个显示的菜单
	i=0;//行
//	i=0;
	k=0;//列
	while(i<4)
	{
		k++;
		ch1=*Head;
		ch2=*(Head+1);
		Head+=2;
		LcdCN(i,k,ch1,ch2);
		if(*Head == NULL)
		{
			i+=1;
			break;//跳出
		}
		else if(*Head == '\n')
		{//换行
			i+=1;//
			k=0;
			Head+=1;
		}
	}

	while(i<4)//清空其它 
	{
		for(k=1;k<8;k++)
			LcdCN(i,k,0xa1,0xa0);
		i++;
	}

	if(ChosenPos!=NOCHOICE)
	{
		LcdChar(0,0,0x20);
		LcdChar(1,0,0x20);
		LcdChar(2,0,0x20);
		LcdChar(3,0,0x20);
		LcdChar(ChosenPos,0,CHOSEN_CH);
	}

}

void OnArrowUp()
{
	//只移动标记即可
	if(ChosenPos==NOCHOICE)
		return;
	
	if(ChosenPos==0)
	{
		if(MenuPos>0)
			MenuPos-=1;
		ShowMenu();
		return;
	}
	else
	{
		LcdChar(ChosenPos,0,0x20);
		ChosenPos-=1;
		LcdChar(ChosenPos,0,CHOSEN_CH);
		return;
	}
}

void OnArrowDown()
{
	//只移动标记即可
	if(ChosenPos==NOCHOICE)
		return;
	
	if(ChosenPos==3)
	{
		if((MenuPos<MenuItemCnt-4)&&(MenuItemCnt>4))
			MenuPos+=1;
		ShowMenu();
		return;
	}
	else
	{
		LcdChar(ChosenPos,0,0x20);
		ChosenPos+=1;
		LcdChar(ChosenPos,0,CHOSEN_CH);
		return;
	}
}

void OnCancel()
{
	//确定父菜单
	if(MenuID & 0xf000)
		MenuID &= 0x0fff;
	else if(MenuID & 0x0f00)
		MenuID &= 0x00ff;
	else if(MenuID & 0x00f0)
		MenuID &= 0x000f;
	else
		MenuID = 0x0000;//

	MenuPos=0;
	ChosenPos=0;//kf
	ShowMenu();
}

void OnEnter()
{
	unsigned char *Head;
	unsigned int xdata t;
	unsigned char xdata i;
	//产生新的ID
	t=0x000f;
	for(i=0;i<3;i++)
	{
		if((MenuID&t)==0)
		{
			t=(unsigned int)(MenuPos+ChosenPos+1);
			if(t<=MenuItemCnt)//不能产生没有的ID
				MenuID+=t;
			break;
		}
		t<<=4;
	}
	//非叶子菜单显示新的菜单
	Head=GetSubMenuHead(MenuID);
	if(Head!=SNULL)
	{
		MenuPos=0;
		ChosenPos=0;
		ShowMenu();
	}
	else
		SwitchMenuEntry();//跳转的处理入口
}

void OnMenuKey()
{
	unsigned char xdata i;
	if(PswLock)//锁定要求输入密码
	{
		LcdInit();
		LcdCnString(1,1,"输入密码");
		GetPassword(2,2);//返回值在AppBuf[]中
		i=EPR_Read(ADDR_PASSWORD);
		if(AppBuf[0]==i)
		{
			i=EPR_Read(ADDR_PASSWORD-1);
			if(i==AppBuf[1])
			{
				PswLock=0;
				MenuID=0x0000;
				MenuPos=0;
				ChosenPos=0;
				DeskTopFlag=0;//
				ShowMenu();
			}
			else
			{
				PswLock=1;//密码不正确
				DeskTopFlag=1;
				ShowDesk();
			}
		}	
	}
}

void SwitchMenuEntry()
{
//输入:MenuID
	//平时设置,节日设置
	unsigned char xdata k;
	if(MenuID&0x000f<=0x0002)
 	{//1
		if((MenuID&0x00f0)<=0x00c0)
		{//2:时段
			if((MenuID&0x0f00)<=0x0800)
			{//3:
				switch(MenuID&0xf000)
				{
					case 0x1000:
						ClrPhase();//k
						return;
					case 0x2000:
						SetCheDao();//k
						return;
					case 0x3000:
						SetAttribTime();//k
						return;
					default:
						;
				}
			}
			else if((MenuID&0x0f00)==0x0900)//复制时段
			{
				CopyPhaseGroup();//k
				return;
			}
		}
	}
	
	//其他设置
	if((MenuID&0x000f)==0x0003)
	{//系统设置
		switch(MenuID)
		{
			case 0x0013://日期设置
				SetSysDate();
				break;
			case 0x0023://时间设置
				SetSytTime();
				break;
			case 0x0033://允许节日
				k=EPR_Read(ADDR_HOLIDAY_PERMIT);
				k=GetBoolKey(ChosenPos,5,k);
				EPR_Page_0();
				EPR_Write(ADDR_HOLIDAY_PERMIT,k);
				EPR_Page_1();
				break;
			case 0x0043://修改节日
				ModifyHoliday();
				break;
			case 0x0053://恢复默认
				EPR_Reset();
				break;
			case 0x0053://立即上锁
				//EPR_Reset();
				break;
			case 0x0063://修改密码
				break;
			default;
				;//MenuID=0;
		}
	}
	else if((MenuID&0x00f0)==0x0040)
	{//手动设置
		switch(MenuID)
		{
			case 0x0014://单步运行
				StepSwitch();
				break;
			case 0x0024://退出手动
				MeterSta=MSTA_AUTO;
				break;
			default:
				;//	
		}
		Oncancel();
	}
	else if((MenuID&0x00f0)==0x0050)
	{//绿色通道
		GreenWayCtrl();		
	}
	Oncancel();
}
///////////////////////////////////////////////////////
//具体的按键处理
void ClrPhase()
{//清除相位
//输入:MenuID
	unsigned int xdata t,t1;
	if((MenuID&0x000f)==0x0001)
		t1=ADDR_GENARAL_SCH;
	else if((MenuID&0x000f)==0x0002)
		t1=ADDR_HOLIDAY_SCH;
	else
		return;
	t=MenuID&0x00f0;
	t>>=4;
	t-=1;
	t1=t1+t*PHASE_GROUP_LEN;
	
	t=MenuID&0x0f00;
	t>>=8;
	t-=1;
	t1=t1+t*PHASE_LEN;
	
	for(t=t1;t<t1+PHASE_LEN;t++)
	{
		EPR_Write(t,0xff);
	}
}

void SetCheDao()
{
//输入:MenuID,返回:无
//显示当前
	unsigned char xdata kv,lie,hang;
	unsigned int xdata t,t1,t2,t3;
	LcdInit();
	if((MenuID&0x000f)==0x0001)
		t1=ADDR_GENARAL_SCH;
	else if((MenuID&0x000f)==0x0002)
		t1=ADDR_HOLIDAY_SCH;
	else
		return;
	t=MenuID&0x00f0;
	t>>=4;
	t-=1;
	t1=t1+t*PHASE_GROUP_LEN;
	
	t=MenuID&0x0f00;
	t>>=8;
	t-=1;
	t=t1+t*PHASE_LEN;//t指向当前相位
	
	AppBuf[2]=EPR_Read(t1+0);
	AppBuf[1]=EPR_Read(t1+1);
	AppBuf[0]=EPR_Read(t1+2);
	
	//调换一下
	lie=0;
	hang=0;
//输入
	kv=KEY_NOTKEY;//不是任何的按键,仅为了处理方便
	while(1)
	{
		while(kv==KEY_NOKEY)
		{
			kv=GetKey();
			if(SecondFlag)
			{
				SecondCheck();//不允许以防止输出错误参数
				AutoLockCnt--;
				SecondFlag=0;
				if(AutoLockCnt<SYS_AUTO_LOCK_TIME)
				{
					DeskTopFlag=1;
					PswLock=1;
					return;
				}
			}
		}
		AutoLockCnt=SYS_LCD_OFF_TIME;
		switch(kv)
		{
			case KEY_UP:
				if(hang)
					hang-=1;
				break;
			case KEY_DOWN:
				if(hang<3)
					hang++;
				break;
			case KEY_LEFT:
				if(lie)
					lie--;
				break;
			case KEY_RIGHT:
				if(lie<4)
					lie++;
				break;
			case KEY_NUM5://5健也控制
			case KEY_LOGIC:
				t1=hang*5+lie;
				if(t1<8)
				{//
					t3=0x01;
					for(t1=0;t1<t2;t1++)
						t3<<=1;	
					AppBuf[0]^=t3;						
				}
				else if(t1<16)
				{
					t3=0x01;
					for(t1=8;t1<t2;t1++)
						t3<<=1;	
					AppBuf[1]^=t3;
				}
				else if(t1<20)
				{
					t3=0x01;
					for(t1=16;t1<t2;t1++)
						t3<<=1;	
					AppBuf[2]^=t3;
				}
				break;
			case KEY_ENTER:
				EPR_Page_0();//Page1为正常,Page0为缓冲
				EPR_Write(t+0,AppBuf[2]);
				EPR_Write(t+1,AppBuf[1]);
				EPR_Write(t+2,AppBuf[0]);
				EPR_Page_1();
				//LcdCurOff();
				return;
			case KEY_MENU:
				DeskTopFlag=1;
				MenuID=0x0000;
				//这里不能加break
			case KEY_CANCEL:
				//LcdCurOff();//OnCancel()中会关闭光标
				return;
			default:
				;
		}
		if(kv!=KEY_NOTKEY)//不是第一次
			LcdCur(hang,lie);
		//显示
		LcdCnString(0,0,"东");LcdCnString(1,0,"北");
		LcdCnString(2,0,"西");LcdCnString(3,0,"南");
		t2=0;t3=2;
		for(t1=0x01;t1<=0x80;t1=t1<<1)
		{//0
			LcdChar(t2,t3,CHOOSE_H);
			if(AppBuf[0] & t1)//选中
				LcdAddChar(NOTCHOSEN_L);
			else
				LcdAddChar(CHOSEN_L);
			t3++;
			if(t3==7))
			{
				t2+=1;
				t3=2;
			}
		}
		for(t1=0x01;t1<=0x80;t1=t1<<1)
		{//1
			LcdChar(t2,t3,CHOOSE_H);
			if(AppBuf[1] & t1)//选中
				LcdAddChar(NOTCHOSEN_L);
			else
				LcdAddChar(CHOSEN_L);
			t3++;
			if(t3==7))
			{
				t2+=1;
				t3=2;
			}
		}
		for(t1=0x01;t1<=0x08;t1=t1<<1)
		{//2
			LcdChar(t2,t3,CHOOSE_H);
			if(AppBuf[2] & t1)//选中
				LcdAddChar(NOTCHOSEN_L);
			else
				LcdAddChar(CHOSEN_L);
			t3++;
			if(t3==7))
			{
				t2+=1;
				t3=2;
			}
		}
		kv=KEY_NOKEY;
	}
}

void SetAttribTime()
{
//输入:MenuID,返回:无
//显示当前
	unsigned char xdata kv,hang;
	unsigned int xdata t,t1,t2,t3;
	LcdInit();
	hang=0;
	if((MenuID&0x000f)==0x0001)

⌨️ 快捷键说明

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