2640|11

27

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

不知道怎么改 [复制链接]

 
/*********************************************************
-- 程序名称:温室定(变)量灌溉控制器:
-- 功    能:1).系统菜单; 2).空气湿度测量; 3).温度测量;
                           4).变量轮灌; 5).定量轮灌;         6).定量点灌;
                          7).更新定时时间;                                8).系统自检.
-- 时    间:2010-11-4
-- 编    程:杨术明          Version:v1.0
-- 修改时间:2010-11-11
;*********************************************************/
//------------包含文件--------
#include
#include
#include
#include
#include
#include
//#include
#include "scancodesysm.h"
#include "STC5A_EEPROM.h"         
#define        uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long        
//----------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40                                                                                                                                                                                A
#define BYTE_BIT7        0x80
//---------------------
/***********************JHD19264A接口*****************************
;连线图:
;LCM---89C52  LCM---89C52   LCM-------89C52     LCM----------89C52
;DB0---P0.0   DB4---P0.4    D/I-------P2.2      CS1----------P2.3  
;DB1---P0.1   DB5---P0.5    R/W-------P2.1      CS2----------P2.4  
;DB2---P0.2   DB6---P0.6    RST--------VCC      RST----------P3.4
;DB3---P0.3   DB7---P0.7    E---------P2.0                           
;注:89C52的晶振频率为11.0592MHz
;写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式
;******************************************************************/
//-----常用操作命令和参数定义---------
#define         DISPON                0x3f        //显示on               
#define         DISPOFF        0x3e        //显示off               
#define         DISPFIRST        0xc0        //显示起始行定义        
#define         SETX                0x40        //X定位设定指令(页)        
#define         SETY                0xb8        //Y定位设定指令(列)        
#define         Lcdbusy        0x80        //LCM忙判断位               
//--------显示分区边界位置------------
#define         MODL                0x00        //左区                        
#define         MODM                0x40        //左区和中区分界        
#define         MODR                0x80        //中区和右区分界        
#define        LCMLIMIT        0xC0        //显示区的右边界
sfr         Datalcm                =0x80;                //数据口        
//-----液晶显示器接口引脚定义--------
sbit        Elcm                   =P2^0;                //
sbit        Rwlcm                =P2^1;                //
sbit        Dilcm                =P2^2;                //
sbit        CS1LCM                =P2^3;                //
sbit        CS2LCM                =P2^4;                //
//----蜂鸣器,继电器---------------
sbit           relay                =P2^5;
sbit           Beep                =P2^6;  
bdata         uchar keyflag=0;
sbit         key0flag=keyflag^0;
sbit         key1flag=keyflag^1;
//sbit         timeflag=keyflag^2;
sbit         serialflag=keyflag^3;
sbit         tempflag=keyflag^4;
sbit         soilflag=keyflag^5;
//----DHT21-------------------------
sbit   DHT21_DAT         =P2^7;        //DHT21 DATA引脚
uchar  data U8FLAG,k,err;
uchar  idata U8count,U8temp;
uchar  idata U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;        //16位湿度数据+16位温度数据+8位校验位;
uchar  idata U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar  idata U8comdata;
float  xdata temp=0,humidity=0;

uint   xdata U16temp1=0, U16temp2=0;
int  xdata adjh=0,adjt=0;
//========继电器组定义(7站)==================
/*sbit        RELAY1                = P1^1;             //
sbit        RELAY2                = P3^7;
sbit        RELAY3                = P1^3;
sbit        RELAY4                = P1^2;
sbit        RELAY5                = P1^4;
sbit        RELAY6                = P2^7;
sbit        RELAY7                = P3^5;  */
//========继电器组定义(4站)==================
sbit        RELAY1                = P1^3;             //
sbit        RELAY2                = P3^7;                                //
sbit        RELAY3                = P1^4;
sbit        RELAY4                = P1^2;
//==============PS2键盘=================
sbit           Key_CLK                =P3^3; //INT1
sbit           Key_Data        =P3^6; //WR
sbit           Redled                =P3^5; //T1
//-------------STC12C5A32AD------------
sfr            CLK_DIV         =0x97;        //时钟分频寄存器
sfr         AUXR                =0x8e;        //辅助寄存器
sfr         AUXR1                =0xA2;        //辅助寄存器1,AUXR1.2为ADRJ:0,10位结果的高8位存放在ADC_RES中,低2位存放在ADC_RES1的低2位;1,10位结果的高2位存放在ADC_RES1的低2位,低8位存放在ADC_RES中
sfr         P1ASF                =0X9D;        //P1口模拟特殊功能选择寄存器,相应位置1,P1.4则当A/D使用
sfr         ADC_CONTR         =0XBC;        //A/D转换控制寄存器,ADC_POWER SPEED1 SPEED2 ADC_FLAG ADC_START CHS2 CHS1 CHS0
sfr         ADC_RES         =0XBD;        //A/D转换结果寄存器
sfr         ADC_RESL         =0XBE;        //A/D转换结果寄存器低
sfr            BRT                 =0x9C;        //时钟分频寄存器
sfr         WDT_CONTR         =0xC1;        //看门狗SFR,声明寄存器        STC12c系列
//============命令帧,数据帧头及分机编号,命令类型定义=======
#define RELAYNO1                0x01
#define RELAYNO2                0x02
#define RELAYNO3                0x03
#define RELAYNO4                0x04
#define RELAYNO5                0x05
#define RELAYNO6                0x06
#define RELAYNO7                0x07

#define COMTEMP                        0x01
#define COMSOIL                        0x02
#define COMTEMP_SOIL        0x03
#define COMOK                        0x04
#define COMERR                        0x05
#define SOIL_LOWERLIMIT                15
#define SOIL_UPPERLIMIT                20
#define TEMP_LOWERLIMIT                15
#define TEMP_UPPERLIMIT                eeprom[6]
#define HUMI_LOWERLIMIT                eeprom[5]
#define HUMI_UPPERLIMIT                50

//----------------------------------------------------------------------------------------------------------------
bdata uchar DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)          // 就是一个宏定义, 遇到宏 DATA7 就会替换成 ((DATA_BUF & BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;

uchar idata  str[5]={0};
char xdata timerset[4]={25,25,25};
float xdata soilmoisture=0;
float xdata soil;
//char* soil;
//char txbuf[];        ///        待定
/****************全局变量定义*******************/
uchar col,row,cbyte;                //列x,行(页)y,输出数据
bit TimeFlag=0;
bit Hzflag=0;
bit Disflag=0,CheckFlag=0,ESCFlag=0,OKFlag=0;
uint  TimeCounter,TimeCnt; //TimeCounter:电磁阀开启时间常数;TimeCnt:计数器
uint xdata timersendcontrol=300;//定时灌溉时间控制参数          300/300=1min
bit numlockflag=0,validflag=0;//收到有效键码标志
uchar IntNum = 0; //中断次数计数
uchar KeyV; //键盘传来的通码或断码
uchar retkey,key;
bit Key_UP=1,Shift = 0;//Key_UP=0是键松开标识,Shift=0是Shift键按下标识
bit BF = 0; //标识是否有键按下标识,有键按下在中断中置1,解码完毕清0
uchar         rxflag=0;
// ------------------通信变量-------------------------
//uchar  data   uc0;//,RetKey;
uchar  xdata ComBuf[20]; //register for display
char   xdata eeprom[7]; //eerom中参数:T0 T1 T3 AT AH HL TL
//eeprom[0]=timerset[0],eeprom[1]=timerset[1],eeprom[2]=timerset[2]
//eeprom[3]=adjt,                eeprom[4]=adjh,                  eeprom[5]=Humid LOW
//eeprom[6]=Temp LOW
//---------------键值定义-------------------
display[];

#define NoKeyPress    0xff   //* 没有键按下

#define KEY_INS                0
#define KEY_END                1
#define KEY_DOWN        2
#define KEY_PgDn        3
#define KEY_LEFT        4
#define KEY_RIGHT        6
#define KEY_HOME        7
#define KEY_UP                8
#define KEY_PgUp        9
#define KEY_ESC                10
#define KEY_OK                13

//--------Menu Definition-------------------
uchar  iMenuID;        //当前菜单的ID
uchar  iMenuNextID;           //将要显示菜单的ID,
uchar idata cMenuTemp1;//显示菜单时的临时索引号
//======当前状态索引号定义===========
#define                 MAX_KEYTABSTRUCT_NUM                        20
#define         MENU_FACE                                                0
#define         MENU_ROOT                                                1

#define         MENU_Mode                                                2
#define                MENU_Mode_UNIFORMRATE                        3
#define                MENU_Mode_SELECT                                4
#define                MENU_Selfcheck                                        5
#define                MENU_Selfcheck_KBCHECK                        6
#define                MENU_Selfcheck_DHT21                    7
#define                MENU_Selfcheck_SENSORCHECK                8
#define                MENU_Selfcheck_nRF905CHECK                9

#define                MENU_SystemSet                                        10
#define                MENU_SystemSet_COM                                11
#define                MENU_SystemSet_COM_BAUDRATE                12
#define                MENU_SystemSet_COM_SELECOM                13
#define                MENU_SystemSet_INITIALAMOUNT        14
                                                                                       
#define                MENU_Experiment                                        15
#define                MENU_Experiment_DHT21_ADJUST        16
#define                MENU_Experiment_SENSOR                        17
#define                MENU_Experiment_WATERMAN                18
#define                MENU_Experiment_EMVopen                        19

//-------------------------------------------------
typedef struct
        {
        uchar KeyTab_MenuIndex;                //当前状态索引号
        uchar KeyTab_MaxItems;                //本级菜单最大条目数
    uchar KeyTab_PressOk;            //按下"回车"键时转向的状态索引号
           uchar KeyTab_PressEsc;                //按下"返回"键时转向的状态索引号
    uchar KeyTab_PressDown;            //按下"向下"键时转向的状态索引号
           uchar KeyTab_PressUp;            //按下"向上"键时转向的状态索引号
        void (*CurrentOperate)();   //当前状态应该执行的功能操作
        }KeyTabStruct;
        void    (*KeyFuncPtr)();        //按键功能指针
