|
/*********************************************************
-- 程序名称:温室定(变)量灌溉控制器:
-- 功 能: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}
};
|
|