#define uchar unsigned char
#define uint unsigned int
#include <reg51.h>
#include <intrins.h>
extern uchar dbuf[4];
sbit DQ=P1^6;
bdata uchar dat;
sbit dat0=dat^0;
sbit dat7=dat^7;
//uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c};
uchar dbuf[4]={0,0,0,0};// 显示缓存
void Delay15(uchar n)
{ do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
//2*x+5
void Delay_Xus(uchar x) //x取值1~255;
{
while(--x);
}
//该函数返回为0,表示有DS1820,否则没有
bit Reset(void)
{ bit err;
DQ=0;
Delay15(40);
DQ=1;
Delay15(6);
err=DQ;
Delay15(18);
return(err);
}
void WrByte(uchar d)
{ uchar i;
dat=d;
for(i=8;i>0;i--)
{ DQ=0;
Delay15(1);
DQ=dat0;
dat=dat>>1;
Delay15(1);
DQ=1;
}
}
/* uchar RdByte(void)
{ uchar i;
dat=0;
for(i=8;i>0;i--)
{ dat=dat>>1;
DQ=0;
_nop_();
DQ=1;
Delay15(1);
dat7=DQ;
}
return(dat);
} */
uchar RdByte(void)
{
uchar i;
uchar tmp = 0;
DQ = 1; //准备读;
_nop_();
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先发;
DQ = 0; //Read init;
_nop_(); //2ms;
DQ = 1; //必须写1,否则读出来的将是不预期的数据;
Delay_Xus(2); //延时9us;
_nop_();
if(DQ) //在12us处读取数据;
tmp |= 0x80;
Delay_Xus(2); //延时55us;
DQ = 1; //恢复One Wire Bus;
_nop_();;
}
return tmp;
}
void Convert(void)
{ bit err;
err=Reset();
WrByte(0xcc); //跳过多传感器识别
WrByte(0x44); //启动温度转换
}
int Readt(void)
{ uchar h,l;
bit err;
err=Reset();
WrByte(0xcc); //跳过多传感器识别
WrByte(0xbe); //读暂存器
l=RdByte(); //温度低位
h=RdByte(); //温度高位
// return(h*256+l);
return l;
}
//****************************************************************************************
#include <reg52.h>
//#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
#define SECOND 0x80 //秒
#define MINUTE 0x82 //分鍾
#define HOUR 0x84 //小時
#define DAY 0x86 //天
#define MONTH 0x88 //月
#define WEEK 0x8a //星期
#define YEAR 0x8c //年
sbit DS1302_RST=P3^0;
sbit DS1302_SCLK=P3^1;
sbit DS1302_IO=P3^2;
typedef struct systime
{
uchar cYear;
uchar cMon;
uchar cDay;
uchar cHour;
uchar cMin;
uchar cSec;
uchar cWeek;
}SYSTIME;
void DS1302_Write(uchar D)
{
uchar i;
for(i=0;i<8;i++)
{
DS1302_IO=D&0x01;
DS1302_SCLK=1;
DS1302_SCLK=0;
D=D>>1;
}
}
uchar DS1302_Read()
{
uchar TempDat=0,i;
for(i=0;i<8;i++)
{
TempDat>>=1;
if(DS1302_IO) TempDat=TempDat|0x80;
DS1302_SCLK=1;
DS1302_SCLK=0;
}
return TempDat;
}
void WDS1302(uchar ucAddr, uchar ucDat)
{
DS1302_RST = 0;
DS1302_SCLK = 0;
DS1302_RST = 1;
DS1302_Write(ucAddr); // 地址,命令
DS1302_Write(ucDat); // 写1Byte数据
DS1302_SCLK = 1;
DS1302_RST = 0;
}
uchar RDS1302(uchar ucAddr)
{
uchar ucDat;
DS1302_RST = 0;
DS1302_SCLK = 0;
DS1302_RST = 1;
DS1302_Write(ucAddr); // 地址,命令
ucDat=DS1302_Read();
DS1302_SCLK = 1;
DS1302_RST = 0;
return ucDat;
}
void SetTime(SYSTIME sys)
{
WDS1302(YEAR,sys.cYear);
WDS1302(MONTH,sys.cMon&0x1f);
WDS1302(DAY,sys.cDay&0x3f);
WDS1302(HOUR,sys.cHour&0xbf);
WDS1302(MINUTE,sys.cMin&0x7f);
WDS1302(SECOND,sys.cSec&0x7f);
WDS1302(WEEK,sys.cWeek&0x07);
}
void GetTime(SYSTIME *sys)
{
uchar uiTempDat;
uiTempDat=RDS1302(YEAR|0x01);
(*sys).cYear=(uiTempDat>>4)*10+(uiTempDat&0x0f);
// uiTempDat=RDS1302(0x88|0x01);
// (*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);
uiTempDat=RDS1302(0x88|0x01);
(*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);
uiTempDat=RDS1302(DAY|0x01);
(*sys).cDay=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);
uiTempDat=RDS1302(HOUR|0x01);
(*sys).cHour=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);
uiTempDat=RDS1302(MINUTE|0x01);
sys->cMin=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);
uiTempDat=RDS1302(SECOND|0x01);
sys->cSec=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);
uiTempDat=RDS1302(MONTH|0x01);
(*sys).cMon=uiTempDat&0x17;
uiTempDat=RDS1302(WEEK|0x01);
sys->cWeek=uiTempDat&0x07;
}
//****************************************************************************************
//#include "Includes.h" //文件包含
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "One-Wire.h"
#define int8u unsigned char
/*************************************************
模块级变量申明
*************************************************/
/* void OneWire_Rst(void);
void OneWire_Init(void);
void OneWire_WriteByte(int8u cmd);
int8u OneWire_ReadByte(void);
void OneWire_Idle(void); */
void Delay_Xus(int8u x) //x取值1~255;
{
while(--x);
// int8u i;
// x /= 8;
// for(i=0;i<x;i++);
}
void Delay_Xms(int8u x) //x取值1~255;
{
int8u i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*************************************************
子函数定义
*************************************************/
void OneWire_Init(void)
{
DQ = 1;
_nop_();;
DQ = 0; //拉低数据线,准备Reset OneWire Bus;
Delay_Xus(125); //延时510us,Reset One-Wire Bus.
Delay_Xus(125);
DQ = 1; //提升数据线;
Delay_Xus(15); //延时35us;
while(DQ) //等待Slave 器件Ack 信号;
{
_nop_();;
}
Delay_Xus(60); //延时125us;
DQ = 1; //提升数据线,准备数据传输;
}
void OneWire_Rst(void)
{
DQ = 0; //拉低数据线,准备Reset OneWire Bus;
Delay_Xus(125); //延时511us,Reset One-Wire Bus.
DQ = 0;
Delay_Xus(125);
}
/*******************************************************************************
*** 函 数 名: void OneWire_WriteByte(int8u cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输 入: cmd:8bit;
*** 输 出: NO !
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
void OneWire_WriteByte(int8u cmd)
{
int8u i;
for(i=0;i<8;i++)
{
if(cmd & 0x01) //低位在前;
{
DQ = 0; //结束Recovery time;
_nop_();;
_nop_();;
_nop_();;
DQ = 1; //发送数据;
}
else
{
DQ = 0; //结束Rec time;
_nop_();;
_nop_();;
_nop_();;
//DQ = 0; //发送数据;
}
Delay_Xus(30); //等待Slave Device采样;
DQ = 1; //Recovery;
_nop_();; //Recovery Time Start;
cmd >>= 1;
}
}
/*******************************************************************************
*** 函 数 名: int8u OneWire_ReadByte(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: 8bit data;
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
int8u OneWire_ReadByte(void)
{
int8u i;
int8u tmp = 0;
DQ = 1; //准备读;
_nop_();;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先发;
DQ = 0; //Read init;
_nop_(); //2ms;
DQ = 1; //必须写1,否则读出来的将是不预期的数据;
Delay_Xus(2); //延时9us;
_nop_();
if(DQ) //在12us处读取数据;
tmp |= 0x80;
Delay_Xus(30); //延时55us;
DQ = 1; //恢复One Wire Bus;
_nop_();;
}
return tmp;
}
/*******************************************************************************
*** 函 数 名: void OneWire_Idle(void)
*** 功能描述: 总线空闲模式;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 修 改 人: 日期:2006-11-28
*** 函数说明:
/******************************************************************************/
void OneWire_Idle(void)
{
DQ = 1;
_nop_();;
}
/*******************************************************************************
*** 函 数 名: void DS18B20_Init(void)
*** 功能描述: 器件DS18B20初始化;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 修 改 人: 日期:2006-11-28
*** 函数说明:
/******************************************************************************/
void DS18B20_Init(void)
{
OneWire_Init();
}
/*******************************************************************************
*** 函 数 名: void DS18B20_RomCmd(int8u romCmd)
*** 功能描述: DS18B20Rom操作命令写;
*** 全局变量: NO !
*** 输 入: romCmd;
*** 输 出: NO !
*** 函数说明: 0x33:Read Rom; 0x55:Match Rom; 0xcc:Skip rom; 0xf0: Search rom;
0xec:Alarm Search.
/******************************************************************************/
void DS18B20_RomCmd(int8u romCmd) //仅写了SkipRom例程;
{
switch(romCmd)
{
case 0xcc: //Skip Rom command;
OneWire_WriteByte(0xcc);
break;
default:
break;
}
}
/*******************************************************************************
*** 函 数 名: void DS18B20_MemCmd(int8u memCmd)
*** 功能描述: DS18B20Memory 操作命令;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 函数说明: 仅写了ConvertT(0x44) 和0xBE命令;
0x44:Convert T; 0xbe:Read Scratch-pad;
/******************************************************************************/
void DS18B20_MemCmd(int8u memCmd)
{
switch(memCmd)
{
case 0x44: //Start to Convert temperature;
OneWire_WriteByte(0x44);
_nop_();;
DS18B20_Busy();
Delay_Xms(250); //延时750ms;
Delay_Xms(250);
Delay_Xms(250);
break;
case 0xbe: //Read scratchpad;
OneWire_WriteByte(0xbe);
break;
default:
break;
}
}
/*******************************************************************************
*** 函 数 名: void DS18B20_ReadDat(int8u len,int8u *buf)
*** 功能描述: 读取DS18B20内部的Scratchpad内容;
*** 全局变量: NO !
*** 输 入: len:将要读取的数据长度;
*** 输 出: buf:数据缓存;
*
*** 函数说明:
/******************************************************************************/
void DS18B20_ReadDat(int8u len,int8u *buf)
{
int8u i;
for(i=0;i<len;i++)
{
buf[i] = OneWire_ReadByte();
}
OneWire_Rst();
OneWire_Idle();
}
/*******************************************************************************
*** 函 数 名: void DS18B20_Busy(void)
*** 功能描述: 内部模数转换中,忙
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 函数说明:
/******************************************************************************/
void DS18B20_Busy(void)
{
OneWire_Idle();
}
//****************************************************************************************
#include <reg52.h>
#include "12864.h"
#include "model.h"
#include "ds1302.h"
#include "one-wire.h"
#include "lunar.h"
#include "input_080627.h"
//#include "yinli.h"
#define uchar unsigned char
#define uint unsigned int
#define NoUpLine 1
#define UpLine 0
#define NoUnderLine 1
#define UnderLine 0
#define FALSE 0
#define TRUE 1
uchar bdata gTmp;
sbit t0 = gTmp^0;
sbit t1 = gTmp^1;
sbit t2 = gTmp^2;
sbit t3 = gTmp^3;
sbit t4 = gTmp^4;
sbit t5 = gTmp^5;
sbit t6 = gTmp^6;
sbit t7 = gTmp^7;
uchar dispBuf[7];
uchar T0_Count=0,Tmp_Count=0;
bit T0_Flag,Tmp_Flag,Flash_Flag;
SYSTIME sys; //系统日期
SPDATE SpDat; //农历日期
//设置时间的标志
bit Hour_Flag=TRUE,Min_Flag=TRUE,Sec_Flag=TRUE;
bit Year_Flag=TRUE,Mon_Flag=TRUE,Day_Flag=TRUE;
uchar State_Set=0; //设置状态 (用来区分此时是在设置时,分,秒,日,月,年)
bit State_Flag=FALSE,Inc_Flag=FALSE,Dec_Flag=FALSE; //用来标志三个按键是否按下。
uchar code Mon2[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
0,31,29,31,30,31,30,31,31,30,31,30,31};
/***********************************************************
cDat: 要显示的数
X: 行数 0~7
Y: 列数 0~127
show_flag: 是否反白显示,0反白,1不反白
upline: 上划线, 0表示带上划线
underline: 下划线, 0表示带下划线
返回: 无
************************************************************/
void LCD_ShowTime(char cDat,uchar X,uchar Y,bit show_flag,bit up,bit under)
{
uchar s[2];
s[0]=cDat/10+'0';
s[1]=cDat%10+'0';
en_disp(X,Y,2,Asc,s,show_flag,up,under);
}
/***********************************************************
// 函数名: Show_YMD()
// 入口参数: void
// 出口参数: void
// 功能: 显示公历与农历的年、月、日、星期
// 说明: 普通模式每天刷新一次
// 设置模式每次循环刷新一次
***********************************************************/
void Show_YMD() //显示年月日星期
{
uchar uiTempDat;
uiTempDat=RDS1302(0x88|0x01);
sys.cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);
LCD_ShowTime(sys.cMon,2,5,Mon_Flag,NoUpLine,NoUnderLine); //月
hz_disp(4,5,1,uMod[1],1,NoUpLine,NoUnderLine);
Show16X32(2,27,ucNum3216[sys.cDay/10],Day_Flag);
Show16X32(2,43,ucNum3216[sys.cDay%10],Day_Flag); //年
/
hz_disp(6,8,2,ucLunar[13],1,UpLine,UnderLine);
if(sys.cWeek==7)
hz_disp(6,40,1,uMod[2],1,UpLine,UnderLine); //星期日
else
hz_disp(6,40,1,ucLunar[sys.cWeek],1,UpLine,UnderLine); //星期
/
LCD_ShowTime(20,0,9,1,UpLine,UnderLine);
LCD_ShowTime(sys.cYear,0,25,Year_Flag,UpLine,UnderLine);
hz_disp(0,41,1,uMod[0],1,UpLine,UnderLine); //年
SpDat=GetSpringDay(sys.cYear,sys.cMon,sys.cDay); //得到农历日期
//显示农历日期
if(SpDat.cMon==1) //农历月
hz_disp(4,64,1,ucLunar[15],1,UpLine,NoUnderLine); //"正"
else if(SpDat.cMon==11)
hz_disp(4,64,1,ucLunar[16],1,UpLine,NoUnderLine); //"冬"
else if(SpDat.cMon==12)
hz_disp(4,64,1,ucLunar[17],1,UpLine,NoUnderLine); //"腊"
else
hz_disp(4,63,1,ucLunar[SpDat.cMon],1,UpLine,NoUnderLine); //"二"~"十"
if(SpDat.cDay/10==1 && SpDat.cDay%10>0) //显示"十" 例如"十四"而不是"一四"
hz_disp(4,95,1,ucLunar[10],1,UpLine,NoUnderLine);
else if(SpDat.cDay/10==2 && SpDat.cDay%10>0) //显示"廿" 例如"廿三"而不是"二四"
hz_disp(4,95,1,ucLunar[19],1,UpLine,NoUnderLine);
else
hz_disp(4,95,1,ucLunar[SpDat.cDay/10],1,UpLine,NoUnderLine); //正常显示数字
if(!(SpDat.cDay%10)) // //"十"
hz_disp(4,111,1,ucLunar[10],1,UpLine,NoUnderLine);
else //正常数字
hz_disp(4,111,1,ucLunar[SpDat.cDay%10],1,UpLine,NoUnderLine);
//显示生肖
hz_disp(0,104,1,SX[(uint)(2000+SpDat.cYear)%12],1,UpLine,UnderLine); //生肖
//显示天干地支
hz_disp(2,95,1,TianGan[(uint)(2000+SpDat.cYear)%10],1,NoUpLine,NoUnderLine); //天干
hz_disp(2,111,1,DiZhi[(uint)(2000+SpDat.cYear)%12],1,NoUpLine,NoUnderLine); //地支
}
/**************************************************************
// 函数名: LCD_ShowTemp()
// 入口参数: void
// 出口参数: void
// 功能: 采集温度并显示
// 说明: 30秒更新一次
***************************************************************/
void LCD_ShowTemp()
{
uchar datTm[2];
float temp;
uchar buftmp;
if(!Tmp_Flag) return;
Tmp_Flag=FALSE;
DS18B20_Init();
DS18B20_RomCmd(0xcc); //Skip Rom command;
Delay_Xms(20);
DS18B20_MemCmd(0x44); //Convert T command;
DS18B20_Init();
DS18B20_RomCmd(0xcc);
DS18B20_MemCmd(0xbe);
DS18B20_ReadDat(2,datTm);
gTmp = datTm[0];
temp = (uchar)t0 * 0.0625 + (uchar)t1 * 0.125 + (uchar)(t2) * 0.25 + (uchar)(t3) * 0.5;
buftmp = (uchar)(temp*10);
dispBuf[2] = '.';
dispBuf[3] = buftmp + '0';
buftmp = (uchar)t4 + (uchar)t5*2 + (uchar)t6*4 + (uchar)t7*8;
gTmp = datTm[1];
gTmp &= 0x07;
buftmp += (gTmp * 16);
dispBuf[0] = (buftmp/10) + '0';
dispBuf[1] = (buftmp%10) + '0';
dispBuf[4] = 0xdf; //摄氏度;
dispBuf[2] = 'C';
en_disp(0,65,2,Asc,dispBuf,1,UpLine,UnderLine);
}
/***********************************************************
// 函数名: LCD_ShowWNL()
// 入口参数: void
// 出口参数: void
// 功能: 显示万年历
// 说明:
***********************************************************/
void LCD_ShowWNL()
{
LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine); //秒 每次循环钟刷新一次
if(!sys.cSec || State_Set) //分 在普通模式时每分钟刷新一次
LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); // 在设置模式时每次循环刷新一次
if(!sys.cSec && !sys.cMin || State_Set) //时 在普通模式时每小时刷新一次
LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine); // 在设置模式时每次循环刷新一次
if(!sys.cSec && !sys.cMin && !sys.cHour || State_Set ) //公历农历的年、月、日、星期
{ //普通模式每天刷新一次
Show_YMD(); //设置模式每次循环刷新一次
if(State_Set==7) State_Set=0;
}
}
/***********************************************************
// 函数名: CAL_Init()
// 入口参数: void
// 出口参数: void
// 功能: 日期初始化
// 说明: 星期通过计算得到
***********************************************************/
void CAL_Init()
{
sys.cYear=0x09;
sys.cMon=0x05;
sys.cDay=0x05;
sys.cHour=0x10;
sys.cMin=0x27;
sys.cSec=0x00;
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);
}
/***********************************************************
// 函数名: SFR_Init()
// 入口参数: void
// 出口参数: void
// 功能: 寄存器初始化
// 说明: 定时器0控制温度采集,定时器1控制按键扫描
***********************************************************/
void SFR_Init()
{
T0_Flag=FALSE;
Tmp_Flag=TRUE;
Flash_Flag=FALSE;
TMOD=0x11;
ET0=1;
ET1=1;
TH0= (-50000)/256;
TL0= (-50000)%256;
TH1= (-10000)/256;
TL1= (-10000)%256;
EA=1;
}
/***********************************************************
// 函数名: GUI_Init()
// 入口参数: void
// 出口参数: void
// 功能: 图形界面初始化
// 说明: 一些永远不耍更新的图形(如线条,"年"、"月"、"日"等)
只是在初始化时写入,中间过程不再更新。
***********************************************************/
void GUI_Init()
{
uint i,j;
进入界面///
LCD12864_init();
ClearLCD();
LCD_ShowTemp(); //在显示图片之前启动温度转换
img12864_disp(uBmp); //显示图片
for(i=0;i<10;i++)
for(j=0;j<32767;j++);
ClearLCD();
/描绘框架//
Rect(0,0,127,63,1);
Line(62,0,62,62,1);
Line(0,48,127,48,1);
Line(0,15,127,15,1);
Line(24,15,24,48,1);
Line(63,32,128,32,1);
Line(97,0,97,15,1);
//Line(24,15,24,48,1);
时间初始化//
SetTime(sys); //设置时间
GetTime(&sys); //获得时间
Show_YMD();
LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);
en_disp(6,103,1,Asc,":",1,UpLine,UnderLine);
LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine);
en_disp(6,79,1,Asc,":",1,UpLine,UnderLine);
LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);
hz_disp(2,64,1,ucLunar[11],1,NoUpLine,NoUnderLine); //"农"
hz_disp(2,80,1,ucLunar[12],1,NoUpLine,NoUnderLine); //"历"
hz_disp(4,79,1,uMod[1],1,UpLine,NoUnderLine); //"月"
显示初始化温度//
en_disp(0,65,2,Asc,dispBuf,1,UpLine,UnderLine);
hz_disp(0,81,1,ucLunar[18],1,UpLine,UnderLine);
}
/***********************************************************
// 函数名: DecToBCD()
// 入口参数: void
// 出口参数: void
// 功能: 把时间由10进制转为BCD
// 说明: DS1302以BCD存储
***********************************************************/
void DecToBCD()
{
sys.cHour=(((sys.cHour)/10)<<4)+((sys.cHour)%10);
sys.cMin=(((sys.cMin)/10)<<4)+((sys.cMin)%10);
sys.cSec=((sys.cSec/10)<<4)+((sys.cSec)%10);
sys.cYear=((sys.cYear/10)<<4)+((sys.cYear)%10);
sys.cMon=((sys.cMon/10)<<4)+((sys.cMon)%10);
sys.cDay=((sys.cDay/10)<<4)+((sys.cDay)%10);
}
/***********************************************************
// 函数名: Time_Set()
// 入口参数: void
// 出口参数: void
// 功能: 时间设置
// 说明: 具体的时间设置
***********************************************************/
void Time_Set()
{
if(State_Flag) //设置键按下
{
State_Flag=FALSE;
State_Set++;
//State_Set%=7;
if(State_Set==8) State_Set=0;
}
Hour_Flag=TRUE;Min_Flag=TRUE;Sec_Flag=TRUE;
Year_Flag=TRUE;Mon_Flag=TRUE;Day_Flag=TRUE;
switch(State_Set) //设置类型
{
case 0: //无设置
break;
case 1: //设置时
Hour_Flag=FALSE;
break;
case 2: //设置分
Min_Flag=FALSE;
break;
case 3: //设置秒
Sec_Flag=FALSE;
break;
case 4: //设置天
Day_Flag=FALSE;
break;
case 5:
Mon_Flag=FALSE; //设置月
break;
case 6:
Year_Flag=FALSE; //设置年
break;
case 7: //无动作,设置此值为让"年"的反白消失。
break;
}
if(Inc_Flag) //加键被按下
{
Inc_Flag=FALSE;
switch(State_Set)
{
case 0:
break;
case 1: //小时加
sys.cHour++;
(sys.cHour)%=24;
break;
case 2: //分加
sys.cMin++;
sys.cMin%=60;
break;
case 3: //秒加
sys.cSec++;
sys.cSec%=60;
break;
case 4: //天加
(sys.cDay)=(sys.cDay%Mon2[YearFlag(sys.cYear)][sys.cMon])+1;
break;
case 5: //月加
sys.cMon=(sys.cMon%12)+1;
break;
case 6:
sys.cYear++; //年加
sys.cYear=sys.cYear%100;
break;
}
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay); //算出星期
DecToBCD(); //转为BCD
SetTime(sys); //存入DS1302
}
if(Dec_Flag) //减键按下
{
Dec_Flag=FALSE;
switch(State_Set)
{
case 0:
break;
case 1:
sys.cHour=(sys.cHour+23)%24; //时减
break;
case 2: //分减
sys.cMin=(sys.cMin+59)%60;
break;
case 3: //秒减
sys.cSec=(sys.cSec+59)%60;
break;
case 4: //天减
sys.cDay=((sys.cDay+Mon2[YearFlag(sys.cYear)][sys.cMon]-1)%Mon2[YearFlag(sys.cYear)][sys.cMon]);
if(sys.cDay==0) sys.cDay=Mon2[YearFlag(sys.cYear)][sys.cMon];
break;
case 5: //月减
sys.cMon=(sys.cMon+11)%12;
if(sys.cMon==0) sys.cMon=12;
break;
case 6: //年减
sys.cYear=(sys.cYear+99)%100;
break;
}
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);
DecToBCD();
SetTime(sys);
}
}
void main()
{
SFR_Init();
CAL_Init();
GUI_Init();
TR0=1;
TR1=1;
while(1)
{
GetTime(&sys); //获得时间
LCD_ShowTemp(); //显示温度
LCD_ShowWNL(); //显示万年历
Time_Set(); //时间设置
}
}
void timer0() interrupt 1 //控制温度采集
{
TH0= (-50000)/256;
TL0= (-50000)%256;
T0_Count++;
if(T0_Count==20)
{
Tmp_Count++;
T0_Count=0;
}
if(Tmp_Count==33)
{
Tmp_Count=0;
Tmp_Flag=TRUE;
}
}
void timer1() interrupt 3 //按