typedef struct PID
{
int SetPoint; //设定目标 Desired Value
long SumError; //误差累计
double Proportion; //比例常数 Proportional Const
double Integral; //积分常数 Integral Const
double Derivative; //微分常数 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;
static PID sPID;
static PID *sptr = &sPID;

/*****************函数列表**********************/
void Lcminit(void);                //液晶模块初始化        
void Delay(uchar);                //延时,入口数为Ms        
void Delay1(uint j);
//void delay1(uint i);
void lcdbusyL(void);                //busy判断、等待(左区)        
void lcdbusyM(void);                //busy判断、等待(中区)        
void lcdbusyR(void);                //busy判断、等待(右区)        
//void Putedot(uchar);                //半角字符输出               
void Putedot(uchar Order,bit DispAttrib); //半角字符输出
void Putcdot(uchar);                //全角(汉字)输出        
void Wrdata(uchar);                    //数据输出给LCM               
void Lcmcls( void );                //LCM全屏幕清零(填充0)        
void wtcom(void);                        //公用busy等待               
void Locatexy(void);                //光标定位               
void WrcmdL(uchar);                        //左区命令输出               
void WrcmdM(uchar);                        //中区命令输出               
void WrcmdR(uchar);                        //右区命令输出               
void Putstr(uchar *puts,uchar i);        //中英文字符串输出        
void Timer0init(void);
void Timer1init(void);
uchar Key_Press(bit b);
void  RestWatchdog(void);
void  TranDataBy232(uchar d);
void  OpeningBeep(uchar OBN);
void InitSBUF(void);
void RecvToBuf(void);
void CheckLED(void);
//void DispFirstmenu(void);
void Lcmclsline(uchar lineNo );
void MenuFunctionDemo1(void);
void JudgeHLight(void);
void DispFace(void);
uchar Decode(uchar ScanCode);
void FlashLed(uchar num);
void Config905(void);
void nRF905Init(void);
void read_humidity(void);
void work_humidity(void);
void SendData(uchar *a);
void eeprom_initialize(void);
void eeprom_save(void);
void work_adc(void);
void IncPIDInit(void);
int IncPIDCalc(int NextPoint);
/******************数组列表*********************/
uchar code Ezk[];                //ASCII常规字符点阵码表0        
uchar code Hzk[];                //自用汉字点阵码表        
uchar code STR0[];
uchar code STR1[];                //自定义字符串               
//uchar code STR2[];
uchar code Hzk1[];                //自用汉字点阵码表1        
uchar code Hzk2[];                //自用汉字点阵码表1        
//KeyTabStruct code KeyTab[MAX_KEYTABSTRUCT_NUM];
KeyTabStruct xdata KeyTab[MAX_KEYTABSTRUCT_NUM];
uchar code *Menu_Root[4]=
        {
        " Mode ",
        " Check",
        " Set  ",
        " Help "
        };
uchar code Menu_RootID[4]=
        {
        MENU_Mode,
        MENU_Selfcheck,
        MENU_SystemSet,
        MENU_Experiment
        };
uchar code *Menu_Mode[2]=
        {
        " Variable   Rate",
        " Rotational Rate",
        };
uchar code Menu_ModeID[2]=
        {
        MENU_Mode_UNIFORMRATE,
        MENU_Mode_SELECT
        };
//
uchar code *Menu_Selfcheck[5]=
        {
        " Keyboard Check",
        " DHT21    Check",
        " EEPROM   Check",
        " nRF905   Check",
        };                        
uchar code Menu_SelfcheckID[4]=
        {
        MENU_Selfcheck_KBCHECK,
        MENU_Selfcheck_DHT21,
        MENU_Selfcheck_SENSORCHECK,
        MENU_Selfcheck_nRF905CHECK,
        };
//
uchar code *Menu_SystemSet[2]=
        {
        " Set Partime ",
        " Set Alltime"
        };
uchar code Menu_SystemSetID[2]=
        {
        MENU_SystemSet_COM,
        MENU_SystemSet_INITIALAMOUNT
        };
uchar code *Menu_COM[2]=
        {
        " T0-T3     ",
        " Selected Rate"
        };
uchar code Menu_COMID[2]=
        {
        MENU_SystemSet_COM_BAUDRATE,
        MENU_SystemSet_COM_SELECOM
        };
uchar code *Menu_Experiment[4]=
        {
        " DHT21 Adjust_H",
        " Adj   All    ",
        " Irri  Manually",
        " DHT21 Adjust_T"
        };
uchar code Menu_ExperimentID[4]=
        {
        MENU_Experiment_DHT21_ADJUST,
        MENU_Experiment_SENSOR,
        MENU_Experiment_WATERMAN,
        MENU_Experiment_EMVopen,
        };
//uchar code MenuNULL[]={"              "};
/********************************
--------- 主程序---------------
********************************/
void main(void)

{        

    uchar i;
        CLK_DIV=2;
        //WDT_CONTR = 0x3E;// 4.55s 启动看门狗
        Delay(20);
        FlashLed(3);
        OpeningBeep(3);
        col=0;
        row=0;
        eeprom_initialize();
        //for(i=0;i<4;i++) timerset=25;
        TimeFlag=0;
        iMenuID=MENU_FACE;
        iMenuNextID=MENU_ROOT;//按下回车时显示Menu-root菜单
        Timer0init(); Timer1init();
        InitSBUF();
        Lcminit();                //液晶模块初始化,包括全屏幕清屏
        IncPIDInit();
        retkey=0xff;
        IT1 = 0; //设外部中断1为低电平触发
        EX1 = 1; //开中断
        DispFace();
        i=3;
        while(1)
        {
            key=Key_Press(0);//按键扫描程序
                if(i) key= KEY_OK;//directly go to the variable rate irrigation mode
                if(i!=0) i=i-1;
                switch(key)
                {
                        case        KEY_OK://KEY_OK,        KEY_UP,        KEY_ESC,
                                        if(KeyTab[iMenuID].KeyTab_PressOk!=99)        
                                        //if((KeyTab[iMenuID].KeyTab_PressOk!=99)&&(iMenuNextID!=99))//ysm
                                        { //还有子菜单,将子菜单的索引号作为当前索引号
                                                //iMenuID=KeyTab[iMenuID].KeyTab_PressOk;
                                                iMenuID=iMenuNextID;//用iMenuID暂存父菜单ID,以备按下ESC时能回到先前显示状态,即高亮显示菜单不变.
                                                iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;//将要高亮显示的子菜单索引号
                                                //TranDataBy232(iMenuID);
                                                //TranDataBy232(iMenuNextID);
                                                JudgeHLight();//显示子菜单
                                        }
                                        KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;//无子菜单则执行该菜单命令
                                    (*KeyFuncPtr)();   //执行当前按键的操作
                                        //TranDataBy232(key);OpeningBeep(1);
                                        break;
                        case        KEY_UP:
                                        if(KeyTab[iMenuNextID].KeyTab_PressUp!=99)//&&(iMenuNextID!=99))
                                                {//当前高亮显示菜单还有兄菜单
                                                //KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressUp;
                                                iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressUp;
                                                //TranDataBy232(iMenuID);
                                                //TranDataBy232(iMenuNextID);
                                                JudgeHLight();
                                                }
                                        break;
                        case        KEY_DOWN:
                                        if(KeyTab[iMenuNextID].KeyTab_PressDown!=99)//&&(iMenuNextID!=99))
                                                { //当前高亮显示菜单还有弟菜单
                                                iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
                                                //TranDataBy232(iMenuID);
                                                //TranDataBy232(iMenuNextID);
                                                JudgeHLight();
                                                }
                                        break;
                        case        KEY_ESC:
                                        if(KeyTab[iMenuID].KeyTab_PressEsc!=99)
                                                { //菜单还没到顶,还有父菜单
                                                iMenuNextID=iMenuID;//YSM:从iMenuID取回进入父菜单的高亮显示菜单的ID
                                                iMenuID=KeyTab[iMenuID].KeyTab_PressEsc;//将父菜单的索引号作为当前索引号
                                                //iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
                                                JudgeHLight();        //显示父菜单
                                                //TranDataBy232(iMenuID);
                                        //        TranDataBy232(iMenuNextID);
                                                KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
                                            (*KeyFuncPtr)();    //执行当前按键的操作
                                                }
                                        break;
                        default:
                                        break;
                }                 
                }
}
void Timer0init(void)
{
        TR0 = 0; //关闭定时器0
        TH0=0x4B; //200ms@(11.0592/4=2.7648)Mhz  12/11.0592=1.085*4=4.34us          65536-46083=19453=0x4BFD
        TL0=0xFD;
}
void Timer0_int(void) interrupt 1 using 1
{        
        TH0=0x4B; //200ms@11.0592Mhz  12/11.0592=1.085us          65535-4608=56319=0xEDFF
        TL0=0xFD;
        TimeCnt--;        
        if(TimeCnt==0)
                {
                        TimeFlag=1;        TR0=0;TH0=0x4B;TL0=0xFD;
                        TimeCnt=TimeCounter;
                }
}
void Timer1init(void)
{
        TR1 = 0; //关闭定时器0
        TH1=0; //284ms@(11.0592/4=2.7648)Mhz  12/11.0592=1.085*4=4.34us          65536*4.34=284 426us=284ms
        TL1=0;
}
void Timer1_int(void) interrupt 3 using 3
{        
        TH0=0; //200ms@11.0592Mhz  12/11.0592=1.085us          65535-4608=56319=0xEDFF
        TL0=0;
        WDT_CONTR = 0x3E;//喂狗
}        
/**********************
----- 外部中断0  -----
/**********************/
void External0(void) interrupt 0 using 2
{
        CheckFlag=1;
        _nop_();
}

/**************************
------  外部中断1  -------
**************************/

//void External1(void) interrupt 2 using 3
//{

//   _nop_();
//}
/****************************************/
/*        一个字串的输出                        */
/****************************************/
void Putstr(uchar *puts,uchar i)
        {
                uchar j,X;
                for (j=0;j                 {
                X = puts[j];
                        if (X&0x80)
                                {
                                        Putcdot(X&0x7f);        //只保留低7位
                                }
                        else Putedot(X-0x20,0);                //ascii码表从0x20开始
                }
        }

/****************************************/
/*   半角字符点阵码数据输出                */
//DispAttrib=0:nomal;=1反显
/****************************************/
void Putedot(uchar Order,bit DispAttrib)
        {
        uchar i,bakerx,bakery;        //共定义4个局部变量                        
        int x;                        //偏移量,字符量少的可以定义为uchar        
        bakerx = col;                //暂存x,y坐标,已备下半个字符使用        
        bakery = row;
        x=Order * 0x10;                //半角字符,每个字符16字节        
//上半个字符输出,8列        
        for(i=0;i<8;i++)
                {
                cbyte = Ezk[x];
                if(DispAttrib)                                //取点阵码,rom数组        
                        {Wrdata(~cbyte);}
                else
                        {Wrdata(cbyte);}                                //写输出一字节               
                x++;
                col++;
                if (col==LCMLIMIT){col=0;row++;row++;};        //下一列,如果列越界换行
                        if (row>7) row=0;                //如果行越界,返回首行        
                }                                        //上半个字符输出结束        

        col = bakerx;                                        //列对齐               
        row = bakery+1;                                        //指向下半个字符行        
//下半个字符输出,8列        
        for(i=0;i<8;i++)
                {
                cbyte = Ezk[x];                                //取点阵码               
                if(DispAttrib)                                //取点阵码,rom数组        
                        {Wrdata(~cbyte);}
                else
                        {Wrdata(cbyte);}                                //写输出一字节               
                x++;
                col++;
                if (col==LCMLIMIT){col=0;row=row+2;};        //下一列,如果列越界换行
                        if (row>7) row=1;                //如果行越界,返回首行        //
                }                                        //下半个字符输出结束        
        row=bakery;
        }                                                //整个字符输出结束        


/****************************************/
/*  全角字符点阵码数据输出                */
/****************************************/
void Putcdot(uchar Order)
        {
        uchar i,bakerx,bakery;                //共定义3个局部变量               
        int x;                                //偏移量,字符量少的可以定义为uchar        
        bakerx = col;                        //暂存x,y坐标,已备下半个字符使用        
        bakery = row;
        x=Order * 0x20;                        //每个字符32字节        
        
//上半个字符输出,16列        
        for(i=0;i<16;i++)
                {
                if(Hzflag)
                        Wrdata(Hzk1[x]);                                //写输出一字节               
                else
                        Wrdata(Hzk2[x]);
                x++;
                col++;
                if (col==LCMLIMIT){ col=0;row++;row++;}        //下一列,如果列越界换行
                        if (row>6) row=0;                //如果行越界,返回首行        
                }                                        //上半个字符输出结束        
               
//下半个字符输出,16列        
        col = bakerx;
        row = bakery+1;
        for(i=0;i<16;i++)                                //下半部分
                {
                if(Hzflag)
                        Wrdata(Hzk1[x]);                                //写输出一字节               
                else
                        Wrdata(Hzk2[x]);
                x++;
                col++;
                if (col==LCMLIMIT){col=0;row++;row++;}        //下一列,如果列越界换行
                        if (row>7) row=1;                //如果行越界,返回首行        
                }                                        //下半个字符输出结束        
        row = bakery;
        }                                                //整个字符输出结束        

/****************************************/
/*        清屏,全屏幕清零                */
/****************************************/
void Lcmcls( void )
        {
        for(row=0;row<8;row++)
                   for(col=0;col         }
//****************************************
//屏幕某一行清零lineNo:0->1,2->2,4->3,6->4line
//****************************************/
void Lcmclsline(uchar lineNo )
{   uchar i,j;
        i=lineNo+2;
        j=lineNo;
        for(row=j;row                 for(col=0;col }
/****************************************/
/*        数据写输出                        */
/****************************************/
void Wrdata(uchar X)
        {
        Locatexy();                //坐标定位,返回时保留分区状态不变        
//        wtcom();
                Dilcm = 1;        //数据输出
                Rwlcm = 0;        //写输出  
                Datalcm = X;        //数据输出到数据口
                Elcm = 1;        //读入到LCM
                _nop_();
                Elcm = 0;
        }
/********************************/
/* 命令输出到左区控制口                */
/********************************/
void WrcmdL(uchar X)
        {
                lcdbusyL();                //确定分区,返回时保留分区状态不变
                Dilcm = 0;                        //命令操作        
                Rwlcm = 0;                        //写输出         
                Datalcm = X;                        //数据输出到数据口
                Elcm = 1;_nop_();Elcm = 0;        //读入到LCM
        }

/********************************/
/* 命令输出到中区控制口                */
/********************************/
void WrcmdM(uchar X)
        {
                lcdbusyM();                //确定分区,返回时保留分区状态不变
                Dilcm = 0;                        //命令操作        
                Rwlcm = 0;                        //写输出         
                Datalcm = X;                        //命令输出到数据口
                Elcm = 1;_nop_();Elcm = 0;        //读入到LCM
        }

/********************************/
/* 命令输出到右区控制口                */
/********************************/
void WrcmdR(uchar X)
        {
                lcdbusyR();        //确定分区,返回时保留分区状态不变        
                Dilcm = 0;                        //命令操作        
                Rwlcm = 0;                        //写输出         
                Datalcm = X;                        //命令输出到数据口
                Elcm = 1;_nop_();Elcm = 0;        //读入到LCM
        }

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态                */
/********************************************************/
void lcdbusyL(void)
        {
        CS1LCM = 0;                //CLR        CS1               
        CS2LCM = 0;                //SETB        CS2               
            wtcom();                // waitting for enable        
        }

void lcdbusyM(void)
        {
        CS1LCM = 1;                //SETB        CS1               
        CS2LCM = 0;                //CLR        CS2               
            wtcom();                // waitting for enable        
        }

void lcdbusyR(void)
        {
        CS1LCM = 0;                //SETB        CS1               
        CS2LCM = 1;                //SETB        CS2               
            wtcom();                // waitting for enable        
        }

void wtcom(void)
        {
        Dilcm = 0;                //CLR        DI               
        Rwlcm = 1;                //SETB        RW               
    Datalcm = 0xFF;                //MOV        DATA_LCM,#0FFH  
        Elcm  = 1;_nop_();               
    while(Datalcm & Lcdbusy);
              Elcm  = 0;
        }

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置        */
/********************************************************/
void Locatexy(void)
        {
        unsigned char  x,y;
        switch (col&0xc0)                //  col.and.0xC0        
                {                        //条件分支执行               
                case 0:                {lcdbusyL();break;}        //左区        
                case 0x40:        {lcdbusyM();break;}        //中区        
                case 0x80:        {lcdbusyR();break;}        //右区        
                }
        x = col&0x3F|SETX;                //  col.and.0x3f.or.setx        
        y = row&0x07|SETY;                //  row.and.0x07.or.sety        
                wtcom();                //  waitting for enable               
                Dilcm = 0;                        //CLR        DI        
                Rwlcm = 0;                        //CLR        RW        
                Datalcm = y;                        //MOV        P0,Y        
                Elcm = 1;_nop_();Elcm = 0;
                wtcom();                //  waitting for enable               
                Dilcm = 0;                        //CLR        DI        
                Rwlcm = 0;                        //CLR        RW        
                Datalcm = x;                        //MOV        P0,X        
                Elcm = 1;_nop_();Elcm = 0;
        }

/********************************/
/*液晶屏初始化                        */
/********************************/
void Lcminit(void)
        {
                cbyte = DISPOFF;        //关闭显示屏        
                WrcmdL(cbyte);
                WrcmdM(cbyte);
                WrcmdR(cbyte);
                cbyte = DISPON;                //打开显示屏        
                WrcmdL(cbyte);
                WrcmdM(cbyte);
                WrcmdR(cbyte);
                cbyte = DISPFIRST;        //定义显示起始行为零        
                WrcmdL(cbyte);
                WrcmdM(cbyte);
                WrcmdR(cbyte);
                Lcmcls();
//                col=0;                //清屏               
//                row=0;
                Locatexy();
//                L_RSET = 1;
        }
/********************************/
/* 延时2*MS(ms)                                */
/********************************/
void Delay(uchar MS)
        {
                uchar us,usn;
                while(MS!=0)
                        { usn = 4;
                                while(usn!=0)
                                        {
                                                us=0xf0;
                                                while (us!=0){us--;};
                                                usn--;
                                        }
                                MS--;
                        }
        }
void delayms(unsigned int z)      //延时子函数  z*1ms
{
        unsigned int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
//=========显示一行信息=====================
// DispAttr:显示属性,=1反黑显示;=0正常显示
//==========================================
void DispLine(uchar *MenuText,bit DispAttr)
{
        uchar j,X;
        //for (j=0;j         j=0;
        do{
                X = MenuText[j];
                j++;
                Putedot(X-0x20,DispAttr);                //ascii码表从0x20开始
        }while(MenuText[j]!=0x00);               
}

void DispFace(void)
{
        col=40;
        row=2;
        Hzflag=0;
        Putstr(STR1,7);        //第二行字符输出,12字节        
        col=16;
        row=6;
        Hzflag=1;
        Putstr(STR1,10);        //第四行字符输出,12字节        
        RestWatchdog();
}
/*============显示Root菜单=================*/
void DispMenu_Root(void)
{        //uchar i;
        col=64;
        row=0;
        for(cMenuTemp1=0;cMenuTemp1         {        //DispLine(Menu_Root,1);
                if(iMenuNextID==Menu_RootID[cMenuTemp1])
                        DispLine(&Menu_Root[cMenuTemp1][0],1);
                else
                        DispLine(&Menu_Root[cMenuTemp1][0],0);
                col=64;//竖行
                row+=2;//横行
         }
}
/*============显示Mode的子菜单=================*/
void DispMenu_Mode(void)
{        //uchar i;
        
        for(cMenuTemp1=0;cMenuTemp1         {        //DispLine(Menu_Root,1);
                if(iMenuNextID==Menu_ModeID[cMenuTemp1])
                        DispLine(&Menu_Mode[cMenuTemp1][0],1);
                else
                        DispLine(&Menu_Mode[cMenuTemp1][0],0);
                col=0;
                row+=2;
         }
}
/*============显示COM的子菜单=================*/
void DispMenu_COM(void)
{        //uchar i;
        
        for(cMenuTemp1=0;cMenuTemp1         {        //DispLine(Menu_Root,1);
                if(iMenuNextID==Menu_COMID[cMenuTemp1])
                        DispLine(&Menu_COM[cMenuTemp1][0],1);
                else
                        DispLine(&Menu_COM[cMenuTemp1][0],0);
                col=0;
                row+=2;
         }
}
/*============显示Selfcheck的子菜单=================*/
void DispMenu_Selfcheck(void)
{        //uchar i;
        for(cMenuTemp1=0;cMenuTemp1         {        //DispLine(Menu_Root,1);
                if(iMenuNextID==Menu_SelfcheckID[cMenuTemp1])
                        DispLine(&Menu_Selfcheck[cMenuTemp1][0],1);
                else
                        DispLine(&Menu_Selfcheck[cMenuTemp1][0],0);
                col=0;
                row+=2;
         }
}
/*============显示SystemSet的子菜单=================*/
void DispMenu_SystemSet(void)
{        //uchar i;
        for(cMenuTemp1=0;cMenuTemp1         {        //DispLine(Menu_Root,1);
                if(iMenuNextID==Menu_SystemSetID[cMenuTemp1])
                        DispLine(&Menu_SystemSet[cMenuTemp1][0],1);
                else
                        DispLine(&Menu_SystemSet[cMenuTemp1][0],0);
                col=0;
                row+=2;
         }
}
/*============显示Help的子菜单=================*/
void DispMenu_Experiment(void)
{        //uchar i;
        for(cMenuTemp1=0;cMenuTemp1         {        //DispLine(Menu_Root,1);
                if(iMenuNextID==Menu_ExperimentID[cMenuTemp1])
                        DispLine(&Menu_Experiment[cMenuTemp1][0],1);
                else
                        DispLine(&Menu_Experiment[cMenuTemp1][0],0);
                col=0;
                row+=2;
         }
}
/*****************************************************
-------从串行端口发送一字节数据------
*****************************************************/
void TranDataBy232(uchar d)
{
   CLK_DIV=0;   
   SBUF=d;
   while(TI==0) ;
   TI=0;
   CLK_DIV=2;
}
//========================================
/*void BaudrateChange(void)
{
//reset baudrate        
        TR1=0;
        TL1=0xfa;                    // 4800时TH1,TL1=0xfa
           TH1=0xfa;
        TR1=1;
}*/
/*****************************************************
-------从串行端口接收一字节数据,并存入UC0变量中------
*****************************************************/
void   RcvDataBy232(void)
{        uint i;
float uc0,Error;
           CLK_DIV=0;
    i=0;
    while(RI==0){
        i++;
        RestWatchdog();
        if(i>0x6ff)
        {
                        uc0=Error;
                        goto rete1;}   // 1fff
          RestWatchdog();
      }   
    uc0=SBUF;
rete1:  RI=0; CLK_DIV=2;
}

/*****************************************
-----------蜂鸣器鸣叫程序----------------
*****************************************/
void OpeningBeep(uchar OBN)
{
    uchar data i;
    for(i=0;i        Beep=0;
       Delay(30);
       Beep=1;
       Delay(30);

   }
}        
/*****************************************
-----------红灯闪烁程序----------------
*****************************************/
void FlashLed(uchar num)
{
    uchar data i;
    for(i=0;i        Redled=0;
       Delay(150);
       Redled=1;
       Delay(150);

   }
}        
/*******************************************
---------- 初始化串行口来多机通信 ---------
*******************************************/
void InitSBUF(void)     
{
   TMOD=0x11;           // T0,T1定义为方式1
   TL1=0xfd;            // 9600时TH1,TL1=0xfd,1200时TH1,TL1=0XE8
   TH1=0xfd;                         // 4800时TH1,TL1=0xfa,1200时TH1,TL1=0XE8
   PCON=0x0;
   SCON=0x50;           // 串行口为方式1,SM2=1,TB8=0,RB8=0
  // SM0=0;
   BRT=0xFD; //波特率9600
   AUXR=0X11; //使用独立波特率发生器
   //TR1=1;//        Timer1 feed dog   
   ET1=1;ES=0;  ET0=1;PT0=1;// ES=1; TR0=1;
   IT0=1;// SM2=1;   PS=1;
   RI=0;TI=0; EA=1;
}
/*
void CheckLED(void)
{        
         uchar m;
         for(m=0;m<2;m++)
         {
                 RedLED=1;
         Delay(100);
                 RedLED=0;
         Delay(100);

        }  
} */
//==========串口选择===============
/*void selectCOM(uchar com)//选择串口
{
    if(com==0){COM0;}
    else if(com==1){COM1;}
    else if(com==2){COM2;}
    else if(com==3){COM3;}
}*/

//=======Display "Press ESC for quit!"=============
/*void EscKeyInfo(void)
{
        row=6;col=20;
        Putstr(STR0,19);
}*/

//=================================
void MenuFunctionDemo2(void)//
{
        uint j=0;
        ESCFlag=0;
         row=6;col=20;
        Putstr(STR0,19); //press ESC FOR QUIT
        row=0;col=64;
        while(!ESCFlag)
        {
         key=Key_Press(0);        //按键扫描程序
         if(key==KEY_ESC) {ESCFlag=1;}
        }
}
void MenuFunctionDemo1(void)//
{
;
}

//==========统一施水(轮灌)模式=========
void ModeUniRate(void)
{         
        uint j=0;

        ESCFlag=0;Disflag=1;
        EX0=1;
         row=6;col=20;
        Putstr(STR0,19);
        row=0;col=44;
        Putstr("Rot-Rate Mode",13);        //第3行字符输出,2字节         
        row=2;col=16;
        DispLine("1  2  3",0);
        //TimeCounter=timerset[0];TimeCnt=TimeCounter;
        while(!ESCFlag)                //为调试方便加上扫描键盘语句,
        {                                        //正式工作时应将之去掉以保证施水时间的准确
                 key=Key_Press(0);
                 switch(key)
                 {
                          case RELAYNO1:
                                            Timer0init();TimeCounter=timerset[RELAYNO1-1];TimeCnt=TimeCounter;
                                        TR0=1;
                                        RELAY1=0;RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*RELAYNO1-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                        RELAY1=1;TimeFlag=0;
//                                        break;
                            case RELAYNO2:
                                            Timer0init();TimeCounter=timerset[RELAYNO2-1];TimeCnt=TimeCounter;
                                        Disflag=1;
                                        TR0=1;
                                        RELAY2=0;RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*RELAYNO2-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                        RELAY2=1;TimeFlag=0;
//                                        break;
                          case RELAYNO3:
                                            Timer0init();TimeCounter=timerset[RELAYNO3-1];TimeCnt=TimeCounter;
                                        Disflag=1;
                                        TR0=1;
                                        RELAY3=0;RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*RELAYNO3-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                        RELAY4=1;RELAY3=1;TimeFlag=0;
//                                        break;
                        case KEY_ESC:
                                 ESCFlag=1;
                                 Lcmclsline(4);
                                 break;
                        default:
                                        break;
                        }
                read_humidity();
                work_humidity();
                row=4;col=96;
                DispLine(ComBuf,0);        //显示温湿度
                }
        return;
}
//==========点灌模式=========
void ModeSelectRate(void)
{         
        uint j=0;
        ESCFlag=0;
        EX0=1;
         row=6;col=20;
        Putstr(STR0,19);
        row=0;col=44;
        Putstr("Sel-Rate Mode",13);        //第3行字符输出,2字节
        row=2;col=16;
        DispLine("1  2  3",0);
        while(!ESCFlag)                //为调试方便加上扫描键盘语句,
        {                                        //正式工作时应将之去掉以保证施水时间的准确
                 key=Key_Press(0);
                 switch(key)
                 {
                          case RELAYNO1:
                                            Timer0init();TimeCounter=timerset[RELAYNO1-1];TimeCnt=TimeCounter;
                                        Disflag=1;
                                        TR0=1;
                                        RELAY1=0;RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*key-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                        RELAY1=1;
                                        break;
                            case RELAYNO2:
                                            Timer0init();TimeCounter=timerset[RELAYNO2-1];TimeCnt=TimeCounter;
                                        Disflag=1;
                                        TR0=1;
                                        RELAY2=0;RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*key-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                        RELAY2=1;
                                        break;
                          case RELAYNO3:
                                            Timer0init();TimeCounter=timerset[RELAYNO3-1];TimeCnt=TimeCounter;
                                        Disflag=1;
                                        TR0=1;
                                        RELAY3=0;RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*key-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                        RELAY3=1;
                                        break;
                        case RELAYNO4:
                                            Timer0init();TimeCounter=timerset[RELAYNO4-1];TimeCnt=TimeCounter;
                                        Disflag=1;
                                        TR0=1;
                                        RELAY4=0;
                                        while(!TimeFlag)
                                                {row=4;col=(3*key-1)*8;
                                                DispLine(">",Disflag);
                                                Delay(200);Delay(200);
                                                Disflag=!Disflag;
                                                }
                                RELAY4=1;
                                break;
                        case KEY_ESC:
                                 ESCFlag=1;
                                 Lcmclsline(4);
                                 break;
                        default:
                                        break;
                        }
                        TimeFlag=0;RELAY4=1;
                        read_humidity();
                        work_humidity();
                        row=4;col=96;
                        DispLine(ComBuf,0);        //显示温湿度//read_temp();
                        Lcmclsline(4);
                }
        return;
}
//==========变量施水模式=========
void ModeVarialbleRate(void)
{         
        uchar i,j=0;
        ESCFlag=0;
        EX0=1;
         row=6;col=20;
        Putstr(STR0,19);
        TimeFlag=0;
        row=0;col=44;
        Putstr("Var-Rate Mode",13);        //第3行字符输出,2字节
        row=2;col=16;
        DispLine("1  2  3     H     T",0);
        Timer0init();
        TimeCounter=TimeCnt=timersendcontrol;TR0=1;//开始计时
        while(!ESCFlag)                //为调试方便加上扫描键盘语句,
        {                                        //正式工作时应将之去掉以保证施水时间的准确
                 key=Key_Press(0);
                 if(key==KEY_ESC) {ESCFlag=1;}
                if(key==KEY_OK) {TimeFlag=1;}
                 //read_humidity();
                //work_humidity();
                //row=4;col=96;
                //DispLine(ComBuf,0);        //显示温湿度
                while(TimeFlag)
                {
                        read_humidity();
                        work_humidity();
                        
                        row=4;col=96;
                        DispLine(ComBuf,0);        //显示温湿度
                        TimeFlag=0;
                        for(i=0;i<3;i++)
                        Lcmclsline(2*i+2);
                    row=2;col=16;
                DispLine("1  2  3  4",0);
                        work_adc();
                        int IncPIDCalc(int NextPoint);
                    TimeCalculate();
                    Timer0init();
               
//---------通讯完毕,准备施水-----以下内容暂注释,作测试土壤含水量用--------
                  
                 //=========开始施水==================
                //if(humidity                 if(soilmoist[0]                 {
                        Timer0init();
                        TimeCounter=timerset;TimeCnt=TimeCounter;
                        TR0=1;RELAY1=0;RELAY4=0;
                        while(!TimeFlag)
                                {row=4;col=(3*RELAYNO1-1)*8;DispLine(">",Disflag);//???????????????
                                Delay(200);Delay(200);
                                Disflag=!Disflag;}
                                RELAY1=1;TimeFlag=0;//TimeCounter=TimeCnt=timersendcontrol;TR0=1;        
               
            if(soilmoist[1]                            Timer0init();
                        TimeCounter=timerset;TimeCnt=TimeCounter;
                        TR0=1;RELAY2=0;
                        while(!TimeFlag)
                                {row=4;col=(3*RELAYNO2-1)*8;DispLine(">",Disflag);
                                Delay(200);Delay(200);
                                Disflag=!Disflag;}
                                RELAY2=1;TimeFlag=0;//TimeCounter=TimeCnt=timersendcontrol;TR0=1;        
               
                if(soilmoist[2]                            Timer0init();
                        TimeCounter=timerset;TimeCnt=TimeCounter;
                        TR0=1;RELAY3=0;
                        while(!TimeFlag)
                                {row=4;col=(3*RELAYNO3-1)*8;DispLine(">",Disflag);
                                Delay(200);Delay(200);
                                Disflag=!Disflag;}
                                RELAY3=1;RELAY4=1;TimeFlag=0;
                        //====第4组与第3组串联====
                        Timer0init();
                        TimeCounter=timerset;TimeCnt=TimeCounter;
                        TR0=1;RELAY4=0;
                        while(!TimeFlag)
                                {row=4;col=(3*RELAYNO4-1)*8;DispLine(">",Disflag);
                                Delay(200);Delay(200);
                                Disflag=!Disflag;}
                                RELAY4=1;TimeFlag=0;
                                TimeCounter=TimeCnt=timersendcontrol;TR0=1;        
                }
                Timer0init();*/
                //TimeCounter=TimeCnt=timersendcontrol;TR0=1;
                OpeningBeep(1);
                }

         }
}
//===========变量施水时间计算======
void TimeCalculate(void)
{
        uchar i;
        for(i=0;i<3;i++)
                //if(humidity                         //timerset=20+5*(HUMI_LOWERLIMIT-(int)humidity);
                        timerset=iIncpid/10;
                        //timerset=30;
//        else
                     timerset=0;
}
//==========water continuously experiment=========
void ExpAduALL(void)
{
        int i=7;
        uchar n;
        uint eepromtemp=1;
        ESCFlag=0;OKFlag=0;
         row=6;col=20;Putstr(STR0,19);
        row=0;col=48;Putstr("Adjust All  ",12);
        row=2;col=16;
        DispLine("T0 T1 T2 AT AH HL TL",0);
        for(n=0;n<7;n++) eeprom=0;
        while(!ESCFlag)
        {
                 OKFlag=0;
                 while(!OKFlag&&i)
                 {
                         key=Key_Press(0);        //按键扫描程序
                         switch(key)
                          {
                        case        KEY_ESC:        
                                //return;//ESCFlag=1;OKFlag=1;
                                break;
                        case        KEY_UP:                 
                                eepromtemp+=1;
                                break;
                        case        KEY_DOWN:
                                if(eepromtemp==0)
                                        eepromtemp=0;
                                else
                                        eepromtemp-=1;
                                break;
                        case        KEY_OK:
                                OKFlag=1;eeprom[7-i]=eepromtemp;i--;
                                if(i==0) {OKFlag=1;ESCFlag=1;
                                        row=0;col=48;Putstr("Adjust Ok   ",12);}
                                //return;
                                //ESCFlag=1;
                                break;
                        default:
                                break;
                          }
                        //TimeCounter=eepromtemp*300;TimeCnt=TimeCounter;         //设置为分钟
                        //timerset=eepromtemp*5;//TimeCnt=TimeCounter;             //设置为秒
                        n=sprintf(ComBuf,"EEPROM[%d]:%2d",7-i,eepromtemp);
                        row=4;col=48;
                        Putstr(ComBuf,n);        //第3行字符输出,2字节                                       
                }
        }
        eeprom_save();
}
//============water manually experiment===========
void ExpWaterManu(void)
{
        uint j=0;
        ESCFlag=0;
         row=6;col=20;
        Putstr(STR0,19);
        row=0;col=27;
        Putstr("Water Manually!!!",17);
        while(!ESCFlag)
        {
         key=Key_Press(0);
         if(key==KEY_ESC) {ESCFlag=1;}
         if(key==KEY_OK)   
         {        
                TR0=1;
                relay=0;
                while(!TimeFlag);
                relay=1;
                TimeFlag=0;
                Timer0init();
                 j++;        
                  sprintf(ComBuf,"%2d",j);
                 row=2;col=90;
                 Putstr(ComBuf,2);        //第3行字符输出,2字节                                       
         }
        }
}
//==========adjust the dht21 temperature parameters=========
void ExpDHT21_Temp(void)
        {        
        ESCFlag=0;CheckFlag=0;
         row=6;col=20;Putstr(STR0,19);
        row=0;col=48;Putstr("Adjust DHT21",12);
        while(!ESCFlag)
        {
         key=Key_Press(0);        //按键扫描程序
         switch(key)
          {
                case        KEY_ESC:        
                                ESCFlag=1;
                                break;
                case        KEY_UP:                 
                                adjt++;
                                break;
                case        KEY_DOWN:
                                //if(adjt==0)
                                //        adjt=0;
                                //else
                                        adjt--;
                                break;
                default:
                                break;
          }
        sprintf(ComBuf,"ADJT+:%2d",adjt);
        row=2;col=60;
        Putstr(ComBuf,8);        //第3行字符输出,2字节                                       
        }
        eeprom[3]=adjt;
        eeprom_save();
}
//==========ADJUST DHT21=========
void ExDHT21(void)
{        
        //uchar i;
        //uint eepromtemp=1;
        ESCFlag=0;CheckFlag=0;
         row=6;col=20;Putstr(STR0,19);
        row=0;col=48;Putstr("Adjust DHT21",12);
        while(!ESCFlag)
        {
         key=Key_Press(0);        //按键扫描程序
         switch(key)
          {
                case        KEY_ESC:        
                                ESCFlag=1;
                                break;
                case        KEY_UP:                 
                                adjh+=1;
                                break;
                case        KEY_DOWN:
                                if(adjh==0)
                                        adjh=0;
                                else
                                        adjh-=1;
                                break;
                default:
                                break;
          }
        sprintf(ComBuf,"ADJH+:%2d",adjh);
        row=2;col=60;
        Putstr(ComBuf,8);        //第3行字符输出,2字节                                       
        }
        eeprom[4]=adjh;
        eeprom_save();
}        
//==========键盘检测==================
void CheckKeyBoard(void)
{
        uint j;
        ESCFlag=0;
        row=6;col=20;
        Putstr(STR0,19);
        row=0;col=27;
        Putstr("KeyBoard:checking!",18);
        while(!ESCFlag)
        {
         key=Key_Press(1);
         j=        key;
//         ComBuf[0]=j/10+0x30;//将整数转换成ASCII码
//         ComBuf[1]=j%10+0x30;
         sprintf(ComBuf,"%2d",j);
         row=2;col=90;
         Putstr(ComBuf,2);        //第3行字符输出,2字节                                       
         if(key==KEY_ESC)  
         ESCFlag=1;
        }
}
//==========水分传感器检测=========
void CheckEEPROM(void)
{        uchar i;
        uint j;
        bit checkflag=1;
        ESCFlag=0;
        row=6;col=20;
        Putstr(STR0,19);
        row=0;col=27;
        DispLine("EEPROM:Checking!!",0);
        row=2;col=16;
        DispLine("T0 T1 T3 AT AH HL TL",0);
        while(!ESCFlag)
        {
         key=Key_Press(0);        //按键扫描程序
         switch(key)
          {
                case        KEY_ESC:        
                                ESCFlag=1;
                                break;
                case        KEY_OK:
                                for(i=0;i<7;i++)
                                 {
                                        eeprom=eeprom_read(0x0000+i);
                                        delayms(500);
                                 }
                                 for(i=0;i<7;i++)
                                  {        j=eeprom;
                                         sprintf(ComBuf,"%2d",j);
                                         row=4;col=24*i+16;
                                         DispLine(ComBuf,0);                                 
                                  }
                                break;
                default:
                                break;
          }
        }
}

//==========DHT21检测=========
void CheckDHT21(void)
{        //uchar i=0;
          //bit crflag=1;
        //CheckFlag=1;
//=========================================
        ESCFlag=0;
        row=6;col=20; //第4行输出提示信息
        Putstr(STR0,19);
        row=0;col=24;
        Putstr("DHT21:checking!!!",17);
        row=2;col=48;
        DispLine("H     T",0);
//===============================================
        while(!ESCFlag)
        {
                 key=Key_Press(0);
                 read_humidity();
                work_humidity();
                row=4;col=32;//CheckFlag=0;         //第3行字符输出
                 DispLine(ComBuf,0); //显示温湿度
                //SendData(ComBuf) ;  //发送到串口
                Delay1(20000);//Delay1(20000);//Delay(20000);
                if(key==KEY_ESC)  
                         ESCFlag=1;
        // }  
        }  
}

void SendData(uchar *a)
        {
                uchar i;
                do
                 {
                  TranDataBy232(a[i++]);
                 }while(a!=0x00);
                TranDataBy232(0x0a);
                TranDataBy232(0x0d);

        }               
//==========Set T0-T3 TIME=========
void SetWaterTime(void)
{        
        uchar i;
        uint eepromtemp=1;
        ESCFlag=0;CheckFlag=0;
         row=6;col=20;Putstr(STR0,19);
        row=0;col=27;Putstr("Set Water Time!",15);
        while(!ESCFlag)
        {
         key=Key_Press(0);        //按键扫描程序
         //if(key==KEY_OK) continue;
         switch(key)
          {
                case        KEY_ESC:        
                                //if(i==7)
                                ESCFlag=1;
                                break;
                case        KEY_UP:                 
                                eepromtemp+=1;
                                break;
                case        KEY_DOWN:
                                if(eepromtemp==1)
                                        eepromtemp=1;
                                else
                                        eepromtemp-=1;
                                break;
                //case        KEY_OK:
                //                continue;
                default:
                                break;
          }
        //TimeCounter=eepromtemp*300;TimeCnt=TimeCounter;         //设置为分钟
        //timerset=eepromtemp*5;//TimeCnt=TimeCounter;             //设置为秒
        sprintf(ComBuf,"Time:%3d",eepromtemp);
        row=2;col=60;
        Putstr(ComBuf,8);        //第3行字符输出,2字节                                       
        }
   for(i=0;i<3;i++)
                {timerset=eepromtemp*5;eeprom=timerset;}
   eeprom_save();
}
//==========Set Amount of Water=========
void SetTimeSep(void)
{        
        int i=3;
        uchar n;
        uint eepromtemp=5;
        ESCFlag=0;OKFlag=0;
         row=6;col=20;Putstr(STR0,19);
        row=0;col=27;Putstr("Set separately!",15);
        while(!ESCFlag)
        {
                 OKFlag=0;
                eepromtemp=5;
                 while(!OKFlag&&i)
                 {
                         key=Key_Press(0);        //按键扫描程序
                         switch(key)
                          {
                        case        KEY_ESC:        
                                return;//ESCFlag=1;OKFlag=1;
                                break;
                        case        KEY_UP:                 
                                eepromtemp+=1;
                                break;
                        case        KEY_DOWN:
                                if(eepromtemp==1)
                                        eepromtemp=1;
                                else
                                        eepromtemp-=1;
                                break;
                        case        KEY_OK:
                                OKFlag=1;timerset[3-i]=eepromtemp*5;i--;
                                if(i==0) {OKFlag=1;ESCFlag=1;return;}//ESCFlag=1;
                                break;
                        default:
                                break;
                          }
                        //TimeCounter=eepromtemp*300;TimeCnt=TimeCounter;         //设置为分钟
                        //timerset=eepromtemp*5;//TimeCnt=TimeCounter;             //设置为秒
                        n=sprintf(ComBuf,"Time%d:%3d",4-i,eepromtemp);
                        row=2;col=60;
                        Putstr(ComBuf,n);        //第3行字符输出,2字节                                       
                }
        }
        for(i=0;i<3;i++)
                eeprom=timerset;
        eeprom_save();
}
//============EEPROM初始化=====================
void eeprom_initialize(void)
{  uchar i;
        EA=0;
        //sector_erase(0x0000); //擦除第0扇区
        for(i=0;i<7;i++)
        {
                eeprom=eeprom_read(0x0000+i);
                delayms(500);        
        }
        EA=1;
        for(i=0;i<3;i++)
                timerset=eeprom;
        adjt=eeprom[3];
        adjh=eeprom[4];
}
//=============调整数据保存==========================
void eeprom_save(void)
{        uchar i;
        EA=0;
        sector_erase(0x0000); //擦除第0扇区
        //for(i=0;i<3;i++)
        //        eeprom=timerset;
        //eeprom[3]=adjt;
        //eeprom[4]=adjh;
        //eeprom[5]=0;
        for(i=0;i<7;i++)
        {
                eeprom_write(0x0000+i,eeprom);
                delayms(500);        
        }
//=========保存以后各变量赋新值===============
        for(i=0;i<3;i++)
                timerset=eeprom;
        adjt=eeprom[3];
        adjh=eeprom[4];
        EA=1;
}
//=======判断需要高亮显示菜单========
void JudgeHLight(void)
{
        Lcmcls();        //清屏
        col=0;row=0;//所有菜单皆从首行首列开始显示
        switch(iMenuNextID)
        {
        case        MENU_FACE:
                        DispFace();
                        break;
        case        MENU_ROOT:
                        DispFace();
                        break;
        case        MENU_Mode:
                        DispMenu_Root();
                        break;
        case        MENU_Mode_UNIFORMRATE:
        case        MENU_Mode_SELECT:
                        DispMenu_Mode();
                        break;
        case        MENU_Selfcheck:
                        DispMenu_Root();
                        break;
        case        MENU_Selfcheck_KBCHECK:
        case        MENU_Selfcheck_DHT21:
        case        MENU_Selfcheck_SENSORCHECK:
        case        MENU_Selfcheck_nRF905CHECK:
                        DispMenu_Selfcheck();
                        break;
        case        MENU_SystemSet:
                        DispMenu_Root();
                        break;
        case        MENU_SystemSet_COM:
                        DispMenu_SystemSet();
                        break;
        case        MENU_SystemSet_COM_BAUDRATE:
        case        MENU_SystemSet_COM_SELECOM:
                        DispMenu_COM();
                        break;
        case        MENU_SystemSet_INITIALAMOUNT:
                        DispMenu_SystemSet();
                        break;
        case        MENU_Experiment:
                        DispMenu_Root();
                        break;
        case        MENU_Experiment_DHT21_ADJUST:
        case        MENU_Experiment_SENSOR:
        case        MENU_Experiment_WATERMAN:
        case        MENU_Experiment_EMVopen:
                        DispMenu_Experiment();
                        break;
        default:
                        break;
        }
}

/****************************************************************
---------------键盘扫描程序,返回按下的键值代码----------------
-- 有键按下返回键值代码,无键按下返回0,有键但没松开返回0XFF --        
****************************************************************/
void Keyboard_out(void) interrupt 2
{
        if ((IntNum > 0) && (IntNum < 9))
        {
                KeyV = KeyV >> 1; //由于键盘数据是由低>>高,结合上一句所以右移一位
                if (Key_Data)
                        {KeyV = KeyV|0x80; }//当键盘数据线为1时最高位
        }
        IntNum++;
        while (!Key_CLK); //等待PS/2CLK拉高
        if (IntNum > 10)
        {
         IntNum = 0; //当中断11次后表示一帧数据接收完,清变量准备下一次接收
         BF = 1; //标识有字符输入完了
        // EA = 0; //关中断,等显示完后再开中断 (注:这里如果不用BF和关中断,
        //直接调用Decode(),则Decode()中所调用的所有函数都要申明为再入函数)
        }
}
uchar Key_Press(bit b) //按键扫描程序
//b=0/没键按下跳出;b=1/等待按键
{        bit waitflag=b;    //是否等待标志
    uint count=10000;  //当waitflag=0时,等待10000次
    EX1=1; //开中断,准备接收键值
        do
        {        count--;
                if (BF)                                                //BF=1,收到键码
                {  
                        retkey=Decode(KeyV);        //解码
                        if(validflag) {validflag=0;waitflag=0;count=0;OpeningBeep(1);return retkey;}
                }
                //else {EX1 = 0; retkey=0xff;}//关中断
                  else retkey=0xff;
        }//while(waitflag);
        while(waitflag||count!=0);
        return retkey;
}        
//void Decode(uchar ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,
uchar Decode(uchar ScanCode)
{                               //也就是说shift的通码+G的通码+shift的断码+G的断码
        uchar TempCyc;
        if (!Key_UP) //当键盘已松开时
        {
                   if(!numlockflag) //如NumLock键没按下
                   {
                        for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
                                if (UnShifted[TempCyc][0] == ScanCode)
                                //DisplayOneChar(DisNum 1 UnShifted[TempCyc][1]);
                                //R_S_Byte(UnShifted[TempCyc][1]); //ysm
                                {BF = 0;validflag=1;Key_UP = 1;
                                return UnShifted[TempCyc][1];}
                                //        DisNum++;
               }
                        else //按下NumLock键
                        {
                         for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
                         if (Shifted[TempCyc][0] == ScanCode)
                          { BF = 0;validflag=1; Key_UP = 1;
                            return Shifted[TempCyc][1];}
                        }
        }
        else  //键还未松开
        {
                switch (ScanCode) //当键松开时不处理断码,如G 34H F0H 34H 那么第二个34H不会被处理
                {
                        case 0x77 : // 右 SHIFT
                                numlockflag =!numlockflag;
                                break;
                        case 0xF0 : // 当收到0xF0,Key_UP置0表示断码开始
                                Key_UP = 0;
                        break;
                }
        }
        BF = 0; //标识字符处理完了
        return NoKeyPress;
}
void   RestWatchdog(void)
{
    _nop_();
    _nop_();
    _nop_();
}
/*======显示开机界面======================
void DispFirstmenu(void)
{
         col=0;
        row=2;
        Putstr(STR1,10);        //第二行字符输出,12字节        
        col=0;
        row=6;
        Hzflag=1;
        Putstr(STR1,12);        //第四行字符输出,12字节        
}         */
void Delay1(uint j)
    {   uchar i;
            for(;j>0;j--)
          {         
                for(i=0;i<27;i++);

          }
    }
void  Delay_10us(void)
{
        uchar i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}
//============获取数据============
void  COM(void)
    {
           uchar i;
       for(i=0;i<8;i++)         //循环8次  
            {
                       U8FLAG=2;  //设超时初值为2

                   while((!DHT21_DAT)&&U8FLAG++);//若DHT没准备好,则超时标记循环加1,加到0时退出循环
                        Delay_10us();//延时20秒
                        Delay_10us();
                //        Delay_10us();
                          U8temp=0;  //设此位为0
             if(DHT21_DAT) U8temp=1;        //若此时DHT管脚为1,则此位数据位1
                    U8FLAG=2;        //恢复超时标记,设为2
                 while((DHT21_DAT)&&U8FLAG++); //等待DHT准备完毕,并循环增加超时标记
                        
           //----------------------
                   //超时则跳出for循环                  
                    if(U8FLAG==1) break; //若超时标记此时为0,则已经超时,返回错误代码
                    //if(U8FLAG==0) err=1;         //ysm
                //判断数据位是0还是1         
                // 如果高电平高过预定0高电平值则数据位为 1
                   U8comdata<<=1; //数据变量左移1位
                      U8comdata|=U8temp;        //0 //获取当前数据加到数据变量中
             }//rof
           
        }
//----------------读取温湿度----------------------------------------------------
void read_humidity(void)
{
        DHT21_DAT=0; //主机拉低18ms
        Delay1(180);
        DHT21_DAT=1;         //DHT复位及初始化
//总线由上拉电阻拉高 主机延时20us
        Delay_10us();
        Delay_10us();
        Delay_10us();
        Delay_10us();
        //主机设为输入 判断从机响应信号
        DHT21_DAT=1;
         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
        if(!DHT21_DAT)                 //         
        {
                   U8FLAG=2;   
                 //判断从机是否发出 80us 的低电平响应信号是否结束         
                   while((!DHT21_DAT)&&U8FLAG++); // 等待DHT信号,并设超时标记
                   U8FLAG=2;
                //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
                   while((DHT21_DAT)&&U8FLAG++);         //等待DHT数据完毕信号,并设超时标记+
                 //数据接收状态                 
                   if(U8FLAG!=1) //若未超时
                {
                           COM();
                           U8RH_data_H_temp=U8comdata;//获取湿度高8位
                           COM();
                           U8RH_data_L_temp=U8comdata;        //获取湿度低8位
                           COM();
                           U8T_data_H_temp=U8comdata;  //获取温度高8位
                           COM();
                           U8T_data_L_temp=U8comdata; //获取温度低8位
                           COM();
                           U8checkdata_temp=U8comdata;//获取校验和数据
                           DHT21_DAT=1;         //释放DHT引脚
                         //数据校验
                          if(!err) //若无错误代码
                          {
                                  U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                                   if(U8temp==U8checkdata_temp)
                                   {          err=0;
                                     U8RH_data_H=U8RH_data_H_temp;
                                             U8RH_data_L=U8RH_data_L_temp;
                                          U8T_data_H=U8T_data_H_temp;
                                             U8T_data_L=U8T_data_L_temp;
                                             U8checkdata=U8checkdata_temp;
                                   }
                                   else
                                             err=2;
                        }
                   }//fi
           else
              err=3;
           //fi
        }
}
//----------------------------------------------温湿度处理----------------------------------------------------------
void work_humidity(void)
{
        uchar i=0;
//    float  xdata temp=0,humidity=0;
//        uint   xdata U16temp1=0, U16temp2=0;
        str[0]=U8RH_data_H;
        str[1]=U8RH_data_L;
        str[2]=U8T_data_H;
        str[3]=U8T_data_L;
        str[4]=U8checkdata;
        str[5]='\0';
        //SendData(str);  //发送到串口
        U16temp1=str[0]*256+str[1];humidity=U16temp1/10.0+adjh; //用于DHT21
        U16temp2=str[2]*256+str[3];temp=U16temp2/10.0+adjt;
        //humidity=(temper[0]*256+temper[1])/10.0;
        //temp        =(temper[2]*256+temper[3])/10.0;        
        sprintf(ComBuf,"%4.1f%% %4.1fC",humidity,temp);
        //SendData(ComBuf);  //发送到串口
        for(i=0;i<11;i++)
                {TranDataBy232(ComBuf);
                str=0;
                }
        TranDataBy232(0x0a);
        TranDataBy232(0x0d);
}
//-----------------------------ADC初始化-------------------------------------------------
void adc_initiate(void)
{
        AUXR1|=BYTE_BIT2;            //ADRJ=AUXR1.2=1,10位结果的高2位存放在ADC_RES1的低2位,低8位存放在ADC_RES中
        ADC_CONTR|=BYTE_BIT7;        //打开AD电源
        Delay1(500);            //开AD电源后要加延时,1ms以内就足够了     
        P1ASF|=BYTE_BIT4;                //设置P1.4为模拟功能
}

void adc(void)           //AD转换,返回结果
{
        int res=0;
        relay=0;
        Delay1(60000);
        ADC_CONTR=0xe4;        //ADC_POWER SPEED1 SPEED2 ADC_FLAG ADC_START CHS2 CHS1 CHS0
        Delay1(500);        //    1       1       1        0       0      1    0    0
        ADC_CONTR|=BYTE_BIT3;  //启动AD转换
    //delay(4);
        Delay1(100);//ysm
        while(ADC_CONTR&BYTE_BIT4==0);//判断AD转换是否完成
        ADC_CONTR&=0xe7;// ADC_FLAG=ADC_START=0
        //relay=1;
        //res=ADC_RESL+ADC_RES*256;
}
void work_adc(void)
{
        int i;        //temp
        int n=4,result=0;
        float xdata voltage=0;//,soilmoisture=0;
        for(i=0;i<1;i++)
        {
                adc();
                result=ADC_RESL+ADC_RES*256; //ad 转换结果
                voltage+=result/1024.0*5;         //电压换算         5: reference voltage
        }
//        voltage/=100.0;        
        if(voltage<0.1069)
                voltage=0.1069;
        // ============display voltage==================
        // display[3]=(int)(voltage);
        // display[2]=(int)((voltage-(int)(voltage))*10);
        // display[1]=(int)((voltage-(int)(voltage))*100)%10;
        // display[0]=(int)((voltage-(int)(voltage))*1000)%10;
        soilmoisture=0.05071*(voltage*1000-106.9); //土壤湿度标定公式
        //============display soilmoisture  %==================
        display[6]=(int)(soilmoisture);
        display[3]=display[6]/10;//十位
        display[2]=display[6]%10;//个位
        display[1]=(int)((soilmoisture-(int)(soilmoisture))*10);//小数点后1位
        display[0]=(int)((soilmoisture-(int)(soilmoisture))*100)%10;//小数点后2位

        //============display by sprintf  %==================
//        soilmoisture=12.3;        //调试数字
        sprintf(soil,"%4.1f",soilmoisture);
        for(i=0;i<4;i++)
                TranDataBy232(soil);
            txbuf[i+7]=soil;
            relay=1;
}
void IncPIDInit(void)
{
sptr->SumError = 0;
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
sptr->Proportion = 0; //比例常数 Proportional Const
sptr->Integral = 0; //积分常数Integral Const
sptr->Derivative = 0; //微分常数 Derivative Const
sptr->SetPoint = 0;
}
int IncPIDCalc(int NextPoint)
{
register int iError, iIncpid; //当前误差
sptr->SetPoint=100;
NextPoint=soil;
iError = sptr->SetPoint - NextPoint; //增量计算
iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
//存储误差,用于下次计算
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
//返回增量值
return(iIncpid);
}
/********************************/
//-------定义字符串数组-----------        
/********************************/

uchar code STR1[]={        //display chinese charactors
                0x80,0x81,0x82,0x83,0x84,0x85,
                0x86,0x87,0x88,0x89,0x8a,0x8B
                };
uchar code STR0[]={"Press ESC for quit!"};
        
/********************************/
/*  定义中文字库                */
/********************************/
uchar code Hzk1[]={                //自用汉字点阵码表1        
//   
//  宁
0,160,152,136,136,136,138,140,136,136,136,168,152,0,0,0,0,0,0,0,0,32,64,63,0,0,0,0,0,0,0,0,
//  夏
4,4,4,244,84,84,92,84,84,84,244,4,6,4,0,0,64,80,80,73,37,47,21,21,21,45,37,64,64,64,0,0,
//  大
32,32,32,32,32,32,254,32,32,32,32,32,48,32,0,0,64,64,32,16,8,6,1,2,4,8,16,32,96,32,0,0,
//  学
64,48,16,82,92,80,82,92,80,216,86,16,80,48,0,0,4,4,4,4,4,36,68,63,5,4,4,4,6,4,0,0,
//  机
32,32,160,254,160,32,0,252,4,4,254,4,0,0,0,0,4,2,1,127,64,33,16,15,0,0,63,64,64,120,0,0,
//  械
16,144,254,144,0,208,16,208,16,254,16,16,220,16,0,0,6,1,127,64,33,31,1,95,33,19,12,18,33,120,0,0,
//  工
0,8,8,8,8,8,248,8,8,8,8,12,8,0,0,0,32,32,32,32,32,32,63,32,32,32,32,32,48,32,0,0,
//  程
32,36,164,252,38,36,0,124,36,36,36,36,124,0,0,0,8,6,1,127,1,66,73,73,73,127,73,73,73,65,0,0,
//  学
64,48,16,82,92,80,82,92,80,216,86,16,80,48,0,0,4,4,4,4,4,36,68,63,5,4,4,4,6,4,0,0,
//  院
0,252,4,100,156,32,88,72,74,76,72,72,24,8,0,0,0,127,4,8,71,65,33,31,1,1,63,65,65,121,0,0

                  
};
uchar code Hzk2[]={                //自用汉字点阵码表1        
/*//  定
0,48,24,136,72,74,238,40,36,20,12,0,0,0,0,0,0,8,4,3,2,4,15,9,17,16,48,32,32,32,0,0,
//  时
0,248,72,4,252,0,160,32,32,255,16,16,16,0,0,0,0,7,2,2,7,0,0,1,16,63,0,0,0,0,0,0,*/
//  自
0,0,0,0,240,88,87,80,8,8,248,0,0,0,0,0,0,0,0,0,31,18,10,10,8,48,31,0,0,0,0,0,
//  动
64,64,72,200,104,36,36,0,32,254,16,16,240,0,0,0,0,4,6,5,2,18,11,4,3,8,16,12,3,0,0,0,
//  灌
16,34,132,0,52,212,119,156,130,222,107,90,0,0,0,0,8,14,1,2,1,63,8,10,10,15,11,9,8,0,0,0,
//  溉
16,34,132,0,252,82,190,0,116,196,190,34,34,0,0,0,4,3,0,4,3,10,5,2,1,0,7,8,8,14,0,0,
//  控
0,32,32,255,144,32,48,144,82,12,40,72,24,16,0,0,2,2,17,31,0,16,17,18,18,15,9,8,8,0,0,0,
//  制
64,96,92,80,254,168,168,168,0,240,0,0,255,0,0,0,0,0,7,1,31,0,4,7,0,1,8,16,31,0,0,0,
//  器
0,0,70,90,202,78,48,98,174,169,21,19,0,0,0,0,0,2,26,21,20,28,0,12,20,20,21,13,1,0,0,0

/*/  草
0,4,4,4,245,174,170,170,143,122,2,2,0,0,0,0,4,4,4,4,4,4,63,2,2,2,2,2,2,0,0,0,
//  坪
0,32,32,254,144,128,180,132,252,66,98,88,64,64,0,0,2,2,1,0,0,0,0,0,31,0,0,0,0,0,0,0,
//  变
0,0,72,40,8,124,133,190,132,20,36,4,0,0,0,0,0,0,16,17,11,5,4,10,9,24,16,16,16,0,0,0,
//  量
0,32,32,162,174,170,173,109,89,215,16,16,16,16,0,0,0,0,32,32,43,42,63,43,42,17,16,16,0,0,0,0,
//  灌
16,34,132,0,52,212,119,156,130,222,107,90,0,0,0,0,8,14,1,2,1,63,8,10,10,15,11,9,8,0,0,0,
//  溉
16,34,132,0,252,82,190,0,116,196,190,34,34,0,0,0,4,3,0,4,3,10,5,2,1,0,7,8,8,14,0,0,
//  控
0,32,32,255,144,32,48,144,82,12,40,72,24,16,0,0,2,2,17,31,0,16,17,18,18,15,9,8,8,0,0,0,
//  制
64,96,92,80,254,168,168,168,0,240,0,0,255,0,0,0,0,0,7,1,31,0,4,7,0,1,8,16,31,0,0,0,
//  器
0,0,70,90,202,78,48,98,174,169,21,19,0,0,0,0,0,2,26,21,20,28,0,12,20,20,21,13,1,0,0,0
  */
                  
};
/****************************************/
/* 定义ASCII字库8列*16行                */
/****************************************/

uchar code Ezk[]={
/*-文字: --0x20        */
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:!--0x21        */
         0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00,
/*-文字:"--0x22        */
         0x00,0x08,0x04,0x02,0x08,0x04,0x02,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:#--0x23        */
         0x40,0x40,0xF8,0x40,0x40,0xF8,0x40,0x00,
         0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,
/*-文字:$--0x24        */
         0x00,0x70,0x88,0xFC,0x08,0x08,0x30,0x00,
         0x00,0x1C,0x20,0xFF,0x21,0x22,0x1C,0x00,
/*-文字:%--0x25        */
         0xF0,0x08,0xF0,0x80,0x70,0x08,0x00,0x00,
         0x00,0x31,0x0E,0x01,0x1E,0x21,0x1E,0x00,
/*-文字:&--0x26        */
         0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,
         0x1E,0x21,0x23,0x24,0x18,0x16,0x20,0x00,
/*-文字:'--0x27        */
         0x20,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:(--0x28        */
         0x00,0x00,0x00,0x00,0xC0,0x30,0x08,0x04,
         0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,
/*-文字--0x29        */
         0x04,0x08,0x30,0xC0,0x00,0x00,0x00,0x00,
         0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,
/*-文字:*--0x2a        */
         0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
         0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,
/*-文字:+--0x2b        */
         0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,
         0x01,0x01,0x01,0x0F,0x01,0x01,0x01,0x00,
/*-文字:,--0x2c        */
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x80,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:---0x2d        */
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
/*-文字:.--0x2e        */
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:/--ox2f        */
         0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x04,
         0x00,0x40,0x30,0x0C,0x03,0x00,0x00,0x00,
/*-文字:0--0x30        */
         0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
         0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-文字:1--0x31        */
         0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
         0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-文字:2--0x32        */
         0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
         0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-文字:3--0x33        */
         0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
         0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-文字:4--0x34        */
         0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
         0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-文字:5--0x35        */
         0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
         0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-文字:6--0x36        */
         0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
         0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-文字:7--0x37        */
         0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:8--0x38        */
         0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
         0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-文字:9--0x39        */
         0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
         0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*-文字::--        */
         0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,
         0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
/*-文字:/--        */
         0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
         0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,
/*-文字:<--        */
         0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,
         0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,
/*-文字:=--        */
         0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
         0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
/*-文字:>--        */
         0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,
         0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,
/*-文字:?--        */
         0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,
         0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,
/*-文字:@--        */
         0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,
         0x07,0x18,0x27,0x28,0x27,0x28,0x07,0x00,
/*-文字:A--        */
         0x00,0x00,0xE0,0x18,0x18,0xE0,0x00,0x00,
         0x30,0x0F,0x04,0x04,0x04,0x04,0x0F,0x30,
/*-文字:B--        */
         0xF8,0x08,0x08,0x08,0x08,0x90,0x60,0x00,
         0x3F,0x21,0x21,0x21,0x21,0x12,0x0C,0x00,
/*-文字:C--        */
         0xE0,0x10,0x08,0x08,0x08,0x10,0x60,0x00,
         0x0F,0x10,0x20,0x20,0x20,0x10,0x0C,0x00,
/*-文字:D--        */
         0xF8,0x08,0x08,0x08,0x08,0x10,0xE0,0x00,
         0x3F,0x20,0x20,0x20,0x20,0x10,0x0F,0x00,
/*-文字:E--        */
         0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,
         0x00,0x3F,0x21,0x21,0x21,0x21,0x20,0x00,
/*-文字:F--        */
         0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
         0x3F,0x01,0x01,0x01,0x01,0x01,0x00,0x00,
/*-文字:G--        */
         0xE0,0x10,0x08,0x08,0x08,0x10,0x60,0x00,
         0x0F,0x10,0x20,0x20,0x21,0x11,0x3F,0x00,
/*-文字:H--        */
         0x00,0xF8,0x00,0x00,0x00,0x00,0xF8,0x00,
         0x00,0x3F,0x01,0x01,0x01,0x01,0x3F,0x00,
/*-文字:I--        */
         0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:J--        */
         0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,
         0x00,0x1C,0x20,0x20,0x20,0x20,0x1F,0x00,
/*-文字:K--        */
         0x00,0xF8,0x00,0x80,0x40,0x20,0x10,0x08,
         0x00,0x3F,0x01,0x00,0x03,0x04,0x18,0x20,
/*-文字:L--        */
         0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
/*-文字:M--        */
         0xF8,0xE0,0x00,0x00,0x00,0xE0,0xF8,0x00,
         0x3F,0x00,0x0F,0x30,0x0F,0x00,0x3F,0x00,
/*-文字:N--        */
         0x00,0xF8,0x30,0xC0,0x00,0x00,0xF8,0x00,
         0x00,0x3F,0x00,0x01,0x06,0x18,0x3F,0x00,
/*-文字:O--        */
         0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
         0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-文字:P--        */
         0xF8,0x08,0x08,0x08,0x08,0x10,0xE0,0x00,
         0x3F,0x02,0x02,0x02,0x02,0x01,0x00,0x00,
/*-文字:Q--        */
         0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
         0x00,0x0F,0x10,0x20,0x2C,0x10,0x2F,0x00,
/*-文字:R--        */
         0xF8,0x08,0x08,0x08,0x08,0x90,0x60,0x00,
         0x3F,0x01,0x01,0x01,0x07,0x18,0x20,0x00,
/*-文字:S--        */
         0x60,0x90,0x88,0x08,0x08,0x10,0x20,0x00,
         0x0C,0x10,0x20,0x21,0x21,0x12,0x0C,0x00,
/*-文字:T--        */
         0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:U--        */
         0xF8,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,
         0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,
/*-文字:V--        */
         0x18,0xE0,0x00,0x00,0x00,0xE0,0x18,0x00,
         0x00,0x01,0x0E,0x30,0x0E,0x01,0x00,0x00,
/*-文字:W--        */
         0xF8,0x00,0xC0,0x38,0xC0,0x00,0xF8,0x00,
         0x03,0x3C,0x03,0x00,0x03,0x3C,0x03,0x00,
/*-文字:X--        */
         0x08,0x30,0xC0,0x00,0xC0,0x30,0x08,0x00,
         0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x00,
/*-文字:Y--        */
         0x08,0x30,0xC0,0x00,0xC0,0x30,0x08,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:Z--        */
         0x08,0x08,0x08,0x08,0xC8,0x28,0x18,0x00,
         0x30,0x2C,0x22,0x21,0x20,0x20,0x20,0x00,
/*-文字:{--        */
         0x00,0x00,0x00,0x80,0x7E,0x02,0x00,0x00,
         0x00,0x00,0x00,0x00,0x3F,0x20,0x00,0x00,
/*-文字:\--        */
         0x00,0x08,0x70,0x80,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x01,0x0E,0x30,0xC0,0x00,
/*-文字:}--        */
         0x00,0x02,0x7E,0x80,0x00,0x00,0x00,0x00,
         0x00,0x20,0x3F,0x00,0x00,0x00,0x00,0x00,
/*-文字:^--        */
         0x00,0x08,0x04,0x02,0x02,0x04,0x08,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:_--        */
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
/*-文字:`--        */
         0x00,0x00,0x02,0x06,0x04,0x08,0x00,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-文字:a--        */
         0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
         0x00,0x19,0x24,0x24,0x24,0x14,0x3F,0x00,
/*-文字:b--        */
         0x00,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
         0x00,0x3F,0x11,0x20,0x20,0x20,0x1F,0x00,
/*-文字:c--        */
         0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
         0x0E,0x11,0x20,0x20,0x20,0x20,0x11,0x00,
/*-文字:d--        */
         0x00,0x00,0x80,0x80,0x80,0x00,0xF8,0x00,
         0x00,0x1F,0x20,0x20,0x20,0x11,0x3F,0x00,
/*-文字:e--        */
         0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,
         0x0E,0x15,0x24,0x24,0x24,0x25,0x16,0x00,
/*-文字:f--        */
         0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:g--        */
         0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
         0x40,0xB7,0xA8,0xA8,0xA8,0xA7,0x40,0x00,
/*-文字:h--        */
         0x00,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
         0x00,0x3F,0x01,0x00,0x00,0x00,0x3F,0x00,
/*-文字:i--        */
         0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:j--        */
         0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,
         0x00,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,
/*-文字:k--        */
         0x00,0xF8,0x00,0x00,0x00,0x80,0x00,0x00,
         0x00,0x3F,0x04,0x02,0x0D,0x10,0x20,0x00,
/*-文字:l--        */
         0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-文字:m--        */
         0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
         0x3F,0x00,0x00,0x3F,0x00,0x00,0x3F,0x00,
/*-文字:n--        */
         0x00,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
         0x00,0x3F,0x01,0x00,0x00,0x00,0x3F,0x00,
/*-文字:o--        */
         0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,
         0x0E,0x11,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-文字:p--        */
         0x00,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
         0x00,0xFF,0x11,0x20,0x20,0x20,0x1F,0x00,
/*-文字:q--        */
         0x00,0x00,0x80,0x80,0x80,0x00,0x80,0x00,
         0x00,0x1F,0x20,0x20,0x20,0x11,0xFF,0x00,
/*-文字:r--        */
         0x00,0x00,0x80,0x00,0x00,0x80,0x80,0x00,
         0x00,0x00,0x3F,0x01,0x01,0x00,0x00,0x00,
/*-文字:s--        */
         0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
         0x00,0x13,0x24,0x24,0x24,0x24,0x19,0x00,
/*-文字:t--        */
         0x00,0x80,0x80,0xE0,0x80,0x80,0x80,0x00,
         0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x00,
/*-文字:u--        */
         0x00,0x80,0x00,0x00,0x00,0x00,0x80,0x00,
         0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x00,
/*-文字:v--        */
         0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
         0x00,0x07,0x18,0x20,0x18,0x07,0x00,0x00,
/*-文字:w--        */
         0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,
         0x0F,0x30,0x0E,0x01,0x0E,0x30,0x0F,0x00,
/*-文字:x--        */
         0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
         0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x00,
/*-文字:y--        */
         0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
         0x00,0x87,0x98,0x60,0x18,0x07,0x00,0x00,
/*-文字:z--        */
         0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
         0x00,0x30,0x28,0x24,0x22,0x21,0x20,0x00,
/*-文字:{--        */
         0x00,0x00,0x00,0x80,0x7E,0x02,0x00,0x00,
         0x00,0x00,0x00,0x00,0x3F,0x20,0x00,0x00,
/*-文字:|--        */
         0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
         0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
/*-文字:}--        */
         0x00,0x02,0x7E,0x80,0x00,0x00,0x00,0x00,
         0x00,0x20,0x3F,0x00,0x00,0x00,0x00,0x00,
/*-文字:~--        */
         0x00,0x06,0x01,0x01,0x06,0x04,0x03,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

//

//************************************************************************
//* Menu Struct:                                                         *
//************************************************************************
//  First Bmp--------------------->(MenuID=0)                             
//        Root-------------------------->(MenuID=1)
//   ---+                                                                 
//      |Mode--------------------->(MenuID=2)                             
//      +---+                                                            
//      |   |Uniform  Rate-------->(MenuID=3)                             
//      |   +--------------                                               
//      |   |Select   Rate-------->(MenuID=4)                             
//      |   +--------------                                               
//      |Selfcheck---------------->(MenuID=5)                             
//      +---+                                                            
//      |   |Keyboard Check------->(MenuID=6)                             
//      |   +--------------                                               
//      |   |DHT21 Check--------->(MenuID=7)                             
//      |   +--------------                                               
//      |   |SENSOR Check--------->(MenuID=8)                             
//      |   +--------------                                               
//      |   |nRF905  Check--------->(MenuID=9)                             
//      |   +--------------                                               
//      |System Set--------------->(MenuID=10)                           
//      +---+                                                            
//      |   |COM------------------>(MenuID=11)                           
//      |   +---+                                                         
//      |   |   |BAUDRATE--------->(MenuID=12)                           
//      |   |   +--------------                                          
//      |   |   |Select COM------->(MenuID=13) VARIABLE RATE                           
//      |   |   +--------------                                          
//      |   |Set Time------------->(MenuID=14)                           
//      |   +--------------                                               
//      |Help--------------------->(MenuID=15)                                       
//      +---+                                                            
//         |Temp Experiment------->(MenuID=16)                                          
//         +--------------                                                
//         |Sensor Experiment----->(MenuID=17)                                    
//         +--------------                                                
//         |Water Manually-------->(MenuID=18)                                          
//         +--------------                                                
//         |Other Experiment------>(MenuID=19)                                    
//         +--------------                                                
//************************************************************************
//CurMenuID=本菜单ID
//MaxMenuItem=同级菜单最大项数
//OkMenuID=子菜单层所对应的菜单ID,ID=99为菜单已经到底了
//EscMenuID=父菜单层所对应的菜单ID,ID=99为菜单已经到顶了
//DownMenuID=弟菜单层所对应的菜单ID,ID=99为菜单是独生子
//UpMenuID=兄菜单层所对应的菜单ID,ID=99为菜单是独生子
//CurFunction=本菜单所对应的菜单函数指针
//KeyTabStruct code KeyTab[MAX_KEYTABSTRUCT_NUM]=
KeyTabStruct xdata KeyTab[MAX_KEYTABSTRUCT_NUM]=        
        {
                //CurMenuID,         MaxMenuItem,OkMenuID,                                                EscMenuID,                                DownMenuID,                                                UpMenuID,                                                CurFunction
{MENU_FACE,                                                0,        MENU_ROOT,                                                99,                                                99,                                                                99,                                                                *MenuFunctionDemo1},
{MENU_ROOT,                                                4,        MENU_Mode,                                                MENU_FACE,                            99,                                                                99,                                                                 *MenuFunctionDemo1},
{MENU_Mode,                                                2,        MENU_Mode_UNIFORMRATE,                        MENU_ROOT,                                MENU_Selfcheck,                                    MENU_Experiment,                                *MenuFunctionDemo1},
{MENU_Mode_UNIFORMRATE,                        0,        99,                                                                MENU_Mode,                                MENU_Mode_SELECT,                                MENU_Mode_SELECT,                                *ModeVarialbleRate},
{MENU_Mode_SELECT,                                0,        99,                                                                MENU_Mode,                                MENU_Mode_UNIFORMRATE,                        MENU_Mode_UNIFORMRATE,                        *ModeUniRate},
{MENU_Selfcheck,                                4,        MENU_Selfcheck_KBCHECK,                        MENU_ROOT,                                MENU_SystemSet,                        MENU_Mode,                                                *MenuFunctionDemo1},
{MENU_Selfcheck_KBCHECK,                0,        99,                                                                MENU_Selfcheck,                        MENU_Selfcheck_DHT21,                        MENU_Selfcheck_nRF905CHECK,                *CheckKeyBoard},
{MENU_Selfcheck_DHT21,                    0,        99,                                                                MENU_Selfcheck,                        MENU_Selfcheck_SENSORCHECK,                MENU_Selfcheck_KBCHECK,                        *CheckDHT21},
{MENU_Selfcheck_SENSORCHECK,        0,        99,                                                                MENU_Selfcheck,                        MENU_Selfcheck_nRF905CHECK,                MENU_Selfcheck_DHT21,                        *CheckEEPROM},
{MENU_Selfcheck_nRF905CHECK,        0,        99,                                                                MENU_Selfcheck,                        MENU_Selfcheck_KBCHECK,                        MENU_Selfcheck_SENSORCHECK,                *MenuFunctionDemo2},
{MENU_SystemSet,                                2,        MENU_SystemSet_COM,                                MENU_ROOT,                                MENU_Experiment,                      MENU_Selfcheck,                                        *MenuFunctionDemo1},
{MENU_SystemSet_COM,                        2,        MENU_SystemSet_COM_BAUDRATE,        MENU_SystemSet,                        MENU_SystemSet_INITIALAMOUNT,        MENU_SystemSet_INITIALAMOUNT,        *MenuFunctionDemo1},
{MENU_SystemSet_COM_BAUDRATE,        0,        99,                                                                MENU_SystemSet_COM,                MENU_SystemSet_COM_SELECOM,                MENU_SystemSet_COM_SELECOM,                *SetTimeSep},
{MENU_SystemSet_COM_SELECOM,          0,        99,                                                                MENU_SystemSet_COM,                MENU_SystemSet_COM_BAUDRATE,        MENU_SystemSet_COM_BAUDRATE,        *ModeSelectRate},
{MENU_SystemSet_INITIALAMOUNT,        0,        99,                                                                MENU_SystemSet,                        MENU_SystemSet_COM,                                MENU_SystemSet_COM,                                *SetWaterTime},
{MENU_Experiment,                                4,        MENU_Experiment_DHT21_ADJUST,        MENU_ROOT,                                MENU_Mode,                                         MENU_SystemSet,                                        *MenuFunctionDemo1},
{MENU_Experiment_DHT21_ADJUST,        0,        99,                                                                MENU_Experiment,                MENU_Experiment_SENSOR,                        MENU_Experiment_EMVopen,                *ExDHT21},
{MENU_Experiment_SENSOR,                0,        99,                                                                MENU_Experiment,                MENU_Experiment_WATERMAN,                MENU_Experiment_DHT21_ADJUST,        *ExpAduALL},
{MENU_Experiment_WATERMAN,                0,        99,                                                                MENU_Experiment,                MENU_Experiment_EMVopen,                MENU_Experiment_SENSOR,                        *ExpWaterManu},
{MENU_Experiment_EMVopen,                0,        99,                                                                MENU_Experiment,                MENU_Experiment_DHT21_ADJUST,        MENU_Experiment_WATERMAN,                *ExpDHT21_Temp}
        };
















QQ截图20160719153700.png (5.29 KB, 下载次数: 0)

QQ截图20160719153700.png
此帖出自51单片机论坛

最新回复

我是来看评论的……  详情 回复 发表于 2016-7-20 17:05
点赞 关注
 

回复
举报

27

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
求大神们帮忙看看,初学,这么长的程序对我有难度
此帖出自51单片机论坛

点评

编译器都告诉你了,看1215行...  详情 回复 发表于 2016-7-19 16:53
 
 
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 

>> 如何提问更容易获得答案


此帖出自51单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

4
 
maxiaoling 发表于 2016-7-19 15:48
求大神们帮忙看看,初学,这么长的程序对我有难度

编译器都告诉你了,看1215行...
此帖出自51单片机论坛
 
 
 

回复

1158

帖子

2

TA的资源

版主

5
 
这样子提问不大好哈,最好是能简明扼要的讲清你的问题
此帖出自51单片机论坛
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

6
 
EETUX 发表于 2016-7-19 16:53
编译器都告诉你了,看1215行...

看了,但是怎么改还是不对,所以想看看大家怎么改的
此帖出自51单片机论坛
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

7
 
michael_llh 发表于 2016-7-19 17:14
这样子提问不大好哈,最好是能简明扼要的讲清你的问题

因为那个错误我怎么改好像都不对,所以希望大家大家帮我改下,能生成hex文件就好
此帖出自51单片机论坛

点评

那你这通篇代码黏进来,换做是你自己,你会有耐心看下去吗  详情 回复 发表于 2016-7-19 20:07
 
 
 

回复

1158

帖子

2

TA的资源

版主

8
 
maxiaoling 发表于 2016-7-19 19:41
因为那个错误我怎么改好像都不对,所以希望大家大家帮我改下,能生成hex文件就好

那你这通篇代码黏进来,换做是你自己,你会有耐心看下去吗
此帖出自51单片机论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

9
 
这么长的代码,一行一行的看,分析要多久?注释掉一些东西,精简一下,这是一种比较基本的语法错误。大括号或者其他什么的问题。出问题地方,前后多看看,调用关系什么的。也注意一下。
此帖出自51单片机论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

10
 
应该将出错的行标出来,以后大家前后对照分析。否则要大家自己去找1215行,有这个可能吗?
此帖出自51单片机论坛
 
 
 

回复

2168

帖子

8

TA的资源

五彩晶圆(初级)

11
 
不是提示1215行有语法错误么,尝试把它注释了再看看?
还有代码太长了,大家时间宝贵。像语法错误这种,还是多看C语言基础。这是基本功
此帖出自51单片机论坛
 
个人签名坐而言不如起而行
 
 

回复

1298

帖子

0

TA的资源

纯净的硅(高级)

12
 
我是来看评论的……
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表