#include "flash.h"
#include "define.h"
//************************************空函数************************************
//函数名称: nullsubs
//函数说明: 无
//入口参数: 无
//出口参数: 无
//******************************************************************************
void nullsubs(void)
{
}
//******************************************************************************
struct menu{
unsigned char menucount; //当前层节点数
unsigned char *str; //菜单标题
unsigned char pos;
unsigned char length;
void (*subs)(); //节点函数
struct menu *childrenmenu; //子节点
struct menu *parentmenu; //父节点
};
struct menu1{
unsigned char *str1;
unsigned char pos1;
unsigned char length1;
};
//******************************************************************************
//******************************菜单显示内容************************************
//说明: 结构体中放的是菜单的显示内容等参数,完成菜单功能变换,菜单返回
// 菜单指针函数、可以指向下一级菜单,也可以指向某一项选项的功能
// 实际中可以根据具体内容变换。
//******************************************************************************
struct menu1 menu2[2][4] = {
{
{"功┃",0x80,2},
{"能┃",0x90,2},
{"选┃",0x88,2},
{"择┃",0x98,2}
},
{
{"其┃",0x80,2},
{"它┃",0x90,2},
{"功┃",0x88,2},
{"能┃",0x98,2}
}
};
struct menu main_menu[8];
struct menu other_menu[4];
struct menu main_menu[8] = {
{8,"1.目标设定",0x82,5,SetValue,Null,Null},
{8,"2.全部增加",0x92,5,AllAdd,Null,Null},
{8,"3.全部减少",0x8a,5,AllDec,Null,Null},
{8,"4.包机搜索",0x9a,5,Search,Null,Null},
{8,"5.称重清零",0x82,5,ClsWeight,Null,Null},
{8,"6.电池电压",0x92,5,ADC,Null,Null},
{8,"7.背光调整",0x8a,5,BaL,Null,Null},
{8,"8.厂家设置",0x9a,5,PassWords,Null,Null},
};
struct menu other_menu[4] = {
{4,"1.称重标定",0x82,5,AdjWeight,Null,main_menu},
{4,"2.包机站号",0x92,5,SetAddress,Null,main_menu},
{4,"3.包机子站",0x8a,5,SetStation,Null,main_menu},
{4,"4.返回上级",0x9a,5,nullsubs,main_menu,main_menu}
};
//******************************************************************************
//************************************全局变量**********************************
struct menu (*menupoint) = main_menu; //结构体指针,指向结构体后由内部函数指针指向功能函数
//******************************************************************************
void PowerOff(void)
{
clrram();
Disp_HZ(0,1," 正在关机 ",8);
jindutiao(2,1);
jindutiao(2,1);
jindutiao(2,1);
clrram();
_DINT();
LCD_LED_H;
E_0;
P5OUT&=0xfe;
}
void findkey(void)
{
switch(P4IN)
{
case 0xFB :
key = DOWN;
break;
case 0xDF :
key = UP;
break;
case 0xF7 :
key = ENTER;
break;
case 0xEF :
key = ESC;
break;
case 0x7F :
key = FUN;
break;
case 0xBF :
key = CLS;
break;
case 0xFD :
key = COMP;
break;
case 0xFE :
key = POWER;
break;
case 0x7d :
key = FUN_COMP;
break;
default :
key= Null ;
break;
}
}
//***********************************待处理函数*********************************
//函数名称: aa
//函数说明: 实际中要替换为具体函数原型,这里只是举例说明
//入口参数: 无
//出口参数: 无
//******************************************************************************
void aa(void)
{
clrram();
Disp_HZ(1,1,"数据发送中",5);
jindutiao(2,4);
if (wait==0)
{
Disp_HZ(1,1," 发送成功",5);
jindutiao(2,1);
}
else
{ clrram();
Disp_HZ(1,1," 通讯失败",5);
Disp_HZ(1,2," 请重试 ",5);
while(1)
{
key=Null;
key_process();
if(key==ENTER||key==ESC)
{key=Null;
break;
}
}
}
clrram();
}
void init_clk(void)
{
uchar i;
BCSCTL1 &= ~XT2OFF; // XT2 = HF XTAL
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
BCSCTL2 |= SELM1; // MCLK = XT2 (safe)
}
//************************************菜单显示**********************************
//函数名称: void menu_disp(uchar n)
//函数说明: 显示主菜单
//入口参数: uint n,要显示的菜单级数号码
//出口参数: 无
//******************************************************************************
void menu_disp(void)
{
uchar i;
clrram();
maxitems = menupoint[0].menucount;
if(userchoose < 4 && maxitems < 5)
{
for(i = 0 ;i < maxitems;i++)
{
wch_disp(menupoint[i].str,menupoint[i].pos,menupoint[i].length);
}
}
else if(userchoose < 4 && maxitems >= 5)
{
for(i = 0;i < 4;i++)
{
wch_disp(menupoint[i].str,menupoint[i].pos,menupoint[i].length);
}
}
else if(userchoose >= 4)
{
clrram();
clrram();
for(i = 0; i < maxitems - 4;i ++)
{
wch_disp(menupoint[i + 4].str,menupoint[i + 4].pos,menupoint[i + 4].length);
}
}
if(menupoint == main_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[0][i].str1,menu2[0][i].pos1,menu2[0][i].length1);
}
}
else if(menupoint == other_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[1][i].str1,menu2[1][i].pos1,menu2[1][i].length1);
}
}
con_wch_disp(menupoint[userchoose].pos,menupoint[userchoose].length);
}
//******************************************************************************
//************************************键盘处理**********************************
//函数名称: key_process
//函数说明: 键盘处理
//入口参数: 无
//出口参数: 无
//******************************************************************************
void key_process(void)
{
if(P4IN!=0xff)
{
LED=1;
cnt=0;
Delay_Nms(KeyDelay);//延时消抖
while(P4IN!=0xff)
{ cnt=0;
findkey();
Presstime++;
if (Presstime > LongPress*2 && (key == DOWN||key == UP||key == FUN_COMP) )//判断长按
{
break;
}
else if (Presstime > LongPress*2 && (key == POWER)) //判断长按
{
PowerOff();
LPM4;
break;
}
}
if((P4IN!=0xff) && (key == DOWN||key == UP)&&Setvalues==1)
{ PresstimeLong++;
if(PresstimeLong>=10&&PresstimeLong<20) key+=10;
if(PresstimeLong>=20) key+=20;
}
}
if(P4IN==0xff)
{
Presstime=0;
PresstimeLong=0;
}
}
void readall(uchar nus)
{ uchar i;
clrram();
Disp_HZ(0,1,"**数据读取中****",8);
Disp_HZ(0,2," 读取 号",5);
if(nus>=1&&nus<=MaxStation[NowMainStation])
{
Disp_NUM(3,2,nus,0,0);
readstation(NowMainStation,nus,0x00,0x00);
jindutiao(3,1);
}
else
{
for(i=1;i<=MaxStation[NowMainStation];i++)
{ Disp_NUM(3,2,i,0,0);
readstation(NowMainStation,i,0x00,0x00);
jindutiao(3,1);
}
}
if(nus>=1&&nus<=MaxStation[NowMainStation])
{
Disp_NUM(3,2,nus,0,0);
readstation(NowMainStation,nus,0x00,0x00);
jindutiao(3,1);
}
else
{
for(i=1;i<=MaxStation[NowMainStation];i++)
{ Disp_NUM(3,2,i,0,0);
readstation(NowMainStation,i,0x00,0x00);
jindutiao(3,1);
}
}
if (wait==1)
{Disp_HZ(1,1," 通讯失败",5);
Disp_HZ(1,2," 请重试 ",5);
while(1)
{
key=Null;
key_process();
if(key==ENTER||key==ESC)
{key=Null;
break;
}
}
}
}
void Search(void)
{
clrram();
Disp_HZ(0,0,"**搜索可用包机**",8);
Disp_HZ(0,1," 搜索 号 ",8);
MainsCounter=0;
for(stations=Num_of_main;stations>=1;stations--)
{ cnt=0;
readstation(stations,0xf0,0x07,0);
Disp_NUM(4,1,stations,0,0);
jindutiao(3,1);
Disp_HZ(0,2," 搜到 个 ",8);
Disp_NUM(4,2,MainsCounter,0,0);
}
if (MainsCounter>0)
{
MaxMainS=MainsCounter-1;
Disp_HZ(0,1," 包机搜索完毕 ",8);
Disp_HZ(0,2," 搜到 个 ",8);
Disp_NUM(4,2,MainsCounter,0,0);
Disp_HZ(0,3," ◆选择 号 ",8);
NowMainStation=MainStation[0];
Disp_NUM(4,3,NowMainStation,0,0);
}
else
{
clrram();
Disp_HZ(0,0,"**搜索包机失败**",8);
Disp_HZ(0,1," 请您重新搜索 ",8);
Disp_HZ(0,2," 按任意键返回 ",8);
}
key=Null;
while(key==Null)
{
key_process();
if(MainsCounter==0)
{
if(key!=Null)
{
key=Null;
break;
}
}
else
{
if(key==ENTER)
{
key=Null;
NowStation=1;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if(key==UP)
{
if(MSCounter<MaxMainS)
MSCounter++;
NowMainStation=MainStation[MSCounter];
Disp_NUM(4,3,NowMainStation,0,0);
key=Null;
}
if(key==DOWN)
{
if(MSCounter>0)
MSCounter--;
NowMainStation=MainStation[MSCounter];
Disp_NUM(4,3,NowMainStation,0,0);
key=Null;
}
}
}
}
void numdisp(uchar xx)
{
if (xx<5)
{
Disp_HZ(0,xx-1,shuzi[xx-1],1);
}
else if(xx>4&&xx<9)
{
Disp_HZ(4,xx-5,shuzi[xx-1],1);
}
else
{
Disp_HZ(0,xx-9,shuzi[xx-1],1);
}
}
void valuedisp(uchar xx,uint *num)
{
if (xx<5)
{
Disp_HZ(0,xx-1,shuzi[xx-1],1);
Disp_NUM(1,xx-1,num[xx],1,0);
}
else if(xx>4&&xx<9)
{
Disp_HZ(4,xx-5,shuzi[xx-1],1);
Disp_NUM(5,xx-5,num[xx],1,0);
}
else
{
Disp_HZ(0,xx-9,shuzi[xx-1],1);
Disp_NUM(1,xx-9,num[xx],1,0);
}
}
void dis(uchar xx,uint *num)
{
uchar i;
uchar pos;
clrram();
if(xx<9)
{
if (MaxStation[NowMainStation]<=8)
{
for(i=1;i<=MaxStation[NowMainStation];i++)
valuedisp(i,num);
}
else
{
for(i=1;i<=8;i++)
valuedisp(i,num);
}
}
else
{
if (MaxStation[NowMainStation]>8)
{
for(i=9;i<=MaxStation[NowMainStation];i++)
valuedisp(i,num);
}
}
switch(xx)
{
case 1: pos=0x80;
break;
case 2: pos=0x90;
break;
case 3: pos=0x88;
break;
case 4: pos=0x98;
break;
case 5: pos=0x80+4;
break;
case 6: pos=0x90+4;
break;
case 7: pos=0x88+4;
break;
case 8: pos=0x98+4;
break;
case 9: pos=0x80;
break;
case 10: pos=0x90;
break;
case 11: pos=0x88;
break;
case 12: pos=0x98;
break;
default:
break;
}
con_wch_disp(pos,1);
}
void SetValue(void)
{
readall(0xff);
clrram();
State=0;
key=Null;
dis(NowStation,set1);
while(State==0)
{Setvalues=1;
key_process();
Setvalues=0;
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(NowMainStation,NowStation,0x01,set1[NowStation]);
aa();
readall(NowStation);
clrram();
dis(NowStation,set1);
key=Null;
}
else if(key==FUN)
{
if (NowStation==MaxStation[NowMainStation])
{ NowStation=1;}
else
{ NowStation++;}
dis(NowStation,set1);
key=Null;
}
else if(key==UP)
{
if(set1[NowStation]<6000)
set1[NowStation]++;
dis(NowStation,set1);
key=Null;
}
else if(key==DOWN)
{
if(set1[NowStation]>3000)
set1[NowStation]--;
dis(NowStation,set1);
key=Null;
}
else if(key==UP+10)
{
if(set1[NowStation]<5990)
set1[NowStation]+=10;
dis(NowStation,set1);
key=Null;
}
else if(key==DOWN+10)
{
if(set1[NowStation]>3010)
set1[NowStation]-=10;
dis(NowStation,set1);
key=Null;
}
else if(key==UP+20)
{
if(set1[NowStation]<5900)
set1[NowStation]+=100;
dis(NowStation,set1);
key=Null;
}
else if(key==DOWN+20)
{
if(set1[NowStation]>3100)
set1[NowStation]-=100;
dis(NowStation,set1);
key=Null;
}
}
}
void ClsWeight(void)
{
clrram(); //清除显示
Disp_HZ(0,0,"**称重清零******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(NowMainStation,NowStation,0x08,0x00);
key=Null;
aa();
Disp_HZ(0,0,"**称重清零******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
}
else if(key==UP)
{
if (NowStation==MaxStation[NowMainStation])
{ NowStation=1;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation++;
Disp_NUM(5,1,NowStation,0,0);
}
key=Null;
}
else if(key==DOWN)
{
if(NowStation>1)
{ NowStation--;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation=MaxStation[NowMainStation];
Disp_NUM(5,1,NowStation,0,0);
}
key=Null;
}
}
}
void AdjWeight(void)
{
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"进入请按组合键!",8);
Disp_HZ(0,2,"退出请按取消键!",8);
while(1)
{ key=Null;
key_process();
if (key == FUN_COMP)
{ key=Null;
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
AdjWeight2();
}
else if(key==UP)
{
if (NowStation==MaxStation[NowMainStation])
{ NowStation=1;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation++;
Disp_NUM(5,1,NowStation,0,0);
}
key=Null;
}
else if(key==DOWN)
{
if(NowStation>1)
{ NowStation--;
Disp_NUM(5,1,NowStation,0,0);
}
else
{ NowStation=MaxStation[NowMainStation];
Disp_NUM(5,1,NowStation,0,0);
}
key=Null;
}
}
}
else if(key==ESC)
{
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
}
}
void AdjWeight2(void)
{
uchar ps=0;
key=Null;
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆状态:P-",5);
Disp_NUM(5,1,ps,0,0);
State=0;
key=Null;
while(1)
{ key=Null;
key_process();
if(key==ENTER)
{
readstation(NowMainStation,NowStation,0x09,ps);
key=Null;
aa();
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆状态:P-",5);
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
else if(key==UP)
{
if (ps==7)
{ ps=0;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
else
{ ps++;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
key=Null;
}
else if(key==DOWN)
{
if(ps>0)
{ ps--;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
else
{ ps=7;
if(ps==7)
Disp_HZ(5,1,"退出",2);
else
{Disp_HZ(5,1," ",2);
Disp_NUM(5,1,ps,0,0);
}
}
key=Null;
}
else if(key==ESC)
{
key=Null;
clrram(); //清除显示
Disp_HZ(0,0,"**称重标定******",8);
Disp_HZ(0,1,"◆喷嘴号:",4);
Disp_NUM(5,1,NowStation,0,0);
break;
}
}
}
void SetAddress(void)
{
uint i=1;
//start:
clrram(); //清除显示
Disp_HZ(0,0,"**包机站号设置**",8);
Disp_HZ(0,1,"◆包机号:",4);
Disp_NUM(5,1,i,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(0xff,0xf0,0x05,i);
key=Null;
aa();
Disp_HZ(0,0,"**包机站号设置**",8);
Disp_HZ(0,1,"◆包机号:",4);
Disp_NUM(5,1,i,0,0);
}
else if(key==UP)
{
if(i<Num_of_main)
i++;
else
i=1;
Disp_NUM(5,1,i,0,0);
key=Null;
}
else if(key==DOWN)
{
if(i>1)
i--;
else
i=Num_of_main;
Disp_NUM(5,1,i,0,0);
key=Null;
}
}
}
void SetStation(void)
{
uint i=8;
clrram(); //清除显示
Disp_HZ(0,0,"**喷嘴设置******",8);
Disp_HZ(0,1,"◆喷嘴数:",4);
Disp_NUM(5,1,i,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();
if(key==ESC)
{
State=1;
key=Null;
break;
}
else if(key==ENTER)
{
readstation(0xff,0xf0,0x06,i);
key=Null;
aa();
Disp_HZ(0,0,"**喷嘴设置******",8);
Disp_HZ(0,1,"◆喷嘴数:",4);
Disp_NUM(5,1,i,0,0);
}
else if(key==UP)
{
if(i<12)
i++;
else
i=1;
Disp_NUM(5,1,i,0,0);
key=Null;
}
else if(key==DOWN)
{
if(i>1)
i--;
else
i=12;
Disp_NUM(5,1,i,0,0);
key=Null;
}
}
}
//************************************密码函数************************************
//函数名称: PassWords
//函数说明: 无
//入口参数: 无
//出口参数: 无
//******************************************************************************
void PassWords(void)
{
uint i=0;
clrram(); //清除显示
Disp_HZ(0,0,"**输入密码******",8);
Disp_HZ(0,1,"◆密码值:",4);
Disp_NUM(5,1,i,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
Delay_Nms(500);
key_process();
if(key==ESC)
{
State=1;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if((key==ENTER) && ( i == PassWord ))
{
menupoint =other_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
key=Null;
State=1;
}
else if(key==UP)
{
if(i<99)
i++;
Disp_NUM(5,1,i,0,0);
key=Null;
}
else if(key==DOWN)
{
if(i>0)
i--;
Disp_NUM(5,1,i,0,0);
key=Null;
}
}
}
void BaL(void)
{
clrram(); //清除显示
Disp_HZ(0,0,"**背光调整******",8);
Disp_HZ(0,1,"◆亮度值:",4);
Disp_NUM(5,1,bal,0,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
Delay_Nms(500);
key_process();
if(key==ESC)
{
State=1;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if(key==ENTER)
{
_DINT();
write_buff[1]=bal;
flash_erase( pc_flash_segment); //段擦除
write_array(pc_flash, write_buff,4); //写入指定字节数量
_NOP();
read_array(pc_flash,checkout,4); //再读出刚才写的字节
bal=checkout[1];
key=Null;
_EINT();
State=1;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
else if(key==UP)
{
if(bal<99)
bal++;
Disp_NUM(5,1,bal,0,0);
key=Null;
}
else if(key==DOWN)
{
if(bal>0)
bal--;
Disp_NUM(5,1,bal,0,0);
key=Null;
}
}
}
//************************************电量函数************************************
//函数名称: ADC
//函数说明: 无
//入口参数: 无
//出口参数: 无
//******************************************************************************
void ADC(void)
{
adc=1;
//start:
clrram(); //清除显示
ADC_Init();
Disp_HZ(0,0,"**电池电量******",8);
Disp_HZ(1,1,"电压值:",4);
Disp_HZ(7,1," V",2);
Disp_NUM(4,1,Curr_Volt,1,0);
State=0;
key=Null;
while(State!=1)
{key=Null;
key_process();
switch (State)
{
case 0 :
if(key==ESC)
{P6SEL= 0; // 使能ADC通道
ADC12CTL0 = 0; // 打开ADC,设置采样时间
ADC12IE = 0; // 使能ADC中断
State=1;
adc=0;
key=Null;
menupoint =main_menu;
userchoose = 0;
displaystart = 0;
menu_disp();
break;
}
}
}
}