📄 ht1380.c
字号:
#include "board.h"
#include "ht1380.h"
extern unsigned char RTCIs1380;
static write_protect=0;
void init_ht1380();
void write_ht1380_byte(char data);
char read_ht1380_byte(void);
char read_ht1380_single(char addr);
void write_ht1380_single(char addr,char data);
void read_ht1380_burst(char *data);
void write_ht1380_burst(char *data);
void ProtectRTC(char flag);
void ReadRTC(TIME_S2 *DateTime);
int WriteRTC(TIME_S2 *DateTime);
void WriteRTC_New(TIME_S2 *DateTime);
void ReadRTC_New(TIME_S2 * DateTime);
#define BIT0 0x0001 /* IC register bit use */
#define BIT1 0x0002
#define BIT2 0x0004
#define BIT3 0x0008
#define BIT4 0x0010
#define BIT5 0x0020
#define BIT6 0x0040
#define BIT7 0x0080
#define BIT8 0x0100
#define BIT9 0x0200
#define BIT10 0x0400
#define BIT11 0x0800
#define BIT12 0x1000
#define BIT13 0x2000
#define BIT14 0x4000
#define BIT15 0x8000
void init_ht1380()
{
char i,data[8];
if(RTCIs1380)
{
IOPMOD|=(0x01<<RTC_CE);
IOPDATA&=~(0x01<<RTC_CE);
IOPMOD|=(0x01<<RSTRTC);
IOPMOD|=(0x01<<RTCLK);
IOPDATA&=~(0x01<<RSTRTC);
IOPDATA&=~(0x01<<RTCLK);
write_ht1380_single(7,0x00);
write_ht1380_single(0,0x00);
}
else //use RTC-4543
{
IOPMOD|=(0x01<<RTC_CE);
IOPMOD|=(0x01<<RTC_CLK);
IOPMOD|=(0x01<<RTC_WR);
IOPDATA&=~(0x01<<RTC_CE);
IOPDATA&=~(0x01<<RTC_CLK);
IOPDATA&=~(0x01<<RTC_WR);
}
}
void write_ht1380_byte(char data)
{
char i,temp;
IOPMOD|=(0x01<<RTIO);//RTIO:OUTPUT
for(i=0;i<8;i++)
{
temp=data&(0x01<<i);
if(temp)IOPDATA|=(0x01<<RTIO);//RTIO:1
else IOPDATA&=~(0x01<<RTIO);//RTIO:0
IOPDATA&=~(0x01<<RTCLK);//RTCLK:0
IOPDATA|=(0x01<<RTCLK);//RTCLK:1
IOPDATA&=~(0x01<<RTCLK);//RTCLK:0
}
}
char read_ht1380_byte(void)
{
char i,temp=0;
IOPMOD&=~(0x01<<RTIO);//RTIO:INPUT
IOPDATA&=~(0x01<<RTCLK);//RTCLK:0
for(i=0;i<8;i++)
{
temp=(temp>>1);
IOPDATA|=(0x01<<RTCLK);//RTCLK:1
if(IOPDATA&(0x01<<RTIO))temp|=0x80;
IOPDATA&=~(0x01<<RTCLK);//RTCLK:0
}
return temp;
}
char read_ht1380_single(char addr)
{
char temp;
IOPDATA|=(0x01<<RSTRTC);//RSTRTC:1
temp=0x81+((addr&0x07)<<1);
write_ht1380_byte(temp);
temp=read_ht1380_byte();
IOPDATA&=~(0x01<<RSTRTC);//RSTRTC:0
return(temp);
}
void write_ht1380_single(char addr,char data)
{
char temp;
IOPDATA|=(0x01<<RSTRTC);//RSTRTC:1
temp=0x80+((addr&0x07)<<1);
write_ht1380_byte(temp);
write_ht1380_byte(data);
IOPDATA&=~(0x01<<RSTRTC);//RSTRTC:0
}
void read_ht1380_burst(char *data)
{
int i;
IOPDATA|=(0x01<<RSTRTC);//RSTRTC:1
write_ht1380_byte(0x0Bf);
for(i=0;i<8;i++)
{
*data=read_ht1380_byte();
data++;
}
IOPDATA&=~(0x01<<RSTRTC);//RSTRTC:0
}
void write_ht1380_burst(char *data)
{
int i;
IOPDATA|=(0x01<<RSTRTC);//RSTRTC:1
write_ht1380_byte(0x0BE);
for(i=0;i<8;i++)
{
write_ht1380_byte(*data);
data++;
}
IOPDATA&=~(0x01<<RSTRTC);//RSTRTC:0
}
void ProtectRTC(char flag)
{
if(flag==1)
{
write_protect=1;
write_ht1380_single(7,0x80);
}
else
{
write_protect=0;
write_ht1380_single(7,0x00);
}
}
void ReadRTC(TIME_S2 *DateTime)
{
unsigned char i;
unsigned char data[8];
if(RTCIs1380==0)
{
ReadRTC_New(DateTime);
return;
}
read_ht1380_burst(data);
DateTime->Second= data[0];
DateTime->Minute = data[1];
DateTime->Hour = data[2];
DateTime->Date = data[3];
DateTime->Month = data[4];
DateTime->Week = data[5];
DateTime->Year = (data[6]+0x2000);
}
int WriteRTC(TIME_S2 *DateTime)
{
unsigned char i;
unsigned char data[8];
if(RTCIs1380==0)
{
WriteRTC_New(DateTime);
return 0;
}
data[0]=DateTime->Second;
if(data[0]>0x60) return(-1);
data[1]=DateTime->Minute;
if(data[1]>0x60) return(-2);
data[2]=DateTime->Hour ;
if(data[2]>0x24) return(-3);
data[3]=DateTime->Date ;
if(data[3]>0x31) return(-4);
data[4]=DateTime->Month ;
if(data[4]>0x12) return(-5);
data[5]=DateTime->Week;
if(data[5]>0x7) return(-6);
data[6]=(DateTime->Year&0xFF) ;
if(write_protect==1)data[7]=0x80;
else data[7]=0x00;
write_ht1380_burst(data);
return(0);
}
void Delay2(unsigned short Cnt)
{
while (Cnt>0)
{
Cnt--;
}
}
//write RTC-4543
void WriteRTC_New(TIME_S2 *DateTime)
{
unsigned char i,data;
IOPMOD |=(0x01<<RTC_DATA);
IOPDATA |=(0x01<<RTC_WR);
Delay2(100);
IOPDATA |=(0x01<<RTC_CE);
Delay2(100);
IOPDATA&=~(0x01<<RTC_CLK);
Delay2(2);
for(i=0;i<52;i++)
{
if(i>=0 && i<8)
data=((DateTime->Second)>>i);
else if(i>=8 && i<16)
data=((DateTime->Minute)>>(i-8));
else if(i>=16 && i<24)
data=((DateTime->Hour)>>(i-16));
else if(i>=24 && i<28)
data=((DateTime->Week)>>(i-24));
else if(i>=28 && i<36)
data=((DateTime->Date)>>(i-28));
else if(i>=36 && i<44)
data=((DateTime->Month)>>(i-36));
else if(i>=44 && i<52)
data=((DateTime->Year&0xFF)>>(i-44));
if(data&BIT0)
IOPDATA |= (0x01<<RTC_DATA);
else
IOPDATA &= ~(0x01<<RTC_DATA);
Delay2(2);
IOPDATA |= (0x01<<RTC_CLK); // 1
Delay2(2);
IOPDATA &= ~(0x01<<RTC_CLK); //0
}
Delay2(100);
IOPDATA &=~(0x01<<RTC_CE);
Delay2(100);
IOPDATA &=~(0x01<<RTC_WR);
}
//read RTC-4543
void ReadRTC_New(TIME_S2 *DateTime)
{
unsigned char val,i,sec,min,hour,week,day,mon,year;
unsigned short temp;
sec=min=hour=week=day=mon=year=0;
IOPMOD &=~(0x01<<RTC_DATA);
IOPDATA&=~(0x01<<RTC_WR);
Delay2(100);
IOPDATA|=(0x01<<RTC_CE);
Delay2(100);
IOPDATA&=~(0x01<<RTC_CLK);
Delay2(2);
for(i=0;i<52;i++)
{
IOPDATA|=(0x01<<RTC_CLK); // data out
Delay2(2);
IOPDATA&=~(0x01<<RTC_CLK);
temp=IOPDATA;
if(i>=0 && i<8)
{
if(temp&BIT15)
sec|=(0x01<<i);
else
sec|=(0x00<<i);
}
else if(i>=8 && i<16)
{
if(temp&BIT15)
min|=(0x01<<(i-8));
else
min|=(0x00<<(i-8));
}
else if(i>=16 && i<24)
{
if(temp&BIT15)
hour|=(0x01<<(i-16));
else
hour|=(0x00<<(i-16));
}
else if(i>=24 && i<28)
{
if(temp&BIT15)
week|=(0x01<<(i-24));
else
week|=(0x00<<(i-24));
}
else if(i>=28 && i<36)
{
if(temp&BIT15)
day|=(0x01<<(i-28));
else
day|=(0x00<<(i-28));
}
else if(i>=36 && i<44)
{
if(temp&BIT15)
mon|=(0x01<<(i-36));
else
mon|=(0x00<<(i-36));
}
else if(i>=44 && i<52)
{
if(temp&BIT15)
year|=(0x01<<(i-44));
else
year|=(0x00<<(i-44));
}
}
Delay2(100);
IOPDATA&=~(0x01<<RTC_CE);
Delay2(100);
IOPDATA |=(0x01<<RTC_WR);
DateTime->Second= sec&0x7f;
DateTime->Minute = min&0x7f;
DateTime->Hour = hour&0x3f;
DateTime->Date = day&0x3f;
DateTime->Month = mon&0x1f;
DateTime->Week = week&0x07;
DateTime->Year = (year+0x2000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -