**********************************************************/
#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();
}
}
|