歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

時鐘芯片HT1380 操作源碼

//讀數據長度
#define  Long_ReadData   (uint8)3//7
//讀取的數據轉換成顯示數據
#define  ClockSwitch_TSEC(x) ((x>>4)&0X07)*10 + (x&0x0f) 
#define  ClockSwitch_TMIN(x) ((x>>4)&0X07)*10 + (x&0x0f) 
#define  ClockSwitch_THOR(x) ((x>>4)&0x03)*10 + (x&0x0f) 

//顯示數據轉換成讀取的數據 -- 設置時間時
#define  ClockSwitchB_TSEC(x) (((x/10)<<4) + (x%10)) 
#define  ClockSwitchB_TMIN(x) (((x/10)<<4) + (x%10)) 
#define  ClockSwitchB_THOR(x) (((x/10)<<4) + (x%10)) 


#define  HT1380OSC_ENB  (uint8)0X00 //振蕩使能
#define  HT1380OSC_DIS  (uint8)0X80
#define  MCLOCK24H      (uint8)0x00 //24H制
#define  MCLOCK12H      (uint8)0x80

//-----------------------------
#define  HT1380SLK_HIGH  P_SLK1380 = 1
#define  HT1380SLK_LOW    P_SLK1380 = 0

#define  HT1380DAT_HIGH  P_DAT1380Out = 1
#define  HT1380DAT_LOW    P_DAT1380Out = 0

#define  HT1380RST_HIGH  P_RST1380 = 1
#define  HT1380RST_LOW    P_RST1380 = 0
//讀數據端口
#define  HT1380DatIn   P_DAT1380In

//-----------------------------------------
void delay1380(void)
{
  uint8 i = 0 ;
 
  for(i=1;i>0;i--)//10
  {
    _asm("nop");
    _asm("nop");
    _asm("nop");
    _asm("nop");
    _asm("nop");
    _asm("nop");
    _asm("nop"); 
  }
}
/********************************************************************
*
* 名稱: HT1380WriteByte
* 說明:
* 功能: 往HT1381寫入1Byte數據
* 調用:
* 輸入: ucDa 寫入的數據
* 返回值: 無
***********************************************************************/
void HT1380WriteByte(uint8 Dat)
{
  uint8 i = 0 ;
 
  HT1380SLK_LOW ;
  for(i=0;i<8;i++)
  {
    if(Dat & 0x01)
    {
      HT1380DAT_HIGH ;
    }
    else
    {
      HT1380DAT_LOW ;
    }
    Dat >>= 1 ;
   
    HT1380SLK_HIGH ;
    delay1380();
    HT1380SLK_LOW ;
    delay1380(); 
       
  }
}
/********************************************************************
*
* 名稱: uint8 HT1380ReadByte
* 說明:
* 功能: 從HT1381讀取1Byte數據
* 調用:
* 輸入:
* 返回值: ACC
***********************************************************************/
uint8 HT1380ReadByte(void)
{
  uint8 i = 0 ;
  uint8 Dat=0 ;
 
  HT1380DAT_HIGH ; //數據置高後再讀  雙向口
  delay1380();
 
  if(HT1380DatIn)
  { 
    Dat |= 0x80 ; 
  } 
 
  for(i=0;i<7;i++)
  { 
    HT1380SLK_HIGH ;
    delay1380();
    HT1380SLK_LOW ;
    delay1380();
   
    Dat >>= 1 ;     
    if(HT1380DatIn)
    { 
      Dat |= 0x80 ; 
    }
       
  }
 
  return Dat ;
}
/********************************************************************
*
* 名稱: HT1380WriteByteAddr
* 說明: 先寫地址,後寫命令/數據
* 功能: 往HT1381寫入數據
* 調用: HT1380WriteByte()
* 輸入: ucAddr: HT1381地址, ucDa: 要寫的數據
* 返回值: 無
***********************************************************************/
void HT1380WriteByteAddr(uint8 ucAddr, uint8 ucDa)
{
  HT1380RST_LOW;
  HT1380SLK_LOW;
  HT1380RST_HIGH;
  HT1380WriteByte(ucAddr); /* 地址,命令 */
  HT1380WriteByte(ucDa); /* 寫1Byte數據*/
  HT1380SLK_HIGH;
  HT1380RST_LOW;
}
/********************************************************************
*
* 名稱: HT1380ReadByteAddr
* 說明: 先寫地址,後讀命令/數據
* 功能: 讀取HT1381某地址的數據
* 調用: HT1380WriteByte() , HT1380ReadByte()
* 輸入: ucAddr: HT1381地址
* 返回值: ucDa :讀取的數據
***********************************************************************/
uint8 HT1380ReadByteAddr(uint8 ucAddr)
{
    uint8 ucDa;
    HT1380RST_LOW;
    HT1380SLK_LOW;
    HT1380RST_HIGH;
    HT1380WriteByte(ucAddr); /* 地址,命令 */
    ucDa = HT1380ReadByte(); /* 讀1Byte數據 */
    HT1380SLK_HIGH;
    HT1380RST_LOW;
 
    return(ucDa);
}

/********************************************************************
*
* 名稱: HT1380SetTime
* 說明:
* 功能: 設置初始時間
* 調用: HT1380WriteByteAddr()
* 輸入: pSecDa: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年
* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 無
***********************************************************************/
void HT1380SetTime(uint8 *pSecDa)
{
  uint8 i;
  uint8 ucAddr = 0x80;
 
  HT1380WriteByteAddr(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
  for(i = Long_ReadData;i>0;i--)
  {
    HT1380WriteByteAddr(ucAddr,*pSecDa); /* 秒 分 時 日 月 星期 年 */
   
    pSecDa++;
    ucAddr += 2;
  }
  HT1380WriteByteAddr(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
}
/********************************************************************
*
* 名稱: HT1380ReadTime
* 說明:
* 功能: 讀取HT1381當前時間
* 調用: HT1380ReadByteAddr()
* 輸入: ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年
* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 無
***********************************************************************/
void HT1380ReadTime(uint8 *ucCurtime)
{
    uint8 i;
    uint8 ucAddr = 0x81;
 
    for (i=0;i<Long_ReadData;i++)
    {
      *ucCurtime = HT1380ReadByteAddr(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */
      ucCurtime ++;
      ucAddr += 2;
    }
}
//*************************************
// 函數名稱:CmdHT1380
// 函數功能:控制1380的數據讀、寫
// 入口參數:無
// 出口參數:無
// 返 回 值:無
//***************************************/
void Init_TH1380(void)
{
//  uint8 SetTime[3] = {04,04,12} ;
 
//  HT1380SetTime(SetTime) ;
 
  HT1380WriteByteAddr(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
 
  HT1380WriteByteAddr(0x80,HT1380OSC_ENB);//振蕩允許
  HT1380WriteByteAddr(0x84,MCLOCK24H);//24小時制
 
  HT1380WriteByteAddr(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
}
//*************************************
// 函數名稱:ClockSwitchMCU
// 函數功能:把時鐘芯片的數據轉換成顯示數據
// 入口參數:時鐘芯片內所讀的數據
// 出口參數:實際顯示的時間數據
// 返 回 值:無
//***************************************/
void ClockSwitchMCU(uint8 *ClockDat,uint8 *McuDat )
{
  *McuDat = ClockSwitch_TSEC(*ClockDat) ;
  ClockDat ++ ;
  McuDat ++ ;
  *McuDat = ClockSwitch_TMIN(*ClockDat) ;
  ClockDat ++ ;
  McuDat ++ ;
  *McuDat = ClockSwitch_THOR(*ClockDat) ; 
 
}
//*************************************
// 函數名稱:MCUSwitchClock
// 函數功能:把顯示的數據轉換成時鐘芯片內的可存儲數據
// 入口參數:顯示的時間數據
// 出口參數:時鐘芯片內所存儲的數據格式
// 返 回 值:無
//***************************************/
void MCUSwitchClock(uint8 *McuDat,uint8 *ClockDat)
{
  *ClockDat = ClockSwitchB_TSEC(*McuDat) ;
  ClockDat ++ ;
  McuDat ++ ;
  *ClockDat = ClockSwitchB_TMIN(*McuDat) ;
  ClockDat ++ ;
  McuDat ++ ;
  *ClockDat = ClockSwitchB_THOR(*McuDat) ; 
 
}

Copyright © Linux教程網 All Rights Reserved