📄 ds12.c
字号:
/*********************************************/
// 时钟 ds12cr887 调试程序
//
//
// by MARK_SHU 2007.04.12
/*********************************************/
#include"msp430x14x.h"
#include"DS12.h"
#define DATA_SEL P1SEL
#define DATA_DIR P1DIR
#define DATA_OUT P1OUT
#define DATA_IN P1IN
#define CONTROL_SEL P3SEL
#define CONTROL_DIR P3DIR
#define DS1 P3OUT |= BIT0 // DS 置 1
#define DS0 P3OUT &= ~BIT0 // DS 置 0
#define RW1 P3OUT |= BIT1 // RW 置 1
#define RW0 P3OUT &= BIT1 // RW 置 0
#define AS1 P3OUT |= BIT2 // AS 置 1
#define AS0 P3OUT &= ~BIT2 // AS 置 0
#define CS1 P3OUT |= BIT3 // CS 置 1
#define CS0 P3OUT &= ~BIT3 // CS 置 0
/**********************************/
// 时钟芯片启动函数
// 启动时钟芯片工作
// 该函数仅仅在时钟首次使用的时候用到一次
void start_ds12()
{
write8bit_ds12(0x0a,0x20); // 开启时钟 写寄存器A ,开启振荡器并允许RTC计时
}
/*********************************/
// 关闭时钟芯片
//
void close_ds12()
{
write8bit_ds12(0x0a,0x30) ;
}
/*********************************/
// 时钟芯片初始化函数
// 初始化 msp430 与 ds12cr887 连接的端口(功能选择,方向选择)
// 设定时钟存储格式和时间格式
void init_msp430_ds12()
{
DATA_SEL = 0X00 ; // P1 口 为端口功能
CONTROL_SEL &= ~(BIT0 + BIT1 + BIT2 +BIT3); // P3 口的 1 2 3 4 位为 IO 口功能
CONTROL_DIR |= BIT0 + BIT1 + BIT2 + BIT3 ; // 控制端口 DS RW AS CS方向为输出
}
/**********************************/
//
void init_ds12()
{
start_ds12() ;
}
/**********************************/
// ds12 格式初始化函数
// 用于改变 ds12 存储数据的格式
void set_geshi_ds12()
{
//write8bit_ds12(0x0b,0x80);
//void disable_register_a() ;
write8bit_ds12(0x0b,0x02); // 设定时间存储格式与时间格式
// 信息为BCD格式 ,24小时模式 ,不使用夏令时
//enable_register_a() ;
}
//*************************************************************
// 延时程序
// 只在 ds12cr887 模块使用
void delay_ds12(unsigned int n)
{
unsigned int count ;
int i ;
unsigned long j ;
count = 2667 ;
for(i = n ; i> 0;i--)
{
for (j=count ;j>0;j--);
}
return ;
}
/*******************************************/
// write status of register
// register_add: address of register which you want to write
//
void write_register(unchar register_add,unchar register_data)
{
AS0 ; DS1 ; RW1 ; DS0 ;
_NOP() ;
AS1 ;
_NOP() ;
CS0 ;
DATA_DIR = 0XFF ;
DATA_OUT = register_add ;
AS0 ; // AS 下降沿 锁存地址
delay_ds12(100) ;
DS1 ;RW0 ;
DATA_OUT = register_data ;
delay_ds12(100) ;
DS0 ; // DS 下降沿 锁存数据
AS1 ;
}
/*******************************************/
// read status of register
// register_add: address of register which you want to read
// register_data:
void read_register(unchar register_add ,unchar *register_data)
{
DATA_DIR = 0XFF ; // P1 口为输出方向
AS0 ;
DS1 ;
RW0 ;
DS0 ;
_NOP() ;
AS1 ;
_NOP() ;
CS0 ;
DATA_OUT = register_add ;
AS0 ; // AS 下降沿 锁存地址
DATA_DIR = 0X00 ;
P3OUT |= (BIT0 + BIT1) ; // DS RW 都为高
delay_ds12(40) ; // 等待、数据在 DS RW 为高的后期 传输到总线上
// 时间参数 40 是经过多次实验所得
*register_data = DATA_IN ;
DS0 ; // 读周期结束,DS 复位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -