微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > DS1302驱动代码(低耦合易移植)

DS1302驱动代码(低耦合易移植)

时间:10-02 整理:3721RD 点击:
/*
*******************************************************************
*                        file:ds1302_spi.c
*                       
*                        func:the driver of eeprom ds1302
*
*                        time:2017.03.04
*                       
*                        auth:lzx
*******************************************************************
*/
/*file*/
#include        "config.h"
#include    <intrins.h>
#include    "GPIO.h"
#include    "delay.h"
#include        "ds1302.h"
/*flag*/
#define DS1302_SCK P44
#define DS1302_IO  P20
#define DS1302_RST P21
#define DS1302_DELAY10US() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
#define DS1302_READREGISTER_SECOND         0x81
#define DS1302_READREGISTER_MINUTE         0x83
#define DS1302_READREGISTER_HOUR        0x85
#define DS1302_READREGISTER_DAY                0x87
#define DS1302_READREGISTER_MONTH        0x89
#define DS1302_READREGISTER_WEEKDAY        0x8B
#define DS1302_READREGISTER_YEAR        0X8D
/*variable*/
struct calendar ds1302_calendar;
unsigned char ds1302_calendar_char[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char *week[8]={"","星期一","星期二","星期三\xfd","星期四","星期五","星期六","星期日"};
/*
***********************************************
*        名称:ds1302_io_init(void)
*
*        功能:将P43口设置为输出
*
*        参数: 无
*
*        返回: void
***********************************************
*/
void ds1302_io_init(void)
{
    GPIO_InitTypeDef        GPIO_InitStructure;                                                //结构定义
    GPIO_InitStructure.Pin  = GPIO_Pin_0|GPIO_Pin_1;                      //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
    GPIO_InitStructure.Mode = GPIO_PullUp;                                                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);                                            //初始化
       
        GPIO_InitStructure.Pin  = GPIO_Pin_4;                                                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
    GPIO_InitStructure.Mode = GPIO_PullUp;                                              //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P4,&GPIO_InitStructure);                                            //初始化
}
/*
*************************************
*          name:void ds1302_spi_initial()
*
*          func:ds1302_spi_initial
*
*          time:2017.03.04
*                       
*          auth:lzx
*************************************
*/
void ds1302_spi_initial(void)
{
        DS1302_RST=0;
        DS1302_SCK=0;
        delay_ms(1);
        DS1302_RST=1;
}
/*
*************************************
*          name:void ds1302_spi_write(dat)
*
*          func:ds1302_spi_write
*
*          time:2017.03.04
*                       
*          auth:lzx
*************************************
*/
void ds1302_spi_write(unsigned char dat)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                DS1302_SCK=0;
                DS1302_DELAY10US();
                if(dat&(0x01<<i))
                {
                        DS1302_IO=1;
                }
                else
                {
                        DS1302_IO=0;
                }
                DS1302_DELAY10US();
                DS1302_SCK=1;
                DS1302_DELAY10US();
                DS1302_SCK=0;
                DS1302_DELAY10US();
        }
}
/*
*************************************
*          name:uc ds1302_spi_read(void)
*
*          func:ds1302_spi_read
*
*          time:2017.03.04
*                       
*          auth:lzx
*************************************
*/
unsigned char ds1302_spi_read(void)
{
        unsigned char i,temp=0x00;
        for(i=0;i<8;i++)
        {
                if(DS1302_IO)
                {
                        temp=temp|(0x01<<i);
                }
                DS1302_SCK=1;
                DS1302_DELAY10US();
                DS1302_SCK=0;
                DS1302_DELAY10US();
        }
        return temp;
}
/*
***********************************************
*        名称:ds1302_write(address,dat)
*
*        功能:修正时间
*
*        参数: address为修正的时间地址,例如年
*                  dat为数据,例如将月修改成6月,则为6
*
*        返回: void
***********************************************
*/
void ds1302_write(unsigned char address,unsigned char dat)
{
        ds1302_spi_initial();
        ds1302_spi_write(address);
        ds1302_spi_write(dat);
}
/*
***********************************************
*        名称:ds1302_initial(year,month,date,hour,minute,second,week)
*
*        功能:初始化时间
*
*        参数:年月日时分秒星期
*       
*        返回: void
***********************************************
*/
void ds1302_initial(unsigned char year,unsigned char month,unsigned char date,unsigned char hour,unsigned char minute,unsigned char second,unsigned char week)
{
        ds1302_write(0x8e,0x00);
        ds1302_write(DS1302_WRITEREGISTER_HOUR,hour);
        ds1302_write(DS1302_WRITEREGISTER_MINUTE,minute);
        ds1302_write(DS1302_WRITEREGISTER_SECOND,second);
        ds1302_write(DS1302_WRITEREGISTER_YEAR,year);
        ds1302_write(DS1302_WRITEREGISTER_MONTH,month);
        ds1302_write(DS1302_WRITEREGISTER_DAY,date);
        ds1302_write(DS1302_WRITEREGISTER_WEEKDAY,week);
        ds1302_write(0x8e,0x80);
}
/*
*************************************
*          name:uc ds1302_read(address)
*
*          func:ds1302_read(address)
*
*          time:2017.03.04
*                       
*          auth:lzx
*************************************
*/
unsigned char ds1302_read(unsigned char address)
{
        unsigned char temp;
        ds1302_spi_initial();
        ds1302_spi_write(address);
        temp=ds1302_spi_read();
        return temp;
}
/*
*************************************
*          name:void ds1302_calendar(void)
*
*          func:ds1302_calendar hex to char[]
*
*          time:2017.03.05
*                       
*          auth:lzx
*************************************
*/
void ds1302_calendar_HexToString(void)
{
        unsigned char second_ge=ds1302_read(DS1302_READREGISTER_SECOND)%16;                        //second
        unsigned char second_shi=ds1302_read(DS1302_READREGISTER_SECOND)/16;       
        unsigned char minute_ge=ds1302_read(DS1302_READREGISTER_MINUTE)%16;                        //minute
        unsigned char minute_shi=ds1302_read(DS1302_READREGISTER_MINUTE)/16;
        unsigned char hour_ge=ds1302_read(DS1302_READREGISTER_HOUR)%16;                                //hour
        unsigned char hour_shi=ds1302_read(DS1302_READREGISTER_HOUR)/16;
       
        unsigned char day_ge=ds1302_read(DS1302_READREGISTER_DAY)%16;                                //day
        unsigned char day_shi=ds1302_read(DS1302_READREGISTER_DAY)/16;
        unsigned char month_ge=ds1302_read(DS1302_READREGISTER_MONTH)%16;                        //month
        unsigned char month_shi=ds1302_read(DS1302_READREGISTER_MONTH)/16;
       
        unsigned char weekday_ge=ds1302_read(DS1302_READREGISTER_WEEKDAY)%16;                //weekday
       
        unsigned char year_ge=ds1302_read(DS1302_READREGISTER_YEAR)%16;                                //year
        unsigned char year_shi=ds1302_read(DS1302_READREGISTER_YEAR)/16;
       
        ds1302_calendar.clock[0]=ds1302_calendar_char[hour_shi];                                        //clock
        ds1302_calendar.clock[1]=ds1302_calendar_char[hour_ge];
        ds1302_calendar.clock[2]=':';
        ds1302_calendar.clock[3]=ds1302_calendar_char[minute_shi];
        ds1302_calendar.clock[4]=ds1302_calendar_char[minute_ge];
        ds1302_calendar.clock[5]=':';
        ds1302_calendar.clock[6]=ds1302_calendar_char[second_shi];
        ds1302_calendar.clock[7]=ds1302_calendar_char[second_ge];
        ds1302_calendar.clock[8]='\0';
        ds1302_calendar.date[0]='2';
        ds1302_calendar.date[1]='0';
        ds1302_calendar.date[2]=ds1302_calendar_char[year_shi];                                                //date
        ds1302_calendar.date[3]=ds1302_calendar_char[year_ge];
        ds1302_calendar.date[4]='-';
        ds1302_calendar.date[5]=ds1302_calendar_char[month_shi];
        ds1302_calendar.date[6]=ds1302_calendar_char[month_ge];
        ds1302_calendar.date[7]='-';
        ds1302_calendar.date[8]=ds1302_calendar_char[day_shi];
        ds1302_calendar.date[9]=ds1302_calendar_char[day_ge];
        ds1302_calendar.date[10]='\0';
       
        ds1302_calendar.weekday=week[weekday_ge];
       
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top