|
发表于 2006-12-17 11:32:37
|
显示全部楼层
我在2000年做了一个使用18B20的程序,去年又做了一个温度控制的项目,现将程序发上来与大家分享,不过我正在学习AVR还没有AVR开发能力,所以程序是c51的.有兴趣的可以改为GCC.
//温度读取(18B20)、LCD显示(128*64)
//时间 2005.12.4
//LCD改用12864R,具有4段时间
//增加74ls574控制继电器,所有元件放在电路板上。//增加看门狗复位找回功能//增加74hc245
#pragma DEBUG CODE
#include <c:\C51\INC\reg52.h> /* define 8052 registers */
//********************************
#define SDA P10
#define SCL P11
//********************************
#define dat_1820 P12
#define S2 P13
#define S3 P14
//*******************************
#define RS P37 //LCD指令/数据
#define RW P15 //LCD读/写
#define E1 P31 //LCD复位
#define EE P30 //LCD复位
#define BF P07
//****************************
#define KEY1 P20
#define KEY2 P21
#define KEY3 P22
#define KEY4 P33
#define KEY5 P34
#define No_warter P36
//***************************
#define SPEAK P17
#define MAX813_WDI P16
typedef unsigned char uchar;
uchar code num_MODE[10] =
{
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39
};
uchar code setup[46] =
{
0xca,0xb1,0xbc,0xe4,0xb5,0xf7,0xd5,0xfb,0xc7,0xeb,0xb0,0xb4,0xa3,0xad,0xbc,0xfc,
0xb2,0xce,0xca,0xfd,0xc9,0xe8,0xd6,0xc3,0xc7,0xeb,0xb0,0xb4,0xa3,0xab,0xbc,0xfc,
0xcd,0xcb,0xb3,0xf6,0xc7,0xeb,0xb0,0xb4,0xc9,0xe8,0xd6,0xc3,0xbc,0xfc
};
uchar code stnum[32]={1,0,7,0,35,50,25,30,10,0,11,0,35,50,25,30,13,0,14,0,35,50,25,30,17,0,21,0,35,50,25,30};
uchar code dot[4]={0x00,0x0C,0x0C,0x00,};
uchar code buffer1[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
//*********************************************************************************
void dl_us(unsigned int count);
void dl_ms(unsigned int count);
//*********************************************************************************
uchar rst(void);
bit rdbit(void);
void wtbyte(uchar dat);
void tempst(void);
uchar rdtemp(void);
void FIR_mrd1820(void);
uchar rst2(void);
bit rdbit2(void);
void wtbyte2(uchar dat);
void tempst2(void);
uchar rdtemp2(void);
void FIR_mrd18202(void);
//**************************************
void BUZER_SUB(void);
void ext_1(void); // interrupt 2;
void Timer_0(void); // interrupt 1;
void SCAN_KEY(void);
//******************************************
void revdata(void);
void senddata(void);
void load_time(void);
void load_temp(void);
void WT_TEMP(uchar fstadrm);
void WT_CHIP(uchar fstadrt);
void RD_CHIP(uchar fstadrp);
void WT_8583_TM(void); //;向8583_RAM区中写特殊码
void RD_TM(void); //特殊码
void RAM_TM(void);
void initial();
uchar Duan_CNT, B_DAY;
uchar BK_ADDR;
bit ack,F_rise;
bit RL1,RL2,RL3,RL4,RL5;
bdata uchar com_data=0,l;
sbit cos_bit=com_data^7;
sbit low_bit=com_data^0;
uchar slvadr,subadr,bytecnt;
uchar senrev[6]={0,0,0,0,0,0};
uchar temp[4],shift_cnt;
//*****************************************
void LCDBUSY (void); //判断LCD是否正在工作
void WRCOM (char showctl);
void WRDATA (char showctl);
void Lcd_init(void); //LCD初始化
void Clear_LCD(void);
void display1(void);
void display2(void);
void display3(void);
void display4(void);
void fd(void);
void tov(void);
//***************************************************
uchar buff_last;
uchar idata TIME_REAL_h; //实时时钟 小时 BCD码 23点
uchar idata TIME_REAL_m; //实时时钟 分钟 BCD码 59分
uchar idata Temp_onw,Temp_offw;
uchar idata Temp_onr,Temp_offr;
unsigned int idata Time_on,Time_off;
bit TEMP_SIGN,F_control,F_hand,F_working,F_work_off;
//************************************
unsigned int B_T1s=400,B_Txs=10;
bit F_T1s,F_Txs,F_flash;
bit F_new,F_cros_disp;
uchar idata RAM_i,segm;
uchar data buffer[8];
void Duan_set(void);
void SCAN_KEY(void);
void control_sub(void);
void contronl(void);
void pump_on(void);
void pump_off(void);
void QDJCZ(void);
//*******************************************
void main ()
{
P26=1;
P31=0;
B_Txs=10;
//Duan_set();
F_new=0;
P0=0X00;
QDJCZ();
RL1=RL2=RL3=RL4=RL5=0;
F_working=0;
F_work_off=1;
Lcd_init();
initial();
FIR_mrd1820();
FIR_mrd18202();
P31=1;
display2();
//*********************************************************
for( RAM_i=0;RAM_i<6;RAM_i++)
{ RD_CHIP((0x70+RAM_i));
if(senrev[0]!=0XAA)
{ WT_8583_TM();
for( l=0;l<32;l++)
{
senrev[0]=stnum[l];
WT_CHIP(0x20+l);
}
}
}
RAM_i=0;
dl_us(10);
BUZER_SUB();
//****************************************************************
while(1)
{
MAX813_WDI=0;
//************************
if(KEY1==0)
{F_hand=~F_hand;
Clear_LCD();
if(F_hand)
{F_new=0;
Duan_set();// Temp_onw;Temp_offw;Temp_onr;Temp_offr;//Time_on,Time_off;
}
else
{
Temp_onr=Temp_offr=Time_on=Time_off=Temp_offw=0;
while(!F_work_off)//如果未关机则执行关机
{ MAX813_WDI=0;
FIR_mrd1820();
FIR_mrd18202();
display2();
pump_off();
}
}
dl_ms(20);
while(KEY1==0) MAX813_WDI=0;
dl_ms(20);
}
//***********KEY1********************
if(F_hand)
{
control_sub();
MAX813_WDI=0;
FIR_mrd1820();
FIR_mrd18202();
tov() ;
display2();
}
else
{
//*************防冻处理*****************
fd();
//***************************************
MAX813_WDI=0;
display2();
dl_us(10);
}
//Clear_LCD();
}
}//主控程序结束。
//*********************
//*********************
void QDJCZ(void)
{
P24=0;
P23=0;
P23=1;
}
void initial()
{
TMOD=0X02;
TL0=0X06;
TH0=0X06;
TR0=1;
PT0=1;
ET0=1;
EX0=1;
EX1=1;
EA=1;
MAX813_WDI=0;
}
//************************************
void control_sub(void)
{ uchar temptemw,temptemr;
unsigned int time0,time1,time2,time3,time4;
if(No_warter)
{
RD_CHIP(0x03);
time0=(((senrev[1]>>4)*10+(senrev[1]&0x0f))*256+(senrev[0]>>4)*10+(senrev[0]&0x0f));
if(F_new==0)//初次上电
{
if((Time_on<=time0)&&(time0<Time_off))
{
F_control=1;
}
}
if(Time_on==time0)
{
F_control=1;
}
if(Duan_CNT==1)
{
RD_CHIP(0x03);
time0=(((senrev[1]>>4)*10+(senrev[1]&0x0f))*256+(senrev[0]>>4)*10+(senrev[0]&0x0f));
if(Time_off==time0)
{
Duan_CNT=2;
F_control=0;
RD_CHIP(0x28);
Time_on=senrev[0]*256+senrev[1];
RD_CHIP(0x2a);
Time_off=senrev[0]*256+senrev[1];
RD_CHIP(0x2c);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x2e);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
if(F_control)
{
contronl();
}
else
{
while(!F_work_off)
{ MAX813_WDI=0;
FIR_mrd1820();
FIR_mrd18202();
display2();
pump_off();
}
}
}
else if(Duan_CNT==2)
{
RD_CHIP(0x03);
time0=(((senrev[1]>>4)*10+(senrev[1]&0x0f))*256+(senrev[0]>>4)*10+(senrev[0]&0x0f));
if(Time_off==time0)
{
Duan_CNT=3;
F_control=0;
RD_CHIP(0x30);
Time_on=senrev[0]*256+senrev[1];
RD_CHIP(0x32);
Time_off=senrev[0]*256+senrev[1];
RD_CHIP(0x34);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x36);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
if(F_control)
{
contronl();
}
else
{
while(!F_work_off)
{MAX813_WDI=0;
FIR_mrd1820();
FIR_mrd18202();
display2();
pump_off();
}
}
}
else if(Duan_CNT==3)
{
RD_CHIP(0x03);
time0=(((senrev[1]>>4)*10+(senrev[1]&0x0f))*256+(senrev[0]>>4)*10+(senrev[0]&0x0f));
if(Time_off==time0)
{
Duan_CNT=4;
F_control=0;
RD_CHIP(0x38);
Time_on=senrev[0]*256+senrev[1];
RD_CHIP(0x3a);
Time_off=senrev[0]*256+senrev[1];
RD_CHIP(0x3c);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x3e);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
if(F_control)
{
contronl();
}
else
{
while(!F_work_off)
{MAX813_WDI=0;
FIR_mrd1820();
FIR_mrd18202();
display2();
pump_off();
}
}
}
else if(Duan_CNT==4)
{
RD_CHIP(0x03);
time0=(((senrev[1]>>4)*10+(senrev[1]&0x0f))*256+(senrev[0]>>4)*10+(senrev[0]&0x0f));
if(Time_off==time0)
{
Duan_CNT=1;
F_control=0;
RD_CHIP(0x20);
Time_on=senrev[0]*256+senrev[1];
RD_CHIP(0x22);
Time_off=senrev[0]*256+senrev[1];
RD_CHIP(0x24);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x26);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
if(F_control)
{
contronl();
}
else
{
while(!F_work_off)
{MAX813_WDI=0;
FIR_mrd1820();
FIR_mrd18202();
display2();
pump_off();
}
}
}
}
else //No_warter=0
{
while(!F_work_off)
{
switch(RAM_i)
{
case 0:
P0=0Xe1;//
QDJCZ();
RL2=RL3=RL4=RL5=0;
B_Txs=720;
F_Txs=0;
RAM_i+=1;
break;
case 1:
if(F_Txs)
{
P0=0Xe0;//
QDJCZ();
RL1=0;
F_Txs=0;
RAM_i=0;
F_working=0;
F_work_off=1;
}
break;
}
MAX813_WDI=0;
display2();
}
while(!No_warter) //*********************缺水报警*********
{ Clear_LCD();
WRCOM(0x90);
WRCOM(0x90);
WRDATA(0xbe);WRDATA(0xaf);
WRDATA(0xb8);WRDATA(0xe6);
WRDATA(0xa1);WRDATA(0xc3);
WRDATA(0xc8);WRDATA(0xb1);
WRDATA(0xcb);WRDATA(0xae);
WRDATA(0xa3);WRDATA(0xa1);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
Clear_LCD();
if(KEY1==0)
{F_hand=~F_hand;
dl_ms(20);
while(KEY1==0) MAX813_WDI=0;
dl_ms(200);
break;
}
//*********
}
}
}
//**************************************
void contronl(void)
{ uchar temptemw,temptemr;
FIR_mrd1820();//buffer[0];buffer[1];buffer[2];
temptemw=buffer[0]*10+buffer[1];
FIR_mrd18202();//buffer[3];buffer[4];buffer[5];buffer[6];buffer[7];
temptemr=buffer[3]*10+buffer[4];
MAX813_WDI=0;
MAX813_WDI=0;
if(F_new==0)//初次上电
{
if((temptemr<Temp_offr)&&(temptemw<Temp_offw))
{
while(!F_working)
{MAX813_WDI=0;
//FIR_mrd1820();
//FIR_mrd18202();
display2();
pump_on();
}
}
}
else
{
if((temptemr<Temp_onr)&&(temptemw<Temp_onw)&&(!F_working))
{
while(!F_working)
{ MAX813_WDI=0;
//FIR_mrd1820();
//FIR_mrd18202();
display2();
pump_on();
}
}
if(((Temp_offr<=temptemr)||(Temp_offw<=temptemw))&&(F_working))
{
while(!F_work_off)
{ MAX813_WDI=0;
//FIR_mrd1820();
//FIR_mrd18202();
display2();
pump_off();
}
}
}
}
//************************
void pump_off(void)
{
MAX813_WDI=0;
F_rise=0;
switch(RAM_i)
{
case 0:
P0=0XFD;//
QDJCZ();
RL2=0;//第一组停
B_Txs=40;
F_Txs=0;
RAM_i+=1;
break;
case 1:
if(F_Txs)
{
P0=0XF9;//
QDJCZ();
RL3=0; //第二组停
F_Txs=0;
B_Txs=40;
RAM_i+=1;
}
break;
case 2:
if(F_Txs)
{
P0=0XF1;//
QDJCZ();
RL4=0;//第三组停
F_Txs=0;
B_Txs=40;
RAM_i+=1;
}
break;
case 3:
if(F_Txs)
{
P0=0Xe1;//
QDJCZ();
RL5=0;//第二组停
F_Txs=0;
B_Txs=180;
RAM_i+=1;
}
break;
case 4:
if(F_Txs)
{
P0=0Xe0;//
for(BK_ADDR=0;BK_ADDR<=10;BK_ADDR++){BK_ADDR=BK_ADDR;}
QDJCZ();
for(BK_ADDR=0;BK_ADDR<=10;BK_ADDR++){BK_ADDR=BK_ADDR;}
RL1=0;//电机停
RAM_i=0;
F_working=0;
F_work_off=1;
}
break;
}
}
//****************************
void pump_on(void)
{
MAX813_WDI=0;
F_rise=1;
switch(RAM_i)
{
case 0:
P0=0X01;//
for(BK_ADDR=0;BK_ADDR<=10;BK_ADDR++){BK_ADDR=BK_ADDR;}
QDJCZ();
for(BK_ADDR=0;BK_ADDR<=10;BK_ADDR++){BK_ADDR=BK_ADDR;}
RL1=1;//电机接通
B_Txs=120;
F_Txs=0;
RAM_i+=1;
break;
case 1:
if(F_Txs)
{
P0=0X03;//
QDJCZ();
RL2=1; //第一组接通
F_Txs=0;
B_Txs=40;
RAM_i+=1;
}
break;
case 2:
if(F_Txs)
{
P0=0X07;//
QDJCZ();
RL3=1;//第二组接通
F_Txs=0;
B_Txs=40;
RAM_i+=1;
}
break;
case 3:
if(F_Txs)
{
P0=0X0f;//
QDJCZ();
RL4=1;//第二组停
F_Txs=0;
B_Txs=40;
RAM_i+=1;
}
break;
case 4:
if(F_Txs)
{
P0=0X1f;//
QDJCZ();
RL5=1;//第二组停
F_Txs=0;
RAM_i=0;
F_new=1;
F_working=1;
F_work_off=0;
}
break;
}
}
//******************************************************************
void Duan_set(void)
{
unsigned int time0,time1,time2,time3,time4,time5,time6,time7,time8;
MAX813_WDI=0;
RD_CHIP(0x03);
time0=(((senrev[1]>>4)*10+(senrev[1]&0x0f))*256+(senrev[0]>>4)*10+(senrev[0]&0x0f));
RD_CHIP(0x20);
time1=senrev[0]*256+senrev[1];
RD_CHIP(0x22);
time2=senrev[0]*256+senrev[1];//senrev[0];
RD_CHIP(0x28);
time3=senrev[0]*256+senrev[1];
RD_CHIP(0x2a);
time4=senrev[0]*256+senrev[1];//senrev[0];
RD_CHIP(0x30);
time5=senrev[0]*256+senrev[1];
RD_CHIP(0x32);
time6=senrev[0]*256+senrev[1];
RD_CHIP(0x38);
time7=senrev[0]*256+senrev[1];
RD_CHIP(0x3a);
time8=senrev[0]*256+senrev[1];//senrev[0];
MAX813_WDI=0;
if( ((time1<time0)&&(time0<time2))||(((time8<=time0)&&(time0<9216))||(time0<=time1)))//time1---time2
{
Duan_CNT=1;
Time_on=time1;
Time_off=time2;
RD_CHIP(0x24);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x26);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
else if((time3<time0)&&(time0<time4)||((time2<=time0)&&(time0<=time3)))//time3--24 24---time4
{ Duan_CNT=2;
Time_on=time3;
Time_off=time4;
RD_CHIP(0x2c);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x2e);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
else if((time5<time0)&&(time0<time6)||((time4<=time0)&&(time0<=time5)))//time5---time6
{
Duan_CNT=3;
Time_on=time5;
Time_off=time6;
RD_CHIP(0x34);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x36);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
else if((time7<time0)&&(time0<time8)||((time6<=time0)&&(time0<=time7)))//time5---time6
{
Duan_CNT=4;
Time_on=time7;
Time_off=time8;
RD_CHIP(0x3c);
Temp_onw=senrev[0];
Temp_offw=senrev[1];
RD_CHIP(0x3e);
Temp_onr=senrev[0];
Temp_offr=senrev[1];
}
else
{Duan_CNT=0;
B_DAY=0;
}
}
//*******************************************************************
void tov(void)
{ uchar temptemw;
FIR_mrd1820();//buffer[0];buffer[1];buffer[2];
temptemw=buffer[0]*10+buffer[1];
if(temptemw>=75)
{
Clear_LCD();
WRCOM(0x90);WRCOM(0x90);
WRDATA(0xbe);WRDATA(0xaf);
WRDATA(0xb8);WRDATA(0xe6);
WRDATA(0xa1);WRDATA(0xc3);
WRDATA(0xcb);WRDATA(0xae);
WRDATA(0xce);WRDATA(0xc2);
WRDATA(0xb9);WRDATA(0xfd);
WRDATA(0xb8);WRDATA(0xdf);
WRDATA(0xa3);WRDATA(0xa1);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
Clear_LCD();
}
}
//****************************************************
void fd(void)
{
uchar temptemw,temptemr;
FIR_mrd1820();//buffer[0];buffer[1];buffer[2];
temptemw=buffer[0]*10+buffer[1];
FIR_mrd18202();//buffer[3];buffer[4];buffer[5];buffer[6];buffer[7];
temptemr=buffer[3]*10+buffer[4];
MAX813_WDI=0;
if((temptemr<=5)&&(!F_working))
{
while(!F_working)
{MAX813_WDI=0;
//FIR_mrd1820();
//FIR_mrd18202();
display2();
pump_on();
}
}
if((10<=temptemr)&&(F_working))
{
while(!F_work_off)
{MAX813_WDI=0;
//FIR_mrd1820();
//FIR_mrd18202();
display2();
pump_off();
}
}
}
//****键盘设置**************************
ext_1() interrupt 2
{
uchar k1,t1,t2,t3,t4;
EX1=0; // 进中断程序后就关掉外中断1,改为查询方式
MAX813_WDI=0;
ET0=1;
TR0=1;
B_Txs=120;
F_Txs=0;
Clear_LCD();
WRCOM(0x80);
WRCOM(0x0c);
for(k1=0;k1<16;k1++)
{
WRDATA(setup[k1]);
}
WRCOM(0x90);
for(k1=16;k1<32;k1++)
{
WRDATA(setup[k1]);
}
WRCOM(0x88);
for(k1=32;k1<46;k1++)
{
WRDATA(setup[k1]);
}
k1=0;
BUZER_SUB();
while(KEY4==0) //首次进入中断 判FUNC键是否抬起
{ MAX813_WDI=0;
}
dl_ms(100);
MAX813_WDI=0;
while(1)
{ MAX813_WDI=0;
//*****************************************
if(KEY2==0)//时间设置
{B_Txs=120;
shift_cnt=0;
BUZER_SUB();
Clear_LCD();
RD_CHIP(0x03);
buffer[3]=senrev[1]>>4;
buffer[2]=senrev[1]&0x0f;
buffer[1]=senrev[0]>>4;
buffer[0]=senrev[0]&0x0f;
display3();
dl_ms(20);
while(KEY2==0) MAX813_WDI=0;
while(1)
{
if(KEY5==0)//时间设置
{B_Txs=120;
shift_cnt+=1;
if(shift_cnt>1)
{
shift_cnt=0;
}
BUZER_SUB();
while(KEY5==0) MAX813_WDI=0;
}
switch(shift_cnt)
{
case 0:
WRCOM(0x95);
WRDATA(num_MODE[buffer[1]]);
WRDATA(num_MODE[buffer[0]]);
WRCOM(0x95);
WRCOM(0x0d);
if(KEY3==0) //时间加
{buffer[0]+=1;B_Txs=120;
if(buffer[0]>9)
{
buffer[0]=0;
buffer[1]+=1;
if(buffer[1]>5)
{
buffer[1]=0;
}
}
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //时间加
{B_Txs=120;
if((buffer[0]==0)&&(buffer[1]==0))
{
buffer[0]=9;
buffer[1]=5;
}
else if((buffer[0]==0)&&(buffer[1]!=0))
{
buffer[0]=9;
buffer[1]-=1;
}
else
{
buffer[0]-=1;
}
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
break;
case 1:
WRCOM(0x93);
WRDATA(num_MODE[buffer[3]]);
WRDATA(num_MODE[buffer[2]]);
WRCOM(0x93);
WRCOM(0x0d);
if(KEY3==0) //时间加
{buffer[2]+=1;B_Txs=120;
if((buffer[3]==2)&&(buffer[2]>=4))
{
buffer[3]=0;
buffer[2]=0;
}
if(buffer[2]>9)
{
buffer[2]=0;
buffer[3]+=1;
}
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //时间加
{B_Txs=120;
if((buffer[2]==0)&&(buffer[3]==0))
{
buffer[2]=3;
buffer[3]=2;
}
else if((buffer[2]==0)&&(buffer[3]!=0))
{
buffer[2]=9;
buffer[3]-=1;
}
else
{
buffer[2]-=1;
}
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
break;
}
if(F_Txs)
{
senrev[0]=(buffer[1]<<4)|buffer[0];
WT_CHIP(0x03);
senrev[0]=(buffer[3]<<4)|buffer[2];
WT_CHIP(0x04);MAX813_WDI=0;
goto ext_out;
}
if(KEY4==0)
{
senrev[0]=(buffer[1]<<4)|buffer[0];
WT_CHIP(0x03);
BUZER_SUB();MAX813_WDI=0;
senrev[0]=(buffer[3]<<4)|buffer[2];
WT_CHIP(0x04);
while(KEY4==0) MAX813_WDI=0;
goto ext_out;
}
}
}//时间设置结束
//**********************************************ggggggggggg************************
if(KEY3==0)//参数设置
{B_Txs=120;
BUZER_SUB();
MAX813_WDI=0;
sagain: Clear_LCD();
segm=0;
Clear_LCD();
RD_CHIP(0x20);
t1=senrev[0];
t2=senrev[1];
buffer[3]=t1/10;
buffer[2]=t1%10;
buffer[1]=t2/10;
buffer[0]=t2%10;
RD_CHIP(0x22);
t3=senrev[0];
t4=senrev[1];
buffer[7]=t3/10;
buffer[6]=t3%10;
buffer[5]=t4/10;
buffer[4]=t4%10;
RD_CHIP(0x24);
temp[0]=senrev[0];
temp[1]=senrev[1];
RD_CHIP(0x26);
temp[2]=senrev[0];
temp[3]=senrev[1];
F_cros_disp=0;
display4();
dl_ms(20);
while(KEY3==0) MAX813_WDI=0;
while(1)
{
MAX813_WDI=0;
if(KEY5==0)
{ shift_cnt+=1;BUZER_SUB();
B_Txs=120;
dl_ms(20);
while(KEY5==0) MAX813_WDI=0;
dl_ms(200);
}
switch(shift_cnt)
{
case 0:
WRCOM(0x92);
WRDATA(num_MODE[t2/10]);
WRDATA(num_MODE[t2%10]);
WRCOM(0x92);WRCOM(0x0d);
if(KEY3==0) //时间加
{t2+=1;
B_Txs=120;
if(t2>59)
{
t2=0;
}
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //时间加
{t2-=1;B_Txs=120;
if(t2>59)
{
t2=59;
}
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
buffer[1]=t2/10;
buffer[0]=t2%10;
break;
case 1:
WRCOM(0x90);
WRDATA(num_MODE[t1/10]);
WRDATA(num_MODE[t1%10]);
WRCOM(0x90);WRCOM(0x0d);
if(KEY3==0) //时间加
{t1+=1;B_Txs=120;
if(t1>23)
{
t1=0;
}
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //时间加
{t1-=1;B_Txs=120;
if(t1>23)
{
t1=23;
}
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
buffer[3]=t1/10;
buffer[2]=t1%10;
break;
case 2:
WRCOM(0x96);
WRDATA(num_MODE[t4/10]);
WRDATA(num_MODE[t4%10]);
WRCOM(0x96);WRCOM(0x0d);
if(KEY3==0) //时间加
{t4+=1;B_Txs=120;
if(t4>59)
{
t4=0;
}
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //时间加
{t4-=1;B_Txs=120;
if(t4>59)
{
t4=59;
}
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
buffer[5]=t4/10;
buffer[4]=t4%10;
break;
case 3:
WRCOM(0x94);
WRDATA(num_MODE[t3/10]);
WRDATA(num_MODE[t3%10]);
WRCOM(0x94);WRCOM(0x0d);
if(KEY3==0) //时间加
{t3+=1;B_Txs=120;
if(t3>23)
{
t3=0;
}
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //时间加
{t3-=1;B_Txs=120;
if(t3>23)
{
t3=23;
}
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
buffer[7]=t3/10;
buffer[6]=t3%10;
break;
case 4:
WRCOM(0x8b);
WRDATA(num_MODE[temp[0]/10]);
WRDATA(num_MODE[temp[0]%10]);
WRCOM(0x8b);WRCOM(0x0d);
if(KEY3==0) //起始水温加
{temp[0]+=1;B_Txs=120;
if(temp[0]>=99) temp[0]=99;
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //起始水温减
{
if(temp[0]==0) temp[0]=0;
else temp[0]-=1;
B_Txs=120;
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
break;
case 5:
WRCOM(0x8d);
WRDATA(num_MODE[temp[1]/10]);
WRDATA(num_MODE[temp[1]%10]);
WRCOM(0x8d);WRCOM(0x0d);
if(KEY3==0) //起始水温加
{temp[1]+=1;B_Txs=120;
if(temp[1]>=99) temp[1]=99;
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //起始水温减
{
if(temp[1]==0) temp[1]=0;
else temp[1]-=1;
B_Txs=120;
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
break;
case 6:
WRCOM(0x9b);
WRDATA(num_MODE[temp[2]/10]);
WRDATA(num_MODE[temp[2]%10]);
WRCOM(0x9b);WRCOM(0x0d);
if(KEY3==0) //起始水温加
{temp[2]+=1;B_Txs=120;
if(temp[2]>=99) temp[2]=99;
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //起始水温减
{
if(temp[2]==0) temp[2]=0;
else temp[2]-=1;
B_Txs=120;
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
break;
case 7:
WRCOM(0x9d);
WRDATA(num_MODE[temp[3]/10]);
WRDATA(num_MODE[temp[3]%10]);
WRCOM(0x9d);WRCOM(0x0d);
if(KEY3==0) //终止水温加
{temp[3]+=1;B_Txs=120;
if(temp[3]>=99) temp[3]=99;
BUZER_SUB();
while(KEY3==0) MAX813_WDI=0;
}
if(KEY2==0) //终止水温减
{
if(temp[3]==0) temp[3]=0;
else temp[3]-=1;
B_Txs=120;
BUZER_SUB();
while(KEY2==0) MAX813_WDI=0;
}
break;
case 8:
k1=1;
segm+=1;
shift_cnt=0;
break;
}//switch
//*********************************************************************
if((segm==1)&&(k1==1))//第一段
{
senrev[0]=t1;//写入第一段起始时间时间加
WT_CHIP(0x20);
senrev[0]=t2;
WT_CHIP(0x21);
senrev[0]=t3;//写入第一段起始时间时间加
WT_CHIP(0x22);
senrev[0]=t4;
WT_CHIP(0x23);
senrev[0]=temp[0];
WT_CHIP(0x24);
senrev[0]=temp[1];
WT_CHIP(0x25);
senrev[0]=temp[2];
WT_CHIP(0x26);
senrev[0]=temp[3];
WT_CHIP(0x27);
MAX813_WDI=0;
//*******************
RD_CHIP(0x28);
t1=senrev[0];
t2=senrev[1];
buffer[3]=t1/10;
buffer[2]=t1%10;
buffer[1]=t2/10;
buffer[0]=t2%10;
RD_CHIP(0x2a);
t3=senrev[0];
t4=senrev[1];
buffer[7]=t3/10;
buffer[6]=t3%10;
buffer[5]=t4/10;
buffer[4]=t4%10;
RD_CHIP(0x2c);
temp[0]=senrev[0];
temp[1]=senrev[1];
RD_CHIP(0x2e);
temp[2]=senrev[0];
temp[3]=senrev[1];
dl_ms(20);
display4();
WRCOM(0x82);
WRDATA(0xa3); WRDATA(0xb2);
F_cros_disp=0;
k1=0;
}
if((segm==2)&&(k1==1))//第二段
{
senrev[0]=t1;//写入第二段起始时间时间加
WT_CHIP(0x28);
senrev[0]=t2;
WT_CHIP(0x29);
senrev[0]=t3;//写入第二段起始时间时间加
WT_CHIP(0x2a);
senrev[0]=t4;
WT_CHIP(0x2b);
senrev[0]=temp[0];
WT_CHIP(0x2c);
senrev[0]=temp[1];
WT_CHIP(0x2d);
senrev[0]=temp[2];
WT_CHIP(0x2e);
senrev[0]=temp[3];
WT_CHIP(0x2f);
MAX813_WDI=0;
//*******************
RD_CHIP(0x30);
t1=senrev[0];
t2=senrev[1];
buffer[3]=t1/10;
buffer[2]=t1%10;
buffer[1]=t2/10;
buffer[0]=t2%10;
RD_CHIP(0x32);
t3=senrev[0];
t4=senrev[1];
buffer[7]=t3/10;
buffer[6]=t3%10;
buffer[5]=t4/10;
buffer[4]=t4%10;
RD_CHIP(0x34);
temp[0]=senrev[0];
temp[1]=senrev[1];
RD_CHIP(0x36);
temp[2]=senrev[0];
temp[3]=senrev[1];
dl_ms(20);
display4();
WRCOM(0x82);
WRDATA(0xa3); WRDATA(0xb3);
k1=0;
}
if((segm==3)&&(k1==1))//第三段
{
senrev[0]=t1;//写入第二段起始时间时间加
WT_CHIP(0x30);
senrev[0]=t2;
WT_CHIP(0x31);
senrev[0]=t3;//写入第二段起始时间时间加
WT_CHIP(0x32);
senrev[0]=t4;
WT_CHIP(0x33);
senrev[0]=temp[0];
WT_CHIP(0x34);
senrev[0]=temp[1];
WT_CHIP(0x35);
senrev[0]=temp[2];
WT_CHIP(0x36);
senrev[0]=temp[3];
WT_CHIP(0x37);
MAX813_WDI=0;
//*******************
RD_CHIP(0x38);
t1=senrev[0];
t2=senrev[1];
buffer[3]=t1/10;
buffer[2]=t1%10;
buffer[1]=t2/10;
buffer[0]=t2%10;
RD_CHIP(0x3a);
t3=senrev[0];
t4=senrev[1];
buffer[7]=t3/10;
buffer[6]=t3%10;
buffer[5]=t4/10;
buffer[4]=t4%10;
RD_CHIP(0x3c);
temp[0]=senrev[0];
temp[1]=senrev[1];
RD_CHIP(0x3e);
temp[2]=senrev[0];
temp[3]=senrev[1];
dl_ms(20);
display4();
WRCOM(0x82);
WRDATA(0xa3); WRDATA(0xb4);
k1=0;
}
if((segm==4)&&(k1==1))//第四段
{
senrev[0]=t1;//写入第四段起始时间时间加
WT_CHIP(0x38);
senrev[0]=t2;
WT_CHIP(0x39);
senrev[0]=t3;//写入第四段起始时间时间加
WT_CHIP(0x3a);
senrev[0]=t4;
WT_CHIP(0x3b);
senrev[0]=temp[0];
WT_CHIP(0x3c);
senrev[0]=temp[1];
WT_CHIP(0x3d);
senrev[0]=temp[2];
WT_CHIP(0x3e);
senrev[0]=temp[3];
WT_CHIP(0x3f);
MAX813_WDI=0;
k1=0;
goto sagain;
}
//*********************************************************************
if(F_Txs)
{
goto ext_out;
}
if(KEY4==0)
{BUZER_SUB();
while(KEY4==0) MAX813_WDI=0;
goto ext_out;
}
}
}///参数设置结束
//************************************************
if(F_Txs)
{
goto ext_out;
}
if(KEY4==0)
{
BUZER_SUB();
while(KEY4==0) MAX813_WDI=0;
goto ext_out;
}
}//while(1)
ext_out:EX1=1;
F_cros_disp=0;
Clear_LCD();
dl_ms(200);
}
//**********************************************************************
//*********************** sub function of 8583 ***hhhhhhhhhh**********
//***********************************************************************
//向8583RAM区写温度 地址首址=fstadrm
void WT_TEMP(uchar fstadrm)
{ load_temp();
slvadr=0xa0;
subadr=fstadrm;
bytecnt=0x02;
senddata();
}
//****向8583RAM区写特_码 地址首址=50h*****
void WT_8583_TM(void)
{ uchar i;
for(i=0;i<6;i++)
{ senrev[0]=0XAA;
slvadr=0xa0;
subadr=0x70+i;
bytecnt=0x01;
senddata();
}
}
//****向8583RAM区写时间 地址首址=fstadrt****
void WT_CHIP(uchar fstadrt)
{ slvadr=0xa0;
subadr=fstadrt;
bytecnt=1;
senddata();
}
//配置须写入的温度值
void load_temp(void)
{ senrev[0]=(buffer[0]<<4)|buffer[1];
senrev[1]=buffer[2];
}
//配置须写入的时间
void load_time(void)
{ senrev[0]=(buffer[5]<<4)|buffer[6];
senrev[1]=(buffer[3]<<4)|buffer[4];
}
//读8583RAM区子程序 地址首址=fstadrp
void RD_CHIP(uchar fstadrp)
{ slvadr=0xa0;
subadr=fstadrp;
bytecnt=2;
revdata();
}
//*******//启动I2总线*************************
void start()
{
SDA=1;
RAM_i=RAM_i;
SCL=1;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SDA=0;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=0;
}
//************* //释放I2总线************************
void stop()
{
SDA=0;
RAM_i=RAM_i;
SCL=1;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SDA=1;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
}
//*****write a byte and receive ack to 8583 *****************
void sentbyte(char a)
{ uchar i;
com_data=a;
for(i=0;i<8;i++)
{
SDA=cos_bit;
RAM_i=RAM_i;RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=1;
RAM_i=RAM_i;RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=0;
com_data=com_data<<1;
}
RAM_i=RAM_i;
RAM_i=RAM_i;
SDA=1; //发送结束
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=1; //接收ack
RAM_i=RAM_i;
RAM_i=RAM_i;
F0=0; //clr flag of sent error
if(SDA==0)
{
SCL=0;
}
else
{F0=1;
SCL=0;
}
}
//*******//读一个字节******************************
uchar revbyte(void)
{
uchar i,j,dat;
SDA=1;
for(i=1;i<=8;i++)
{
RAM_i=RAM_i;
SCL=0;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=1;
j=SDA;
dat=(dat<<1);
dat=(j)|(dat);
}
SCL=0;
RAM_i=RAM_i;
SDA=0;
if(ack==0)
{RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=1;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=0;
ack=0;}
else
{ SDA=1;
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=1;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
RAM_i=RAM_i;
SCL=0;
ack=0;}
return(dat);
}
//*****************send a data to 8583 *******************
void senddata(void)
{ uchar i;
uchar y1;
start();
y1=slvadr;
sentbyte(y1);
if(F0!=1)
{ y1=subadr;
sentbyte(y1);
if(F0!=1)
{ for(i=0;i<bytecnt;i++)
{y1=senrev;
sentbyte(y1);
if(F0==1)
{goto sdrt;}
}
stop();
dl_ms(20);
}
}
sdrt: RAM_i=RAM_i;
}
//*****************************************
void revdata(void)
{uchar i;
uchar a;
start();
a=slvadr;
sentbyte(a);
if(F0!=1)
{
a=subadr;
sentbyte(a);
if(F0!=1)
{
start();
a=slvadr|0x01;
sentbyte(a);
if(F0!=1)
{
ack=0;
for(i=0;i<bytecnt;i++)
{
senrev=revbyte();
}
ack=1;
senrev[bytecnt]=revbyte();
stop();
stop();
}
}
}
}
//************************************************
//*************end pc8583*************************
//************************************************
void BUZER_SUB(void)
{ SPEAK=0; //蜂鸣器响
dl_us(0xf00);
MAX813_WDI=0;
SPEAK=1;
}
//************************************
void dl_ms(unsigned int count)
{ uchar i;
while(count--)
{ for(i=0;i<125;i++)
{ ;
}
MAX813_WDI=0;
}
}
//T0中断服务子程序
Timer_0() interrupt 1
{
B_T1s--;
MAX813_WDI=1; //看门狗触发端
if (B_T1s==0)
{
B_T1s=1000;
F_flash=~F_flash;
B_Txs--;
if(B_Txs==0)
{F_Txs=1;
B_Txs=1;
}
}
}
//****************************************
void dl_us(unsigned int count)
{ unsigned int i;
for(i=0;i<count;i++)
{
MAX813_WDI=0;
}
}
//*****************************************************************
//*****************************************************************
//温度计子程序1 ds18b20
//*********************jjjjjjj********************************************
uchar rst(void) //发复位脉冲
{
uchar presence=1;
dat_1820=0;
dl_us(82); //延时公式= 30 + (i-1)*13us
dat_1820=1;
dl_us(4);
presence=dat_1820;
dl_us(28);
return presence;
}
//*********************************
bit rdbit(void) //读一个位
{ uchar i;
bit dat_bit;
dat_1820=0;i++;
dat_1820=1;i++;i++;
dat_bit=dat_1820;
dat_1820=0;
i=8; //i=3,4,5,7,8分别延时30,39,47,62,70微妙
while(i>0)
{i--;}
dat_1820=1;i++;i++;
return(dat_bit);
}
uchar rdbyte(void) //读一个字节
{ uchar i,j,dat;
for(i=1;i<=8;i++)
{
j=rdbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void wtbyte(uchar dat) //写一个字节
{ unsigned int i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
dat_1820=0;i++;i++;
dat_1820=1;
i=7;
while(i>0)
{i--;}
}
else //写0
{
dat_1820=0;
i=7;
while(i>0)
{i--;}
dat_1820=1;
i++;i++;
}
}
}
void tempst(void) //开始温度转换sssss
{
if(rst())
{
buffer[0]=buffer[1]=buffer[2]=0;
return;
}
wtbyte(0xcc); //跳过rom检测
wtbyte(0x44); //开始读温度
dl_ms(8);
}
uchar rdtemp(void) //开始读温度
{
uchar a,b,y1,y2,y3=0;
int ba,BA;
TEMP_SIGN=0;
if(rst())
{
buffer[0]=buffer[1]=buffer[2]=0;
return 0;
}
dl_ms(2);
wtbyte(0xcc); //跳过rom检测
wtbyte(0xbe); //开始读温度暂存器
a=rdbyte(); //读温度暂存器低字节
b=rdbyte(); //读温度暂存器高字节
/**测试温度时用
FBA=FBA+16; //FBA初值=0xfc00;
a=FBA&0x00ff;
b=(FBA&0xff00)>>8; //-25.0625
_nop_();
*/
// a=0xd0;
// b=0x07; //+125
if(b>128)
{ ba=(b*256+a);
BA=(~ba+1)>>4;
BA=BA&0x07ff;
TEMP_SIGN=1;
y3=BA;
}
else
{ y1=a>>4;
y2=b<<4;
y3=y1|y2;
buffer[2]=buffer1[a&0x0f];
}
return(y3);
}
void FIR_mrd1820(void) //18b20的主读程序
{ uchar idata last;
// uchar lsb,msb;
ET0=0; //读18b20时关T0中断
TR0=0;
tempst(); //写18b20
dl_us(150); //延时
last=rdtemp();
buff_last=last;
dl_us(50); //延时
if(TEMP_SIGN==1)
{ buffer[0]=10;
buffer[1]=last/10;
buffer[2]=last%10;
}
else
{ buffer[0]=last/10;
buffer[1]=last%10;
}
ET0=1;
TR0=1;
}//*****************************************************************
//温度计子程序2 ds18b20
//*****************************************************************
uchar rst2(void) //发复位脉冲
{
uchar presence=1;
S2 =0;
dl_us(82); //延时公式= 30 + (i-1)*13us
S2 =1;
dl_us(4);
presence=S2 ;
dl_us(28);
return presence;
}
//*********************************
bit rdbit2(void) //读一个位
{ uchar i;
bit dat_bit;
S2 =0;i++;
S2 =1;i++;i++;
dat_bit=S2 ;
S2 =0;
i=8; //i=3,4,5,7,8分别延时30,39,47,62,70微妙
while(i>0)
{i--;}
S2 =1;i++;i++;
return(dat_bit);
}
//*********************
uchar rdbyte2(void) //读一个字节
{ uchar i,j,dat;
for(i=1;i<=8;i++)
{
j=rdbit2();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
//**********************
void wtbyte2(uchar dat) //写一个字节
{ unsigned int i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
S2 =0;i++;i++;
S2 =1;
i=7;
while(i>0)
{i--;}
}
else //写0
{
S2 =0;
i=7;
while(i>0)
{i--;}
S2 =1;
i++;i++;
}
}
}
//*******************
void tempst2(void) //开始温度转换sssss
{
if(rst2())
{
buffer[3]=buffer[4]=buffer[5]=0;
return;
}
wtbyte2(0xcc); //跳过rom检测
wtbyte2(0x44); //开始读温度
dl_ms(8);
}
//****************************************
uchar rdtemp2(void) //开始读温度
{
uchar a,b,y1,y2,y3=0;
int ba,BA;
TEMP_SIGN=0;
if(rst2())
{
buffer[3]=buffer[4]=buffer[5]=0;
return 0;
}
dl_ms(2);
wtbyte2(0xcc); //跳过rom检测
wtbyte2(0xbe); //开始读温度暂存器
a=rdbyte2(); //读温度暂存器低字节
b=rdbyte2(); //读温度暂存器高字节
/**测试温度时用
FBA=FBA+16; //FBA初值=0xfc00;
a=FBA&0x00ff;
b=(FBA&0xff00)>>8; //-25.0625
_nop_();
*/
// a=0xd0;
// b=0x07; //+125
if(b>128)
{ ba=(b*256+a);
BA=(~ba+1)>>4;
BA=BA&0x07ff;
TEMP_SIGN=1;
y3=BA;
}
else
{ y1=a>>4;
y2=b<<4;
y3=y1|y2;
buffer[5]=buffer1[a&0x0f];
}
return(y3);
}
//*******************************************
void FIR_mrd18202(void) //18b20的主读程序
{ uchar idata last;
ET0=0; //读18b20时关T0中断
TR0=0;
tempst2(); //写18b20
dl_us(150); //延时
last=rdtemp2();
buff_last=last;
dl_us(50); //延时
if(TEMP_SIGN==1)
{ buffer[3]=10;
buffer[4]=last/10;
buffer[5]=last%10;
}
else
{ buffer[3]=last/10;
buffer[4]=last%10;
}
ET0=1;
TR0=1;
}
//************************************
//***********************************
ext0() interrupt 0 //
{
EX0=0;
dl_ms(40);
if(P32==0)
{ F_hand=0;
RL2=RL3=RL4=RL5=0;
Clear_LCD();
WRCOM(0x90);WRCOM(0x90);
WRDATA(0xbe);WRDATA(0xaf);
WRDATA(0xb8);WRDATA(0xe6);
WRDATA(0xa1);WRDATA(0xc3);
WRDATA(0xcb);WRDATA(0xae);
WRDATA(0xce);WRDATA(0xc2);
WRDATA(0xb9);WRDATA(0xfd);
WRDATA(0xb8);WRDATA(0xdf);
WRDATA(0xa3);WRDATA(0xa1);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
BUZER_SUB();
dl_ms(100);
Clear_LCD();
F_control=0;
}
EX0=1;
}
//************************************
//************液晶显示****************
//************************************
void Lcd_init(void)
{
WRCOM(0x01);
dl_us(2);
WRCOM(0x02);
dl_us(2);
WRCOM(0x0c);
dl_us(2);
}
//**********************************
void Clear_LCD(void)
{ WRCOM(0x01);
dl_us(2);
}
//**********************************
void LCDBUSY(void)
{ EE = 0;
RW = 1;
RS = 0;
dl_us(100);
EE = 1;
//while (BF==1);
EE = 0;
}
//**********************************
void WRCOM (char showctl)
{
LCDBUSY();
RW = 0;
RS = 0;
P0 = showctl;
EE = 1;
dl_us(2);
EE = 0;
}
//**********************************
void WRDATA(char showctl)
{
LCDBUSY();
RW = 0;
RS = 1;
dl_us(2);
P0 = showctl;
EE = 1;
dl_us(2);
EE = 0;
}
void display1(void)
{
uchar i=0,j=0;
}
//********************************************************
void display2(void)
{
uchar i=0,j=0;
//*************显示水温**********************
WRCOM(0x80);
WRCOM(0x0c);
WRDATA(0xcb);
WRDATA(0xae);
WRDATA(0xce);
WRDATA(0xc2);
WRDATA(0xa1);
WRDATA(0xc3);
WRDATA(num_MODE[buffer[0]]);
WRDATA(num_MODE[buffer[1]]);
WRDATA(0x2e);
WRDATA(num_MODE[buffer[2]]);
//*************显示室内温度**********************
WRCOM(0x90);
WRDATA(0xca);
WRDATA(0xd2);
WRDATA(0xce);
WRDATA(0xc2);
WRDATA(0xa1);
WRDATA(0xc3);
WRDATA(num_MODE[buffer[3]]);
WRDATA(num_MODE[buffer[4]]);
WRDATA(0x2e);
WRDATA(num_MODE[buffer[5]]);
//**************时间****************
RD_CHIP(0x03);
i=senrev[1]>>4;
j=senrev[1]&0x0f;
WRCOM(0x88);
WRDATA(0xca);
WRDATA(0xb1);
WRDATA(0xbc);
WRDATA(0xe4);
WRDATA(0xa1);
WRDATA(0xc3);
WRDATA(num_MODE);
WRDATA(num_MODE[j]);
if(F_flash)
{
WRDATA(0x3a);
}
else
{
WRDATA(0x20);
}
j=i=0;
i=senrev[0]>>4;
j=senrev[0]&0x0f;
WRDATA(num_MODE);
WRDATA(num_MODE[j]);
//*************循环水加热**********************
if(F_hand)
{ WRCOM(0x98);
WRDATA(0xb1);WRDATA(0xc3);//泵
if(RL1)
{WRDATA(0xb9);WRDATA(0xa4);//工作
WRDATA(0xd7);WRDATA(0xf7);
}
else
{WRDATA(0xcd);WRDATA(0xa3);//停止
WRDATA(0xd6);WRDATA(0xb9);
}
WRCOM(0x9c);
WRDATA(0xbc);WRDATA(0xd3);//加热
WRDATA(0xc8);WRDATA(0xc8);
if(RL2)
{ WRDATA(0x18);
}
else WRDATA(0x20);
if(RL3)
{ WRDATA(0x18);
}
else WRDATA(0x20);
if(RL4)
{ WRDATA(0x18);
}
else WRDATA(0x20);
if(RL5)
{ WRDATA(0x18);
}
else WRDATA(0x20);
}
else if((!F_hand)&&(!RL1))
{ WRCOM(0x98);WRCOM(0x98);
WRDATA(0xc7);WRDATA(0xeb);//请按开关键
WRDATA(0xb0);WRDATA(0xb4);
WRDATA(0xbf);WRDATA(0xaa);
WRDATA(0xb9);WRDATA(0xd8);
WRDATA(0xbc);WRDATA(0xfc);
}
else
{
;
}
}
//*********************************************
void display3(void)
{ WRCOM(0x90);
WRDATA(0xca);
WRDATA(0xb1);
WRDATA(0xbc);
WRDATA(0xe4);
WRDATA(0x20);WRDATA(0x20);
WRDATA(num_MODE[buffer[3]]);
WRDATA(num_MODE[buffer[2]]);
WRDATA(0xa1);
WRDATA(0xc3);
WRDATA(num_MODE[buffer[1]]);
WRDATA(num_MODE[buffer[0]]);
}
//****************************
void display4(void)
{ //*********************************************************
WRCOM(0x80);
WRDATA(0xca); WRDATA(0xb1);WRDATA(0xb6); WRDATA(0xce);//时段
WRDATA(0xa3); WRDATA(0xb1);WRDATA(0xa1); WRDATA(0xc3);//1 :
//**********************************************************
WRCOM(0x90);
WRDATA(num_MODE[buffer[3]]);
WRDATA(num_MODE[buffer[2]]);
WRDATA(0xa1);
WRDATA(0xc3);
WRDATA(num_MODE[buffer[1]]);
WRDATA(num_MODE[buffer[0]]);
WRDATA(0xa9); WRDATA(0xa9);
WRDATA(num_MODE[buffer[7]]);
WRDATA(num_MODE[buffer[6]]);
WRDATA(0xa1);
WRDATA(0xc3);
WRDATA(num_MODE[buffer[5]]);
WRDATA(num_MODE[buffer[4]]);
//***********水温*******************************************
WRCOM(0x88);
WRDATA(0xcb);WRDATA(0xae);WRDATA(0xce);WRDATA(0xc2);
WRDATA(0xa1);WRDATA(0xc3);
WRDATA(num_MODE[temp[0]/10]);
WRDATA(num_MODE[temp[0]%10]);
WRDATA(0xa9); WRDATA(0xa9);
WRDATA(num_MODE[temp[1]/10]);
WRDATA(num_MODE[temp[1]%10]);
//*******************************************************
//室温
WRCOM(0x98);
WRDATA(0xca);WRDATA(0xd2);WRDATA(0xce);WRDATA(0xc2);
WRDATA(0xa1);WRDATA(0xc3);
WRDATA(num_MODE[temp[2]/10]);
WRDATA(num_MODE[temp[2]%10]);
WRDATA(0xa9); WRDATA(0xa9);
WRDATA(num_MODE[temp[3]/10]);
WRDATA(num_MODE[temp[3]%10]);
} |
|