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

📄 ht1381.h~

📁 和泰公司的实时时钟RTC IC HT1381的读写程序,使用的是AVR 的M16.
💻 H~
字号:
#define BIT(x)   (1 << (x))

/*复位脚*/    
#define RST_LOW	  PORTD &= ~(BIT(0))  /*电平置低*/
#define RST_HIGH  PORTD |= BIT(0)     /*电平置高*/
#define RST_IN	  DDRD &= ~(BIT(0))   /*方向输入*/
#define RST_OUT	  DDRD |= BIT(0)      /*方向输出*/

/*双向数据*/
#define IO_LOW	  PORTD &= ~(BIT(1))  /*电平置低*/
#define IO_HIGH	  PORTD |= BIT(1)     /*电平置高*/
#define IO_R	  PIND & BIT(1)       /*电平读取*/
#define IO_IN	  DDRD &= ~(BIT(1))   /*方向输入*/
#define IO_OUT	  DDRD |= BIT(1)      /*方向输出*/

/*时钟信号*/
#define SCK_LOW	  PORTD &= ~(BIT(2))  /*电平置低*/
#define SCK_HIGH  PORTD |= BIT(2)     /*电平置高*/
#define SCK_IN	  DDRD &= ~(BIT(2))   /*方向输入*/
#define SCK_OUT	  DDRD |= BIT(2)      /*方向输出*/

#define HT1381_sec_add			0x80		//秒数据地址
#define HT1381_min_add			0x82		//分数据地址
#define HT1381_hr_add			0x84		//时数据地址
#define HT1381_date_add			0x86		//日数据地址
#define HT1381_month_add		0x88		//月数据地址
#define HT1381_day_add			0x8a		//星期数据地址
#define HT1381_year_add			0x8c		//年数据地址
#define HT1381_control_add		0x8e		//控制数据地址
//#define HT1381_charger_add		0x90 		//适用于ds1302			 
#define HT1381_clkburst_add		0xbe

//unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x23,0x59,0x00,0x02};
unsigned char time_buf[7];


/*向HT1381写入一字节数据*/
void HT1381_write_byte(unsigned char addr, unsigned char written_data) 
{
	unsigned char i;
	RST_HIGH;		/*启动HT1381总线*/
	
	/*写入目标地址:addr*/
	IO_OUT;
	addr = addr & 0xFE;    /*最低位置零*/
	for (i = 0; i < 8; i ++) 
	   {
	    if (addr & 0x01) 
		{IO_HIGH;}
	    else {IO_LOW;}
		SCK_HIGH;
		SCK_LOW;
		addr = addr >> 1;
	      }
	
	/*写入数据:written_data*/
	IO_OUT;
	for (i = 0; i < 8; i ++) 
	    {
	    if (written_data & 0x01)
	        {IO_HIGH;}
	     else {IO_LOW;}
		SCK_HIGH;
		SCK_LOW;
		written_data = written_data >> 1;
		}
	RST_LOW;					/*停止HT1381总线*/
}

/*从HT1381读出一字节数据*/
unsigned char HT1381_read_byte(unsigned char addr) 
{
	unsigned char i;
	unsigned char temp;
	RST_HIGH;					/*启动HT1381总线*/

	/*写入目标地址:addr*/
	IO_OUT;
	addr = addr | 0x01;/*最低位置高*/
	for (i = 0; i < 8; i ++) 
	   {
	     if (addr & 0x01) {IO_HIGH;}
	     else { IO_LOW;}
	     SCK_HIGH;
	     SCK_LOW;
	     addr = addr >> 1;
	   }
	
	/*输出数据:temp*/
	IO_IN;
	for (i = 0; i < 8; i ++) 
	   {
		temp = temp >> 1;
		if (IO_R) 
		  {temp |= 0x80;}
		else {temp &= 0x7F;}
		SCK_HIGH;
		SCK_LOW;
	    }
	RST_LOW;					/*停止HT1381总线*/
	return temp;
}

/*向HT1381写入时钟数据*/
/*void HT1381_write_time(void) 
{
	HT1381_write_byte(HT1381_control_add,0x00);		//关闭写保护 
	HT1381_write_byte(HT1381_sec_add,0x80);			//暂停 
	//HT1381_write_byte(HT1381_charger_add,0xa9);		//涓流充电 
	HT1381_write_byte(HT1381_year_add,time_buf[1]);		//年 
	HT1381_write_byte(HT1381_month_add,time_buf[2]);	//月 
	HT1381_write_byte(HT1381_date_add,time_buf[3]);		//日 
	HT1381_write_byte(HT1381_hr_add,time_buf[4]);		//时 
	HT1381_write_byte(HT1381_min_add,time_buf[5]);		//分
	HT1381_write_byte(HT1381_sec_add,time_buf[6]);		//秒
	HT1381_write_byte(HT1381_day_add,time_buf[7]);		//周
        HT1381_write_byte(HT1381_sec_add,0x00);			//使能振荡
	HT1381_write_byte(HT1381_control_add,0x80);		//打开写保护 
}   */

/*从HT1381读出时钟数据*/
void HT1381_read_time(void)  
{ 
	time_buf[0]=HT1381_read_byte(HT1381_year_add);		//年 
	time_buf[1]=HT1381_read_byte(HT1381_month_add);		//月 
	time_buf[2]=HT1381_read_byte(HT1381_date_add);		//日 
	time_buf[3]=HT1381_read_byte(HT1381_hr_add);		//时 
	time_buf[4]=HT1381_read_byte(HT1381_min_add);		//分 
	time_buf[5]=(HT1381_read_byte(HT1381_sec_add))&0x7F;    //秒 
	time_buf[6]=HT1381_read_byte(HT1381_day_add);		//周 
}

/*HT1381初始化函数*/
void HT1381_init(void) 
{
	RST_LOW;			/*RST脚置低*/
	SCK_LOW;			/*SCK脚置低*/
	RST_OUT;			/*RST脚设置为输出*/
	SCK_OUT;			/*SCK脚设置为输出*/ 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -