📄 clock.c
字号:
/************************************************
* 公司 :ss
* 文件名 : clock.c
* 功能 : 时间操作
* 作者 : noahzhou
* 创建日期: 07-12-04
* 修改日期: 07-12-04
* 版本 : VER1.3
* 规范:变量第一字母小写,函数(主函数除外)第一字母大写
* $$$: 表示要注意的地方,条件不同,要改动
**************************************************/
#include <MSP430x16x.h>
#include "clock.h"
//IO控制线
#define I2CPORT_SEL P1SEL //IIC控制口
#define I2CPORT_OUT P1OUT //IIC控制口
#define I2CPORT_IN P1IN
#define I2CPORT_DIR P1DIR
#define SCL BIT0 //时钟:P1.0
#define SDA BIT2 //数据:P1.2
#define RST BIT3 //复位:P1.3
//1302命令
/*
#define CmdRdSec 0x81
#define CmdRdMin 0x83
#define CmdRdHour 0x85
#define CmdRdDate 0x87
#define CmdRdMonth 0x89
#define CmdRdDay 0x8b
#define CmdRdYear 0x8d
#define CmdRdControl 0x8f
#define CmdRdTrickleCharge 0x91
#define CmdRdClockBurst 0xbf
#define CmdWrSec 0x80
#define CmdWrMin 0x82
#define CmdWrHour 0x84
#define CmdWrDate 0x86
#define CmdWrMonth 0x88
#define CmdWrDay 0x8a
#define CmdWrYear 0x8c
#define CmdWrControl 0x8e
#define CmdWrTrickleCharge 0x90
#define CmdWrClockBurst 0xbe
*/
/*-----------------------------------------
--功能:DS1302管脚初始化
--入口:无
--出口:无
--状态:
--周期: cycles
-------------------------------------------
--*/
void Clock_IO_Init(void)
{
I2CPORT_SEL &= ~(RST + SDA + SCL);// RST:IO SDA: IO SCL:IO
I2CPORT_DIR |= RST + SDA + SCL ;// RST:O SDA: O SCL:O
I2CPORT_OUT |= RST + SDA + SCL ;// RST:1 SDA: 1 SCL:1
}
//------------------------------------------------------------
//功能: SDA置高电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_SDA_H(void)
{
//I2CPORT_DIR |= SDA;
I2CPORT_OUT |= SDA;
_NOP();
_NOP();
//I2CPORT_DIR &= ~SDA;
}
//------------------------------------------------------------
//功能: SDA置低电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_SDA_L(void)
{
//I2CPORT_DIR |= SDA;
I2CPORT_OUT &=~ SDA;
_NOP();
_NOP();
//I2CPORT_DIR &= ~SDA;
}
//------------------------------------------------------------
//功能: SCL置高电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_SCL_H(void)
{
I2CPORT_DIR |= SCL;
I2CPORT_OUT |= SCL;
_NOP();
_NOP();
//I2CPORT_DIR &= ~SCL;
}
//------------------------------------------------------------
//功能: SCL置低电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_SCL_L(void)
{
I2CPORT_DIR |= SCL;
I2CPORT_OUT &=~ SCL;
_NOP();
_NOP();
// I2CPORT_DIR &= ~SCL;
}
//------------------------------------------------------------
//功能: RST置高电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_RST_H(void)
{
//I2CPORT_DIR |= RST;
I2CPORT_OUT |= RST;
_NOP();
_NOP();
}
//------------------------------------------------------------
//功能: RST置低电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_RST_L(void)
{
// I2CPORT_DIR |= RST;
I2CPORT_OUT &=~ RST;
_NOP();
_NOP();
}
//------------------------------------------------------------
//功能: 发送一个字节数据
//入口: unsigned char nValue-字节数据
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_SendByte(unsigned char nValue)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((nValue&BIT0)==BIT0) // 从bit0开始发送
I2C_SDA_H(); //如果是1 输出高电平,
else
I2C_SDA_L(); //如果是 0,输出低电平;
_NOP();
I2C_SCL_H();
_NOP();
I2C_SCL_L();//SCK=0;
_NOP();
nValue>>=1;
}
}
//------------------------------------------------------------
//功能: 读取一个字节数据
//入口: no
//出口: unsigned int字节数据
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
unsigned char I2C_ReadByte(void)
{
unsigned char i;
unsigned char nTemp=0;
I2CPORT_DIR &=~ SDA;// SDA input
for(i=0;i<8;i++)
{
nTemp>>=1;
//等待从器件送出数据
//I2CPORT_DIR &=~ SDA;
if(I2CPORT_IN & SDA)
nTemp |=0x80;
I2C_SCL_H();
_NOP();
I2C_SCL_L();//下降沿读出
_NOP();
}
//I2CPORT_DIR |= SDA;//SDA output
return nTemp;
}
//------------------------------------------------------------
//功能: 写DS1302
//入口: unsigned char Value-数值,unsigned char Address-地址
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void Write_1302(unsigned char Address,unsigned char Value)
{
I2CPORT_DIR |= SDA;//SDA output noahzhou
I2CPORT_DIR |= SCL;//SCL output noahzhou
I2C_RST_L();
I2C_SCL_L();
I2C_RST_H();
I2C_SendByte(Address);//发送地址字节
I2C_SendByte(Value);//发送数据字节
I2C_SCL_L();
I2C_RST_L();
I2C_SCL_H();//NOAHZHOU
I2CPORT_DIR &=~ SDA;// SDA input noahzhou
I2CPORT_DIR &=~ SCL;// SCL input noahzhou
}
//------------------------------------------------------------
//功能: 读DS1302
//入口: unsigned int Address-读取地址
//出口: unsigned int-返回数据
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
unsigned int Read_1302(unsigned int Address)
{
unsigned char Value;
I2CPORT_DIR |= SDA;//SDA output noahzhou
I2CPORT_DIR |= SCL;//SCL output noahzhou
I2C_RST_L();
I2C_SCL_L();
I2C_RST_H();
I2C_SendByte(Address);//发送地址字节
Value = I2C_ReadByte();
I2C_SCL_L();
I2C_RST_L();
I2C_SCL_H();//noahzhou
I2CPORT_DIR &=~ SDA;// SDA input noahzhou
I2CPORT_DIR &=~ SCL;// SCL input noahzhou
return Value;
}
//------------------------------------------------------------
//功能: 设置DS1302
//入口: unsigned char addr-地址,unsigned char *init_time-时间数组,unsigned char n-长度
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void Set_Time(unsigned char addr,unsigned char *init_time,unsigned char n)
{
unsigned char i;
Write_1302(0x8e,0x00); //允许写
for(i=n;i>0;i--)
{
Write_1302(addr,*init_time);
init_time++;
addr+=2;
}
// addr+=2;
// Write_1302(addr,*init_time);
Write_1302(0x8e,0x80); //写保护
}
//------------------------------------------------------------
//功能: 读取DS1302
//入口: no
//出口: no
//状态:待测试
//周期:7599cyc 950us
//修改:07-08-17
//------------------------------------------------------------
void Get_Time(void) //
{
// unsigned char i, addr,temp_time[7],temp1,temp2;
unsigned char i, addr;
addr=0x81;
for(i=0;i<7;i++)
{
get_time[i]=Read_1302(addr);
addr+=2;
}
}
//------------------------------------------------------------
//功能: 1302时间信息写入
//入口: *config_time 配置时间信息首地址
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void Config_Clock(unsigned char *config_time)
{
I2C_SCL_L(); //SCK=0
I2C_RST_L(); //RST=0,复位
Write_1302(0x8e,0x00);
Write_1302(0x90,0x00);
Set_Time(0x80,config_time,7);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -