ht1381时钟芯片驱动
#include "global.h" //时钟芯片ht1381各引脚定义 #define HT1381_CS_GPIO_PORT GPIOD #define HT1381_CS_GPIO_PIN GPIO_PIN_3 #define HT1381CsHigh() (HT1381_CS_GPIO_PORT->ODR |= (u8)(HT1381_CS_GPIO_PIN)) #define HT1381CsLow() (HT1381_CS_GPIO_PORT->ODR &= (u8)(~HT1381_CS_GPIO_PIN)) #define HT1381_DATA_GPIO_PORT GPIOD #define HT1381_DATA_GPIO_PIN GPIO_PIN_2 #define HT1381DataHigh() (HT1381_DATA_GPIO_PORT->ODR |= (u8)(HT1381_DATA_GPIO_PIN)) #define HT1381DataLow() (HT1381_DATA_GPIO_PORT->ODR &= (u8)(~HT1381_DATA_GPIO_PIN)) #define HT1381DataOut() GPIO_Init(HT1381_DATA_GPIO_PORT,HT1381_DATA_GPIO_PIN,GPIO_MODE_OUT_PP_HIGH_FAST); #define HT1381DataIn() GPIO_Init(HT1381_DATA_GPIO_PORT,HT1381_DATA_GPIO_PIN,GPIO_MODE_IN_PU_NO_IT); #define HT1381DataStatus (HT1381_DATA_GPIO_PORT->IDR & HT1381_DATA_GPIO_PIN) #define HT1381_CLK_GPIO_PORT GPIOD #define HT1381_CLK_GPIO_PIN GPIO_PIN_0 #define HT1381ClkHigh() (HT1381_CLK_GPIO_PORT->ODR |= (u8)(HT1381_CLK_GPIO_PIN)) #define HT1381ClkLow() (HT1381_CLK_GPIO_PORT->ODR &= (u8)(~HT1381_CLK_GPIO_PIN)) extern void Int_HT1381(void); ICTimerTab_t ICTimerTab; ICTimerTab_t ICTimerTabBuf; void Delay_us(u8 data) { for(u8 i = 0; i <data;i++) { nop(); } } /******************************************************************** 往HT1381写入1Byte数据 ********************************************************************/ void Send_HT1380_1Byte(unsigned char tData) { unsigned char i; HT1381DataOut(); for(i=0;i<8;i++) { if((tData&0x01) != 0) { HT1381DataHigh(); } else { HT1381DataLow(); } tData >>= 1; Delay_us(8); HT1381ClkHigh(); Delay_us(5); HT1381ClkLow(); Delay_us(5); } } /******************************************************************** 往HT1381读取1Byte数据 ********************************************************************/ unsigned char Read_HT1380_1Byte(void) { unsigned char i,tData; HT1381DataIn(); for(i=0;i<8;i++) { HT1381ClkHigh(); Delay_us(8); tData >>= 1; if(!HT1381DataStatus) { tData &= 0x7f; } else { tData |= 0x80; } HT1381ClkLow(); Delay_us(5); } HT1381DataOut(); return tData; } /******************************************************************** * 名称: 往HT1381写入数据 * 说明: 先写地址,后写命令/数据 * 调用: Send_HT1380_1Byte * 输入: sAddr:HT1381地址,sData:要写的数据 ********************************************************************/ void Write_HT1381Addr_1Byte(unsigned char sAddr,unsigned char sData) { HT1381CsLow(); Delay_us(5); HT1381ClkLow(); Delay_us(5); HT1381CsHigh(); Send_HT1380_1Byte(sAddr); //写地址,命令 Send_HT1380_1Byte(sData); //写1Byte数据 HT1381ClkHigh(); Delay_us(5); HT1381CsLow(); } /******************************************************************** * 名称: 读取HT1381某地址的数据 * 说明: 先写地址,后写命令/数据 * 调用: Send_HT1380_1Byte,Read_HT1380_1Byte * 输入: sAddr:HT1381地址 * 返回值: sData:读取的数据 ********************************************************************/ unsigned char Read_HT1381Addr_1Byte(unsigned char sAddr) { unsigned char tData; HT1381CsLow(); Delay_us(5); HT1381ClkLow(); Delay_us(5); HT1381CsHigh(); Send_HT1380_1Byte(sAddr); //写地址,命令 tData = Read_HT1380_1Byte(); //写1Byte数据 HT1381ClkHigh(); Delay_us(5); HT1381CsLow(); return tData; } /******************************************************************** * 名称: 读取HT1381当前时间 * 调用: Read_HT1381Addr_1Byte * 输入: 保存当前时间地址+当前时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B ********************************************************************/ void Read_HT1381_NowTimer(void) { unsigned char i; unsigned char sAddr; unsigned char *p; sAddr = 0x81; p =(unsigned char*)&ICTimerTabBuf; for(i=0;i<7;i++) { *p = Read_HT1381Addr_1Byte(sAddr); p++; sAddr += 2; } } /******************************************************************** * 名称: 初始化HT1381 * 调用: Write_HT1381Addr_1Byte * 输入: 初始时间地址+初始时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B ********************************************************************/ void Int_HT1381(void) { unsigned char i; unsigned char sAddr; unsigned char *p; sAddr = 0x80; p =(unsigned char*)&ICTimerTabBuf; Write_HT1381Addr_1Byte(0x8e,0x00); //控制命令,WP=0,写操作? for(i=0;i<7;i++) { Write_HT1381Addr_1Byte(sAddr,*p); //秒,分,时,日,月,星期,年 p++; sAddr += 2; } Write_HT1381Addr_1Byte(0x8e,0x80); //控制命令,WP=1,写保护? } /******************************************************************** 上电初始化日期时间 ********************************************************************/ void Int_Timer(void) { //上电读取时钟芯片是否掉电 Read_HT1381_NowTimer(); if((ICTimerTabBuf.TimerSec&0x80) != 0) { Read_HT1381_NowTimer(); if((ICTimerTabBuf.TimerSec&0x80) != 0) { ICTimerTabBuf.TimerSec = 0x20; ICTimerTabBuf.TimerMin = 0x57; ICTimerTabBuf.TimerHour = 0x18; ICTimerTabBuf.TimerDay = 0x11; ICTimerTabBuf.TimerMonth = 0x07; ICTimerTabBuf.TimerWeek = 0x04; ICTimerTabBuf.TimerYear = 0x13; Int_HT1381(); //初始化HT1381 } } ICTimerTab.TimerSec = (ICTimerTabBuf.TimerSec/16) * 10 + (ICTimerTabBuf.TimerSec%16); ICTimerTab.TimerMin = (ICTimerTabBuf.TimerMin/16) * 10 + (ICTimerTabBuf.TimerMin%16); ICTimerTab.TimerHour = (ICTimerTabBuf.TimerHour/16) * 10 + (ICTimerTabBuf.TimerHour%16); ICTimerTab.TimerDay = (ICTimerTabBuf.TimerDay/16) * 10 + (ICTimerTabBuf.TimerDay%16); ICTimerTab.TimerMonth = (ICTimerTabBuf.TimerMonth/16) * 10 + (ICTimerTabBuf.TimerMonth%16); ICTimerTab.TimerWeek = (ICTimerTabBuf.TimerWeek/16) * 10 + (ICTimerTabBuf.TimerWeek%16); ICTimerTab.TimerYear = (ICTimerTabBuf.TimerYear/16) * 10 + (ICTimerTabBuf.TimerYear%16); }
硬件时钟--ht1381时钟芯片驱动
时间: 2024-12-21 07:27:44