#include <REG51.H>
#include <intrins.h>
#include "bianliang.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "ds1302.h"
/************************************************************
* 函数名称:uint HEX2BCD(uint hex_data)
* 功 能:HEX转为BCD子程序
* 入口参数:uint hex_data
* 出口参数:bcd_data
************************************************************/
/*
uint HEX2BCD(uint hex_data)
{
unsigned int bcd_data,temp;
temp =hex_data%100;
bcd_data=((unsigned int)hex_data)/100<<8;
bcd_data=bcd_data|temp/10<<4;
bcd_data=bcd_data|temp%10;
return(bcd_data);
} */
/************************************************************
* 函数名称:uchar BCD2HEX(uchar bcd_data)
* 功 能:BCD转为HEX子程序
* 入口参数:uchar bcd_data
* 出口参数:uchar hex_data
************************************************************/
/*uchar BCD2HEX(uchar bcd_data)
{
uchar hex_data;
hex_data=((bcd_data>>4)*10+(bcd_data & 0x0f));
return(hex_data);
}
*/
/**************液晶显示程序******************/
void show_time(unsigned int x,unsigned int y) //显示时间子函数
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
GotoXY(x,y);
Print(CurrentTime.TimeString); //显示时间
Delay1ms(50); //扫描延时
}
void show_time_set(unsigned int x,unsigned int y) //显示时间子函数
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
GotoXY(x,y);
Print(CurrentTime.TimeString); //显示时间
Delay1ms(400); //扫描延时
}
void show_date(unsigned int x,unsigned int y) //显示日期子函数
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
DateToStr(&CurrentTime); //日期数据转换液晶字符
GotoXY(x,y);
Print(CurrentTime.DateString); //显示日期
Delay1ms(50); //扫描延时
}
void show_date_set(unsigned int x,unsigned int y) //显示日期子函数
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
DateToStr(&CurrentTime); //日期数据转换液晶字符
GotoXY(x,y);
Print(CurrentTime.DateString); //显示日期
Delay1ms(200); //扫描延时
}
void show_temp(unsigned int x,unsigned int y) //显示温度子函数
{
ReadTemp(); //开启温度采集程序
temp_to_str(); //温度数据转换成液晶字符
GotoXY(x,y); //液晶字符显示位置
Print(TempBuffer); //显示温度
Delay1ms(50); //扫描延时
}
void show_week(unsigned int x,unsigned int y)
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
DateToStr(&CurrentTime); //日期数据转换液晶字符
GotoXY(x,y);
Print(week_value); //显示星期
GotoXY(x-4,y);
Print("Week"); //在液晶上显示 字母 week
Delay1ms(50); //扫描延时
}
void show_week_set(unsigned int x,unsigned int y)
{
DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
DateToStr(&CurrentTime); //日期数据转换液晶字符
GotoXY(x,y);
Print(week_value); //显示星期
GotoXY(x-4,y);
Print("Week"); //在液晶上显示 字母 week
Delay1ms(200); //扫描延时
}
/**************液晶显示程序结束******************/
char chang1(char temp1)
{ unsigned char i;
if(temp1==0x10||temp1==0x20||temp1==0x30||temp1==0x40||temp1==0x50)
{for(i=0;i<6;i++)
{
temp1++;}
return(temp1);
}}
char chang2(char temp2)
{ unsigned char j;
if(temp2==0x5f||temp2==0x4f||temp2==0x3f||temp2==0x2f||temp2==0x0f)
{for(j=0;j<6;j++)
{
temp2--;}}
return(temp2);
}
bi(unsigned long t)
{
unsigned long c;
unsigned int n;
for(c=0;c<t;c++)
{
for(n=0;n<50;n++); //延时
BEEP=~BEEP; //取反输出到喇叭的信号
}
}
void scankey(void) // 主程序
{
unsigned int n;
if(!Set)
{
bi(100); //发出按键音
mdelay(8);
while(!Set); //等键松开
count=count+1; //scankey按一次,count就加1
done=1; //进入调整模式
for(n=0;n<2000;n++); //键去抖
}
}
void Menu_move(void) // 主程序
{
unsigned int n;
if(!Up)
{
bi(100); //发出按键音
mdelay(8);
while(!Up); //等键松开
count=count+1; //scankey按一次,count就加1
if (count==4)
count=1;
for(n=0;n<2000;n++); //键去抖
}
}
void menu_OK(void) // 主程序
{
unsigned int n;
if(!Set)
{
bi(100); //发出按键音
mdelay(8);
while(!Set); //等键松开
set_menu=1; //进入调整模式
for(n=0;n<2000;n++); //键去抖
}
}
/***************执行按键响应*********************************/
void outkey() //跳出调整模式,返回默认显示
{
uchar Second;
if(Out==0)
{ mdelay(8);
count=0;
hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
Second=Read1302(DS1302_SECOND);
Write1302(0x8e,0x00); //写入允许
Write1302(0x80,Second&0x7f);
Write1302(0x8E,0x80); //禁止写入
done=0;
LCD_clear();
Delay1ms(50);
bi(100); //按下时发出按键音
while(Out==0);
}
}
void time_Upkey()//升序按键
{
Up=1;
if(Up==0)
{
bi(100); //按下时发出按键音
mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_SECOND); //读取秒数
temp=temp+1; //秒数加1
temp=chang1(temp);
up_flag=1; //数据调整后更新标志
if(temp>0x59) //超过59秒,清零
temp=0;
break;
case 2:
temp=Read1302(DS1302_MINUTE); //读取分数
temp=temp+1; //分数加1
temp=chang1(temp);
up_flag=1;
if(temp>0x59) //超过59分,清零
temp=0;
break;
case 3:
temp=Read1302(DS1302_HOUR); //读取小时数
temp=temp+1; //小时数加1
temp=chang1(temp);
up_flag=1;
if(temp>0x1D) //超过23小时,清零
temp=0;
break;
default:break;
}
while(Up==0);
}
}
void date_Upkey()
{
Up=1;
if(Up==0)
{
bi(100); //按下时发出按键音
mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_WEEK); //读取星期数
temp=temp+1; //星期数加1
temp=chang1(temp);
up_flag=1;
if(temp>0x7)
temp=1;
break;
case 2:
temp=Read1302(DS1302_DAY); //读取日数
temp=temp+1; //日数加1
temp=chang1(temp);
up_flag=1;
if(temp>0x2B)
temp=0x01;
break;
case 3:
temp=Read1302(DS1302_MONTH); //读取月数
temp=temp+1; //月数加1
temp=chang1(temp);
up_flag=1;
if(temp>0xC)
temp=0x01;
break;
case 4:
temp=Read1302(DS1302_YEAR); //读取年数
temp=temp+1; //年数加1
temp=chang1(temp);
up_flag=1;
break;
default:break;
}
while(Up==0);
}
}
void time_Downkey()//序按键
{
Down=1;
if(Down==0)
{
bi(100); //按下时发出按键音
mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_SECOND); //读取秒数
temp=temp-1; //秒数减1
temp=chang2(temp);