**********************************************************/
#include "STC89.h"
#include "LCD.H"
#include "SHT11.H"
#include "DS1302.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar set=1,K1_dat,K2_dat,VOUT1=12,VOUT2=12,VOUT3=12,VOUT4=12,VOUT5=12,VOUT6=12; //狀態記時變量
uchar SHI,FEN,MAO,YAN,RE,YER,week,t,s;
sbit OUT1=P1^5;
sbit OUT2=P1^4;
sbit OUT3=P1^3;
sbit OUT4=P1^2;
sbit OUT5=P1^1;
sbit OUT6=P1^0;
sbit K1=P3^7;
sbit K2=P3^6;
sbit K3=P3^5;
sbit K4=P3^4;
void GJ()
{
P0=0xff;
cs2 = 1;
cs1 = 1;
EN = 1;
RW = 1;
RS = 1;
RGB_G=0;
RGB_R=1;
set=0;
t=0;
s=0;
}
void ZJM()
{
InitLCD();
Display0816(0,0,2,SZ0816); //日期,星期圖標
Display0816(0,1,0,SZ0816);
Display0816(0,4,11,SZ0816);
Display0816(0,7,11,SZ0816);
Display1616(0,5,3,HZ1616);
Display1616(0,6,4,HZ1616);
Display0816(6,2,10,SZ0816); //溫濕度圖標
Display1616(6,2,6,HZ1616);
Display0816(6,12,10,SZ0816);
Display1616(6,7,5,HZ1616);
Display1632(2,5,10,SZ1632);
Display1632(2,2,10,SZ1632);
}
void DSJM() //輸出控制界面
{
set=1;
Display1616(0,2,7,HZ1616); //輸出控制
Display1616(0,3,8,HZ1616);
Display1616(0,4,9,HZ1616);
Display1616(0,5,10,HZ1616);
Display0816(2,0,12,SZ0816); //
Display0816(2,1,13,SZ0816); //
Display0816(2,2,14,SZ0816); //
Display0816(2,3,1,SZ0816); //
Display0816(2,8,12,SZ0816); //
Display0816(2,9,13,SZ0816); //
Display0816(2,10,14,SZ0816); //
Display0816(2,11,2,SZ0816); //
Display0816(4,0,12,SZ0816); //
Display0816(4,1,13,SZ0816); //
Display0816(4,2,14,SZ0816); //
Display0816(4,3,3,SZ0816);
Display0816(4,8,12,SZ0816); //
Display0816(4,9,13,SZ0816); //
Display0816(4,10,14,SZ0816); //
Display0816(4,11,4,SZ0816); //
Display0816(6,0,12,SZ0816); //
Display0816(6,1,13,SZ0816); //
Display0816(6,2,14,SZ0816); //
Display0816(6,3,5,SZ0816); //
Display0816(6,8,12,SZ0816); //
Display0816(6,9,13,SZ0816); //
Display0816(6,10,14,SZ0816); //
Display0816(6,11,6,SZ0816); //
if(K1_dat==1&K2_dat==0)
{
F_Display1616(2,2,VOUT1,HZ1616); //OUT1
}
else
{
Display1616(2,2,VOUT1,HZ1616);
}
if(K1_dat==1&K2_dat==1)
{
F_Display1616(2,6,VOUT2,HZ1616); //OUT2
}
else
{
Display1616(2,6,VOUT2,HZ1616);
}
if(K1_dat==1&K2_dat==2)
{
F_Display1616(4,2,VOUT3,HZ1616); //OUT3
}
else
{
Display1616(4,2,VOUT3,HZ1616);
}
if(K1_dat==1&K2_dat==3)
{
F_Display1616(4,6,VOUT4,HZ1616); //OUT4
}
else
{
Display1616(4,6,VOUT4,HZ1616);
}
if(K1_dat==1&K2_dat==4)
{
F_Display1616(6,2,VOUT5,HZ1616); //OUT5
}
else
{
Display1616(6,2,VOUT5,HZ1616);
}
if(K1_dat==1&K2_dat==5)
{
F_Display1616(6,6,VOUT6,HZ1616); //OUT6
}
else
{
Display1616(6,6,VOUT6,HZ1616);
}
}
void desplay_WNL()
{
v_W1302(0x8f, 0);
MAO = bcdtodec(uc_R1302(0x81)); //讀出DS1302中的秒
v_W1302(0x8f, 0);
FEN = bcdtodec(uc_R1302(0x83)); //讀出DS1302中的分
v_W1302(0x8f, 0);
SHI = bcdtodec(uc_R1302(0x85)); //讀出DS1302中的小時
v_W1302(0x8f, 0);
week = bcdtodec(uc_R1302(0x8b)); //讀出DS1302中的小時
v_W1302(0x8f, 0);
RE = bcdtodec(uc_R1302(0x87)); //讀出DS1302中的日
v_W1302(0x8f, 0);
YER = bcdtodec(uc_R1302(0x89)); //讀出DS1302中的月
v_W1302(0x8f, 0);
YAN = bcdtodec(uc_R1302(0x8d)); //讀出DS1302中的年
Display0816(0,2,YAN/10%10,SZ0816); //年
Display0816(0,3,YAN%10,SZ0816);
Display0816(0,5,YER/10%10,SZ0816); //月
Display0816(0,6,YER%10,SZ0816);
Display0816(0,8,RE/10%10,SZ0816); //日
Display0816(0,9,RE%10,SZ0816);
Display1616(0,7,week%10,XQ1616); //星期幾
Display0816(6,0,temp%1000/100,SZ0816); //溫度
Display0816(6,1,temp%100/10,SZ0816);
Display0816(6,3,temp%10,SZ0816);
Display0816(6,10,humi%1000/100,SZ0816); //濕度
Display0816(6,11,humi%100/10,SZ0816);
Display0816(6,13,humi%10,SZ0816);
Display1632(2,0,SHI/10%10,SZ1632); //時間
Display1632(2,1,SHI%10,SZ1632);
Display1632(2,3,FEN/10%10,SZ1632);
Display1632(2,4,FEN%10,SZ1632);
Display1632(2,6,MAO/10%10,SZ1632);
Display1632(2,7,MAO%10,SZ1632);
F_Display1616(6,3,s,SJ);
F_Display1616(6,4,s+1,SJ);
t++;
if(t==3)
{
t=0;
s++;
if(s==9)
s=0;
}
}
void desplay_TS()
{
set=1;
if(K1_dat==2&K2_dat==0)
{
F_Display0816(0,2,YAN/10%10,SZ0816); //年
F_Display0816(0,3,YAN%10,SZ0816);
}
else
{
Display0816(0,2,YAN/10%10,SZ0816); //年
Display0816(0,3,YAN%10,SZ0816);
}
if(K1_dat==2&K2_dat==1)
{
F_Display0816(0,5,YER/10%10,SZ0816); //月
F_Display0816(0,6,YER%10,SZ0816);
}
else
{
Display0816(0,5,YER/10%10,SZ0816); //月
Display0816(0,6,YER%10,SZ0816);
}
if(K1_dat==2&K2_dat==2)
{
F_Display0816(0,8,RE/10%10,SZ0816); //日
F_Display0816(0,9,RE%10,SZ0816);
}
else
{
Display0816(0,8,RE/10%10,SZ0816); //日
Display0816(0,9,RE%10,SZ0816);
}
if(K1_dat==2&K2_dat==3)
{
F_Display1616(0,7,week%10,XQ1616); //星期幾
}
else
{
Display1616(0,7,week%10,XQ1616); //星期幾
}
if(K1_dat==2&K2_dat==4)
{
F_Display1632(2,0,SHI/10%10,SZ1632); //時間
F_Display1632(2,1,SHI%10,SZ1632);
}
else
{
Display1632(2,0,SHI/10%10,SZ1632); //時間
Display1632(2,1,SHI%10,SZ1632);
}
if(K1_dat==2&K2_dat==5)
{
F_Display1632(2,3,FEN/10%10,SZ1632);
F_Display1632(2,4,FEN%10,SZ1632);
}
else
{
Display1632(2,3,FEN/10%10,SZ1632);
Display1632(2,4,FEN%10,SZ1632);
}
Display1632(2,6,0,SZ1632);
Display1632(2,7,0,SZ1632);
Display0816(6,0,temp%1000/100,SZ0816); //溫度
Display0816(6,1,temp%100/10,SZ0816);
Display0816(6,3,temp%10,SZ0816);
Display0816(6,10,humi%1000/100,SZ0816); //濕度
Display0816(6,11,humi%100/10,SZ0816);
Display0816(6,13,humi%10,SZ0816);
F_Display1616(6,3,s,SJ);
F_Display1616(6,4,s+1,SJ);
t++;
if(t==30)
{
t=0;
s++;
if(s==9)
s=0;
}
}
void Write_DS1302()
{
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x80,0x80); //暫停
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x8c,dectobcd(YAN)); //寫入年
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x88,dectobcd(YER)); //寫入月
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x86,dectobcd(RE)); //寫入日
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x8a,dectobcd(week));//寫入星期
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x84,dectobcd(SHI)); //寫入小時
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x82,dectobcd(FEN)); //寫入分
v_W1302(0x8e,0x00); //寫保護關閉
v_W1302(0x80,0x00); //寫入秒
v_W1302(0x8e,0x80); //寫保護開啟
}
void Write_DS1302Init(void)
{
v_W1302(0x8e,0);
v_W1302(0x90,0xA9); //涓流充電開
v_W1302(0x8e,0x80); //寫保護
}
void wenshidu()
{
error=0; //初始化error=0,即沒有錯誤
error+=s_measure((uchar*)&temp_val.i,&checksum,TEMP); //溫度測量
error+=s_measure((uchar*)&humi_val.i,&checksum,HUMI); //濕度測量
if(error!=0) s_connectionreset(); ////如果發生錯誤,系統復位
else
{
humi_val.f=(float)humi_val.i; //轉換為浮點數
temp_val.f=(float)temp_val.i; //轉換為浮點數
calc_sth10(&humi_val.f,&temp_val.f); //修正相對濕度及溫度
temp=temp_val.f*10;
humi=humi_val.f*10;
}
}
void KEY()
{
if(K1==0) //設置
{
delay(10);
if(K1==0&&set>0)
{
K1_dat++; //界面標示變量
ClearScreen(0);//清屏
if(K1_dat>1)
{
t=0;
s=0;
K1_dat=0;
K2_dat=0;
Write_DS1302();
ZJM();
}
}
while(!K1&&set>0);
}
if(K2==0) //切換
{
delay(10);
if(K2==0&&(K1_dat==2||K1_dat==1)) //調時切換
{
K2_dat++;
if(K2_dat==6)
{
K2_dat=0;
}
}
while(!K2&&set==1);
}
if(K3==0) //減
{
delay(10);
if(K1_dat==1&&K2_dat==0&&set==1)
{
VOUT1=12;
OUT1=0;
}
if(K1_dat==1&&K2_dat==1&&set==1)
{
VOUT2=12;
OUT2=0;
}
if(K1_dat==1&&K2_dat==2&&set==1)
{
VOUT3=12;
OUT3=0;
}
if(K1_dat==1&&K2_dat==3&&set==1)
{
VOUT4=12;
OUT4=0;
}
if(K1_dat==1&&K2_dat==4&&set==1)
{
VOUT5=12;
OUT5=0;
}
if(K1_dat==1&&K2_dat==5&&set==1)
{
VOUT6=12;
OUT6=0;
}
if(K1_dat==2&&K2_dat==0&&set==1)
{
YAN--;
if(YAN==255)
YAN=0;
}
if(K1_dat==2&&K2_dat==1)
YER--;
if(YER==255)
YER=0;
if(K1_dat==2&&K2_dat==2)
RE--;
if(RE==255)
RE=0;
if(K1_dat==2&&K2_dat==3)
week--;
if(week==0)
week=1;
if(K1_dat==2&&K2_dat==4)
SHI--;
if(SHI==255)
SHI=0;
if(K1_dat==2&&K2_dat==5)
FEN--;
if(FEN==255)
FEN=0;
while(!K3&&set==1);
}
if(K4==0) //加
{
delay(10);
if(K4==0&&set==0)
{
set=1;
ClearScreen(0);//清屏
ZJM();
}
if(K1_dat==1&&K2_dat==0&&set==1)
{
VOUT1=11;
OUT1=1;
}
if(K1_dat==1&&K2_dat==1&&set==1)
{
VOUT2=11;
OUT2=1;
}
if(K1_dat==1&&K2_dat==2&&set==1)
{
VOUT3=11;
OUT3=1;
}
if(K1_dat==1&&K2_dat==3&&set==1)
{
VOUT4=11;
OUT4=1;
}
if(K1_dat==1&&K2_dat==4&&set==1)
{
VOUT5=11;
OUT5=1;
}
if(K1_dat==1&&K2_dat==5&&set==1)
{
VOUT6=11;
OUT6=1;
}
if(K1_dat==2&&K2_dat==0&&set==1)
YAN++;
if(YAN==100)
YAN=99;
if(K1_dat==2&&K2_dat==1)
YER++;
if(YER==13)
YER=12;
if(K1_dat==2&&K2_dat==2)
RE++;
if(RE==32)
RE=31;
if(K1_dat==2&&K2_dat==3)
week++;
if(week==8)
week=7;
if(K1_dat==2&&K2_dat==4)
SHI++;
if(SHI==24)
SHI=23;
if(K1_dat==2&&K2_dat==5)
FEN++;
if(FEN==60)
FEN=59;
if(K4==0&&set>1)
{
K1_dat=2;
while(!K4);
}
while(!K4&&set==1);
}
}
void main()
{
P1=0x00;
RGB_B=0;
Write_DS1302Init();
s_connectionreset(); //啟動連接復位
InitLCD();
desplay_bmp(FC_DZ);
delay(5000);
wenshidu();
ZJM();
while(1)
{
if(set>0&&K1_dat==0) //時間顯示界面
{
desplay_WNL();
wenshidu();
set++;
if(set==190)
{
set=0;
GJ();
}
}
if(set>0&&K1_dat==1) //定時設置主界面
{
DSJM();
}
if(set>0&&K1_dat==2) //時間設置界面
{
desplay_TS();
}
if(set==0)
{
RGB_B=~RGB_B;
delay(300);
}
else
RGB_B=~RGB_B;
KEY();
}
}
|