#define uint unsigned int
#define uchar unsigned char
sbit IO=P1^0; /*定义DS1302和LCD控制端口号*/
sbit SCLK=P1^1;
sbit RST=P1^2;
sbit RS=P2^0;
sbit EN=P2^2;
sbit RW=P2^1;
sbit DS1820_DQ=P2^3;
int temperature[2];
uint temp1,temp2,temp3;
uchar *WEEK[]={\"MON\星期数组*/
uchar LCD_DSY_BUFFER1[]={\"2000-00-00 \日期时间初始化*/
uchar LCD_DSY_BUFFER2[]={\"00:00:00 'C\
uchar DateTime[7];
/*****************************************************************************
函数功能:延时函数DelayMS()
入口参数:ms
出口参数:
*****************************************************************************/
void DelayMS(uint ms)
{
unsigned char i;
while(ms--)
{
for(i = 0;i< 120;i++);
}
}
bit DS1820_Reset()
{ uchar i;
bit flag;
DS1820_DQ= 0;
for(i=240;i>0;i--);
DS1820_DQ = 1;
for(i=40;i>0;i--);
flag=DS1820_DQ;
for(i=200;i>0;i--);
return(flag);
}
void DS1820_WriteData(uchar wData)
{ uchar i,j;
for(i=8;i>0;i--)
{
DS1820_DQ=0;
for(j=2;j>0;j--);
DS1820_DQ=wData&0x01;
for(j=30;j>0;j--);
DS1820_DQ=1;
wData>>=1;
}
}
uchar DS1820_ReadData()
{
uchar i,j,TmepData;
for(i=8;i>0;i--)
{
TmepData>>=1;
DS1820_DQ=0;
for(j=2;j>0;j--);
DS1820_DQ=1;
for(j=4;j>0;j--);
if(DS1820_DQ==1)
{TmepData|=0x80;}
for(j=30;j>0;j--);
DS1820_DQ=1;
}
return(TmepData);
}
/*****************************************************************************
函数功能:往时钟模块DS1302写数据
入口参数:x
出口参数:
*****************************************************************************/
void Write_A_Byte_TO_DS1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
IO=x&0x01;SCLK=1;SCLK=0;x>>=1;
}
}
/*****************************************************************************
函数功能:从时钟模块DS1302读取数据
入口参数:
出口参数:十进制数
*****************************************************************************/
uchar Get_A_Byte_FROM_DS1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
{
b|=_crol_((uchar)IO,i);
SCLK=1;
SCLK=0;
}
return b/16*10+b%16;
}
/*****************************************************************************
函数功能:从时钟模块DS1302读取日期时间
入口参数:addr
出口参数:dat
*****************************************************************************/
uchar Read_Data(uchar addr)
{
uchar dat;
RST=0;
SCLK=0;
RST=1;
Write_A_Byte_TO_DS1302(addr);
dat=Get_A_Byte_FROM_DS1302();
SCLK=1;RST=0;
return dat;
}
/*****************************************************************************
函数功能:得到日期时间写入DateTime[7]数组
入口参数:
出口参数:
*****************************************************************************/
void GetTime()
{
uchar i,addr=0x81;
for(i=0;i<7;i++)
{
DateTime[i]=Read_Data(addr);
addr+=2;
}
}
/*****************************************************************************
函数功能:读LCD的状态
入口参数:
出口参数:
*****************************************************************************/
uchar Read_LCD_State()
{
uchar state;
RS=0;
RW=1;
EN=1;
DelayMS(1);
state=P0;
EN=0;
DelayMS(1);
return state;
}
/*****************************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*****************************************************************************/
void LCD_Busy_Wait()
{
while((Read_LCD_State()&0x08)==0x80);
DelayMS(5);
}
/*****************************************************************************
函数功能:写数据到LCD子程序
入口参数:cmd
出口参数:
*****************************************************************************/
void Write_LCD_Data(uchar dat)
{
LCD_Busy_Wait();
RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;
}
/*****************************************************************************
函数功能:写指令到LCD子程序
入口参数:
出口参数:
*****************************************************************************/
void Write_LCD_Command(uchar cmd)
{
LCD_Busy_Wait();
RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;
}
/*****************************************************************************
函数功能:设定显示位置子程序
入口参数:pos
出口参数:
*****************************************************************************/
void Set_LCD_POS(unsigned char p)
{
Write_LCD_Command(p|0x80);
}
/*****************************************************************************
函数功能:写入显示数据到LCD子程序
入口参数:dat
出口参数:
*****************************************************************************/
void Display_LCD_String(uchar p,uchar *s)
{
uchar i;
Set_LCD_POS(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(s[i]);
DelayMS(1);
}
}
/*****************************************************************************
函数功能:LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void Init_LCD()
{
Write_LCD_Command(0x38);
DelayMS(1);
Write_LCD_Command(0x01);
DelayMS(1);
Write_LCD_Command(0x06);
DelayMS(1);
Write_LCD_Command(0x0c);
DelayMS(1);
}
/*****************************************************************************
函数功能:把日期时间写入 LCD_DSY_BUFFER数组
入口参数:d,a
出口参数:
*****************************************************************************/
void Format_DateTime(uchar d,uchar *a)
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
void main()
{
uchar temp_data, temp_data_2;
uchar i,flag;
Init_LCD();
while(1)
{
DS1820_Reset();
DS1820_WriteData(0xcc);
DS1820_WriteData(0x44);
DS1820_Reset();
DS1820_WriteData(0xcc);
DS1820_WriteData(0xbe);
for (i=0;i<2;i++)
{
temperature[i]=DS1820_ReadData();
}
DS1820_Reset();
if(temperature[1]&0xfc)
{
flag=1;
temp_data=((temperature[1]<<8)|temperature[0]);
temp_data=((~temp_data)+1);
temp_data*=0.0625;
}
else
{
flag=0;
temp_data=((temperature[1]<<8)|temperature[0])*0.0625;
}
if(flag==1)
{
LCD_DSY_BUFFER2[10]='-';
}
else
{
LCD_DSY_BUFFER2[10]=' ';
}
temp1=temp_data/100+0x30;
temp2=(temp_data%100)/10+0x30;
temp3=(temp_data%100)%10+0x30;
LCD_DSY_BUFFER2[11]=temp1;
LCD_DSY_BUFFER2[12]=temp2;
LCD_DSY_BUFFER2[13]=temp3;
GetTime();
Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+2);
Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+5);
Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+8);
strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[3]]);
Format_DateTime(DateTime[2],LCD_DSY_BUFFER2);
Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+3);
Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+6);
Display_LCD_String(0x00,LCD_DSY_BUFFER1);
Display_LCD_String(0x40,LCD_DSY_BUFFER2);
}
}