#include<avr/io.h>
#include<stdlib.h>
#include<inttypes.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include"data.h"
#define INT8U unsigned char
#define CLK1 PORTD|= 0X01 //PD0CLK置1 其它口不变
#define CLK0 PORTD&=~0X01 //PD0为CLK置0
#define SID1 PORTD|= 0X02 //PD1为SID置1
#define SID0 PORTD&=~0X02 //PA1为SID置0
#define RESET11 PORTD|=0X40 //PA1为SID置0
#define DS00 PORTD&=~0X20 //PD0CLK置1 其它口不变
#define DS11 PORTD|=0X20 //PD0为CLK置0
#define CS11 PORTD|= 0X04 //PD1为SID置1
#define CS00 PORTD&=~0X04 //PA1为SID置0
#define AS00 PORTD&=~0X08 //PD0CLK置1 其它口不变
#define AS11 PORTD|=0X08 //PD0为CLK置0
#define RW11 PORTD|= 0X10 //PD1为SID置1
#define RW00 PORTD&=~0X10
#define DATAOUT11 PORTA|=0X01
#define DATAOUT00 PORTA&=~0X01
#define SCKOUT11 PORTC|=0X01
#define SCKOUT00 PORTC&=~0X01
#define noACK 0
#define ACK 1
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111
#define uint unsigned int
#define uchar unsigned char
void s_connectionreset(void);
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
void calc_sth11(float *p_humidity ,float *p_temperature);
float calc_dewpoint(float h,float t);
INT8U at[10]={0x09,0x08,0x07,0x04,0x02,0x00,0x06,0x05,0x03,0x01}; //时标寄存器地址缓冲区,依次为年月日时分秒
INT8U time[10]={8,10,4,0,0,50,1,0,0,0};//初始化时间
INT8U b[10];
INT8U c[10];
uchar s[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
char q,w,e,r,t;
uchar Enter_Flag=0;
uchar F_Flag;
void mDelaymS( unsigned char delay )/* 以毫秒为单位延时,适用于24MHz时钟 */
{
unsigned char m, j, c;
for ( m = delay; m != 0; m -- )
{
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
}
}
void Sendcode( void ) /* 送命令码首字节 */ /*按命令格式发送*/
{
unsigned char m;
for(m=0;m<5;m++) /* 发送5个1 */
{
SID1;CLK0; //SID=1 CLK=0
CLK1; //CLK=1上升沿
}
for(m=0;m<3;m++) /* 发送3个0 */
{
SID0;CLK0; //SID=0 CLK=0
CLK1; //CLK=1上升沿
}
}
void Sendbyte( void ) /* 发送数据首字节 */
{
unsigned char m;
for(m=0;m<5;m++) /* 发送5个1 */
{
SID1;CLK0; //SID=1,CLK=0
CLK1; //CLK=1上升沿
}
SID0;
CLK0;
CLK1;
SID1;
CLK0;
CLK1;
SID0;
CLK0;
CLK1;
}
/* 送一个字节数据到液晶 */
void Senddata8( unsigned char dat )
{
unsigned char m,t,a;
a=dat;
t=2;
while(t--)
{
for(m=0;m<4;m++)
{
a=dat&0x80;
if(a==0x80)
{
SID1; //SID=1
CLK0;
CLK1;
}
else
{
SID0; //SID=0
CLK0;
CLK1;
}
dat<<=1;
}
for(m=0;m<4;m++) /* 发送4个0 */
{
SID0;
CLK0; //SID=0 CLK=0
CLK1; //CLK=1上升沿
}
}
}
/* 发送命令 */
void Sendcmd( unsigned char command )
{
mDelaymS(150);
Sendcode(); /* 发送5个1三个0(11111000)*/
Senddata8(command);
}
/* 发送数据 */
void Senddata( unsigned char dat )
{
Sendbyte(); /* 发送5个1,一个0,一个1,一个0(11111010) */
Senddata8(dat);
}
/* 发送地址 */
void Sendadr( unsigned char line )
{
Sendcode();
Senddata8(line);
}
/* 初始化LCD */
void InitLcd( void )
{
mDelaymS(5000);
Sendcmd(0x30); // 命令格式详见函数SetShowMode()
Sendcmd(0x0c); // 指令码00001DCB
// D控制整体显示的开关 1为开显示 0为关显示;
// C控制光标的开与关 1为有光标 0为无光标;
// B控制光标是否闪烁 1为闪烁 0不闪烁。
Sendcmd(0x01);// 清除显示内容
}
/* 清显示屏幕 */
void Clear_Screen( void )
{
Sendcmd(0x01);
}
/* 发送汉字 */
void Put_Str( unsigned char *str,unsigned char row )
{
unsigned char *m;
Sendadr(row); /* 只需发一次地址,以后其地址自动变化 */
for(m=str;*m!=0x00;m++)
{
Senddata(*m);
}
}
//========发送数字==============================
void Sendsignal( INT8U x, INT8U dizhi2 )
{
INT8U j;
Sendadr(dizhi2); //Sendaddress( dizhi2 );
j=x/10;
Senddata(s[j]);
j=x%10;
Senddata(s[j]);
}
//========发送数字==============================
void Sendsignal1( INT8U x, INT8U dizhi2 )
{
INT8U j;
Sendadr(dizhi2); //Sendaddress( dizhi2 );
j=x/100;
Senddata(s[j]);
j=x/10%10;
Senddata(s[j]);
j=x%10;
Senddata(s[j]);
}
//========发送数字==============================
void Sendsignal2( INT8U x, INT8U dizhi2 )
{
INT8U j;
Sendadr(dizhi2); //Sendaddress( dizhi2 );
j=x/1000;
Senddata(s[j]);
j=x/100%10;
Senddata(s[j]);
j=x/10%10;
Senddata(s[j]);
j=x%10;
Senddata(s[j]);
}
//..............星期转换...........//
void Xingqi( INT8U x, INT8U dizhi2 )
{
INT8U j;
j=x;
switch(j)
{
case 1:
Put_Str( "一",dizhi2 );
break;
case 2:
Put_Str( "二",dizhi2 );
break;
case 3:
Put_Str( "三",dizhi2 );
break;
case 4:
Put_Str( "四",dizhi2 );
break;
case 5:
Put_Str( "五",dizhi2 );
break;
case 6:
Put_Str( "六",dizhi2 );
break;
case 7:
Put_Str( "日",dizhi2 );
break;
}
}
void DS12887_Init(void)
{
char temp;
CS00;
DS11;
RW11;
DDRB=0xFF;
PORTB=0X0A;
AS11;
AS00;
PORTB=0x2f; //时钟频率为32.768kHz,中断周期500ms
RW00;
RW11;
DDRB=0xFF;
PORTB=0X0C;
AS11;
AS00;
DDRB=0x00;
PORTB=0XFF;
DS00;
temp=PINB; //时钟频率为32.768kHz,中断周期500ms
temp=PINB; //时钟频率为32.768kHz,中断周期500ms
DS11;
DDRB=0xFF;
PORTB=0X0D;
AS11;
AS00;
DDRB=0x00;
PORTB=0XFF;
DS00;
temp=PINB; //时钟频率为32.768kHz,中断周期500ms
temp=PINB; //时钟频率为32.768kHz,中断周期500ms
DS11;
DDRB=0xFF;
PORTB=0X0B;
AS11;
AS00;
PORTB=0x76; //时钟频率为32.768kHz,中断周期500ms
RW00;
RW11;
}
void DS12887_Write(INT8U *dt)
{
INT8U i;
//写允许12887命令使其工作,b寄存器最高位置0
DDRB=0xFF;
PORTB=0X0B;
AS11;
AS00;
PORTB=0x80;
RW00;
RW11;
for(i=0;i<10;i++)
{
DDRB=0xFF;
PORTB=at[i];
AS11;
AS00;
PORTB=*(dt+i);
RW00;
RW11;
}
DDRB=0xFF;
PORTB=0X0B;
AS11;
AS00;
PORTB=0X7F;
RW00;
RW11;
}
void DS12887_Read(INT8U *dt)
{
INT8U i,temp;
do{
DDRB=0xFF;
PORTB=0X0A;
AS11;
AS00;
DDRB=0x00;
PORTB=0XFF;
DS00;
temp=PINB;
temp=PINB;
DS11;
} while(temp&0X80); //检测芯片是否处在更新周期阶段
for(i=0;i<10;i++)
{
DDRB=0xFF;
PORTB=at[i];
AS11;
AS00;
DDRB=0x00;
PORTB=0XFF;
DS00;
*(dt+i)=PINB;
*(dt+i)=PINB;
DS11;
}
}
delay(unsigned int t)
{
while(t--);
return t;
}
INT8U key_process(void)
{
INT8U key_value=0,temp;
DDRA=0x01;
PORTA=0xFE;
temp=PINA;
temp=(temp&0xFE);
if(temp!=0xFE)
{
while(PINA!=0xFE)
{
switch(temp)
{
case (0xFC):
key_value=1;
break;
case (0xFA):
key_value=2;
break;
case (0xF6):
ke