📄 menu.c.bak
字号:
#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 + -