⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ht1380.c

📁 HT1380 source code, ht1380.c is source code and ht1380.h is head file
💻 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 + -