RX8010时钟驱动程序
单片机源程序如下:
- /*
- ****************************************************************************
- FILE : RX8010.c
- PURPOSE : the driver of RTC chip "RX-8010SJ"
- AUTHOR : Gtw
- LOG : 2014-11-28 , create it
- ****************************************************************************
- */
- #define _RX8010_C_
- #include ".\main\Header.h"
- #if ( RTC_SEL==RTC_RX8010 ) || ( NVMEM_SEL==NVMEM_RX8010 )
- #if ( RTC_SEL==RTC_RX8010 )
- TIME_t Time;
- #endif
- #if ( NVMEM_SEL==NVMEM_RX8010 )
- NVMEM_t NvMem;
- #endif
- // 延时
- #define DLY_TYPE_CNT 1
- #define DLY_TYPE_ASM 2
- #define DLY_TYPE DLY_TYPE_ASM
- #if ( DLY_TYPE == DLY_TYPE_ASM )
- #define delay() { nop(); }
- /*
- static void delay(void){
- asm("nop");
- }
- */
- #else
- static void dly(uint08 cnt){
- while( cnt-- );
- }
- #define delay() { dly(1); }
- #endif
- /*
- **************************************************
- 函数名 :RX8010_START
- 目的 :对RX8010产生一个START信号
- 传递参数:无
- 返回 :IIC总线是否正常,正常返回true,异常返回false
- 注意,此子程序不支持多主机
- **************************************************
- */
- bool RX8010_START(void){
- bool success = true;
- IoDir(RX8010_SCL,GPIO_OUT);
- IoWr(RX8010_SCL,GPIO_LO);
- delay();
- IoDir(RX8010_SDA,GPIO_IN);
- delay();
- if ( !IoRd(RX8010_SDA) ) success = false; // SDA对地线短路
- IoDir(RX8010_SCL,GPIO_IN);
- delay();
- if ( !IoRd(RX8010_SCL) ) success = false; // SCL对地线短路
- IoDir(RX8010_SDA,GPIO_OUT);
- IoWr(RX8010_SDA,GPIO_LO);
- delay();
- IoDir(RX8010_SCL,GPIO_OUT);
- IoWr(RX8010_SCL,GPIO_LO);
- //delay();
- return success;
- }
- /*
- **************************************************
- 函数名 :RX8010_STOP
- 目的 :对RX8010产生一个STOP信号
- 传递参数:无
- 返回 :无
- 注意,此子程序不支持多主机
- **************************************************
- */
- void RX8010_STOP(void){
- IoDir(RX8010_SCL,GPIO_OUT);
- IoWr(RX8010_SCL,GPIO_LO);
- delay();
- IoDir(RX8010_SDA,GPIO_OUT);
- IoWr(RX8010_SDA,GPIO_LO);
- delay();
- IoDir(RX8010_SCL,GPIO_IN);
- delay();
- IoDir(RX8010_SDA,GPIO_IN);
- delay();
- IoDir(RX8010_SCL,GPIO_OUT);
- IoWr(RX8010_SCL,GPIO_LO);
- //delay();
- }
- /*
- **************************************************
- 函数名 :RX8010_SEND_BIT
- 目的 :向RX8010发送一个位
- 传递参数:bit,位的值
- 返回 :无
- 注意,如果以传输数据为目的,则调用此程序前应保证已经产生了START信号
- **************************************************
- */
- void RX8010_SEND_BIT(bool bit){
- IoDir(RX8010_SCL,GPIO_OUT);
- IoWr(RX8010_SCL,GPIO_LO);
- delay();
- if ( bit ){
- IoDir(RX8010_SDA,GPIO_IN);
- }else{
- IoDir(RX8010_SDA,GPIO_OUT);
- IoWr(RX8010_SDA,GPIO_LO);
- }
- delay();
- IoDir(RX8010_SCL,GPIO_IN);
- //delay(); // 函数最后的delay()在时钟较慢的情况下可省略
- }
- /*
- **************************************************
- 函数名 :RX8010_GET_BIT
- 目的 :从RX8010读出一个位
- 传递参数:无
- 返回 :读取到的位
- 注意,调用此程序前应保证已经产生了START信号
- **************************************************
- */
- bool RX8010_GET_BIT(void){
- IoDir(RX8010_SCL,GPIO_OUT);
- IoWr(RX8010_SCL,GPIO_LO);
- delay();
- IoDir(RX8010_SDA,GPIO_IN);
- delay();
- IoDir(RX8010_SCL,GPIO_IN);
- delay();
- return IoRd(RX8010_SDA);
- }
- /*
- **************************************************
- 函数名 :RX8010_SEND_BYTE
- 目的 :向RX8010发出一个字节
- 传递参数:字节的值
- 返回 :无
- 注意,调用此程序前应保证已经产生了START信号
- msb first!
- **************************************************
- */
- void RX8010_SEND_BYTE(uint08 data){
- uint08 tmp;
- for(tmp=8;tmp>0;tmp--){
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
RX8010.zip
(4.56 KB, 下载次数: 13)
|