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

📄 ht1381.c

📁 用MSP430(C)写的红外抄表程序,是初学者好代码
💻 C
字号:
//==================================//
//
//===================================//
#include "MSP430x14x.h"
//#include "MSP430x42x.h"
#include <stdlib.h>
#define  uchar  unsigned char

//P5.1  SCL
//P5.2  SDA

#define SDA_1       P5OUT |=  BIT2              //SDA = 1
#define SDA_0       P5OUT &=~ BIT2              //SDA = 0
#define SCL_1       P5OUT |=  BIT1              //SCL = 1
#define SCL_0       P5OUT &=~ BIT1              //SCL = 0
#define DIR_IN      P5DIR &=~ BIT2;  SDA_1      //I/O口为输入
#define DIR_OUT     P5DIR |=  BIT2              //I/0口为输出
#define SDA_IN      ((P5IN >> 2) & 0x01)        //Read SDA
#define T_RST_1     P5OUT |=  BIT3              //REST = 1
#define T_RST_0     P5OUT &=~ BIT3              //REST = 0

/*
#define SDA_1       P1OUT |=  BIT1              //SDA = 1
#define SDA_0       P1OUT &=~ BIT1              //SDA = 0
#define SCL_1       P1OUT |=  BIT0              //SCL = 1
#define SCL_0       P1OUT &=~ BIT0              //SCL = 0
#define DIR_IN      P1DIR &=~ BIT1;  SDA_1      //I/O口为输入
#define DIR_OUT     P1DIR |=  BIT1              //I/0口为输出
#define SDA_IN      ((P1IN >> 1) & 0x01)        //Read SDA
#define T_RST_1     P1OUT |=  BIT2              //REST = 1
#define T_RST_0     P1OUT &=~ BIT2              //REST = 0
*/
void Delay(unsigned char n)
{
  unsigned char i;
 for(i=0;i<n;i++);
}

/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往HT1381写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
  unsigned char i;
  for (i=0; i<8; i++)
  {
    SCL_0;
    Delay(5);
    if ((ucDa & 0x01) == 0x01)
    {
      SDA_1;
    }
    else
    {
      SDA_0;
    }
    Delay(5);
    SCL_1;
    ucDa = ucDa >> 1;
    Delay(5);
  }
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从HT1381读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
  unsigned char i;
  unsigned char TempBit  = 0;
  unsigned char TempData = 0;
  SCL_0;
  Delay(5);
  SDA_1;
  DIR_IN;
  for (i=0; i<8; i++)
  {
    Delay(5);
    SCL_1;
    Delay(5);
    if (SDA_IN == 0x01 /*sda==1*/)
    {
      TempBit = 1;
    }
    else
    {
      TempBit = 0;
    }
    TempBit = TempBit << 7;
    TempData = (TempData >> 1) | TempBit;
    SCL_0;
  }
  Delay(5);
  DIR_OUT;
  return(TempData);
}
/********************************************************************
*
* 名称: v_W1381
* 说明: 先写地址,后写命令/数据
* 功能: 往HT1381写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: HT1381地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1381(uchar ucAddr, uchar ucDa)
{
T_RST_0;
SCL_0;
T_RST_1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
SCL_1;
T_RST_0;
}
/********************************************************************
*
* 名称: uc_R1381
* 说明: 先写地址,后读命令/数据
* 功能: 读取HT1381某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: HT1381地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1381(uchar ucAddr)
{
uchar ucDa;
T_RST_0;
SCL_0;
T_RST_1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
SCL_1;
T_RST_0;
return(ucDa);
}


/********************************************************************
*
* 名称: v_Set1381
* 说明:
* 功能: 设置初始时间
* 调用: v_W1381()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1381(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1381(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1381(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

pSecDa++;
ucAddr +=2;
}
v_W1381(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1381
* 说明:
* 功能: 读取HT1381当前时间
* 调用: uc_R1381()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1381(uchar *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
*ucCurtime = uc_R1381(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucCurtime ++;
ucAddr += 2;
}
}

//**********************************************************************
//调用时钟IC的时候要先初始化三个IO口,设置成输出状态
//**********************************************************************
uchar time_w[7] = {0x30,0x30,0x08,0x10,0x10,0x01,0x08},time_r[7];

void main(void)
{
  unsigned char a,b;
  unsigned char *p;
  
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer
  DCOCTL = DCO0 + DCO1 + DCO2;              // Max DCO
  
  while(1)
  {
  P5DIR =  0xff;
  DIR_OUT;
  v_W1381(0x8e,0x00);
  v_W1381(0x80,0x00);
  a = 1;
  while(a);
  p = time_w;
  v_Set1381(p);
  p = time_r;
  v_Get1381(p);
  v_W1381(0x80,0x04);
  b = uc_R1381(0x81);
  b++;
  v_W1381(0x82,0x12);
  b = uc_R1381(0x83);
  a = 1;
  while(a);
  b++;
  }
}

⌨️ 快捷键说明

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