历史上的今天
返回首页

历史上的今天

今天是:2025年01月23日(星期四)

正在发生

2020年01月23日 | ds1302驱动程序+lcd12864串行显示,使用结构体写,可读性更强

2020-01-23 来源:51hei

ds1302.c

#include "ds1302.h"



// 定义RTC初始化结构体,决定了初始化时间

RTC_TIME rtc_time = {

    25,     // 秒

    35,     // 分

    02,     // 时

    25,     // 日

    4,      // 月

    4,      // 星期

    19      // 年

};


/*******************************************************************************

* 函 数 名         : bcd_to_hex

* 函数功能           : 从时钟芯片中读出的时间数据,需转换为十进制数。

* 输    入         : val:需要转换的值

* 输    出         : 无

*******************************************************************************/

static uint8_t bcd_to_hex(uint8_t val)

{

   uint8_t temp;

    

    temp = val & 0x0f;

    val >>= 4;

    val &= 0x0f;

    val *= 10;

    temp += val; 

    

    return temp;

}



/*******************************************************************************

* 函 数 名         : hex_to_bcd

* 函数功能           : 往时钟芯片写入数据时,需将待写的十进制数转换为8421码。

* 输    入         : val:需要转换的值

* 输    出         : 无

*******************************************************************************/

static uint8_t hex_to_bcd(uint8_t val)

{

    uint8_t i,j,k;

    

    i = val / 10;

    j = val % 10;

     k= j + (i << 4);

    

    return k;

}



/*******************************************************************************

* 函 数 名         : DS1302_Write

* 函数功能           : 向DS1302命令(地址+数据)

* 输    入         : addr,dat

* 输    出         : 无

*******************************************************************************/


static void DS1302_Write(uint8_t addr, uint8_t dat)

{

    uint8_t n;

    

    RST = 0;

    _nop_();


    SCLK = 0;//先将SCLK置低电平。

    _nop_();

    RST = 1; //然后将RST(CE)置高电平。

    _nop_();


    for (n=0; n<8; n++)//开始传送八位地址命令

    {

        DSIO = addr & 0x01;//数据从低位开始传送

        addr >>= 1;

        SCLK = 1;//数据在上升沿时,DS1302读取数据

        _nop_();

        SCLK = 0;

        _nop_();

    }

    

    for (n=0; n<8; n++)//写入8位数据

    {

        DSIO = dat & 0x01;

        dat >>= 1;

        SCLK = 1;//数据在上升沿时,DS1302读取数据

        _nop_();

        SCLK = 0;

        _nop_();    

    }    

         

    RST = 0;//传送数据结束

    _nop_();

}


/*******************************************************************************

* 函 数 名         : DS1302_Read

* 函数功能           : 读取一个地址的数据

* 输    入         : addr

* 输    出         : dat

*******************************************************************************/


static uint8_t DS1302_Read(uint8_t addr)

{

    uint8_t n;

    uint8_t dat;

    uint8_t dat1;

    

    RST = 0;

    _nop_();


    /* 先将SCLK置低电平 */

    SCLK = 0;

    _nop_();

    

    /* 然后将RST(CE)置高电平 */

    RST = 1;

    _nop_();


    /* 开始传送八位地址命令 */

    for(n=0; n<8; n++)

    {

        DSIO = addr & 0x01; /* 数据从低位开始传送 */

        addr >>= 1;

        SCLK = 1;   /* 数据在上升沿时,DS1302读取数据 */

        _nop_();

        SCLK = 0;   /* DS1302下降沿时,放置数据 */

        _nop_();

    }

    _nop_();

    

    /* 读取8位数据 */

    for(n=0; n<8; n++)

    {

        dat1 = DSIO; /* 从最低位开始接收 */

        dat = (dat>>1) | (dat1<<7);

        SCLK = 1;

        _nop_();

        SCLK = 0;   /* DS1302下降沿时,放置数据 */

        _nop_();

    }

    

    /* 以下为DS1302复位的稳定时间,必须的 */

    RST = 0;

    _nop_();    

    SCLK = 1;

    _nop_();    

    DSIO = 0;

    _nop_();    

    DSIO = 1;

    _nop_();

    

    return dat;    

}


/*******************************************************************************

* 函 数 名         : DS1302_ReadTime

* 函数功能           : 读取时钟信息

* 输    入         : RTC_TIME类型的结构体指针,RTC_TIME的成员有:

                        rtc_sec    秒

                        rtc_min    分钟

                        rtc_hour   小时

                        rtc_date   日

                        rtc_month  月

                        rtc_day    星期

                        rtc_year   年

* 输    出         : 无

*******************************************************************************/

void DS1302_ReadTime(RTC_TIME *rtc_time)

{

    unsigned temp;

    

    temp = DS1302_Read(SEC_ADDR | 0x01);

    rtc_time->rtc_sec = bcd_to_hex(temp);

    

    temp = DS1302_Read(MIN_ADDR | 0x01);

    rtc_time->rtc_min = bcd_to_hex(temp);

    

    temp = DS1302_Read(HR_ADDR | 0x01);

    rtc_time->rtc_hour = bcd_to_hex(temp);

    

    temp = DS1302_Read(DATE_ADDR | 0x01);

    rtc_time->rtc_date = bcd_to_hex(temp);

    

    temp = DS1302_Read(MON_ADDR | 0x01);

    rtc_time->rtc_month = bcd_to_hex(temp);

    

    temp = DS1302_Read(DAY_ADDR | 0x01);

    rtc_time->rtc_day = bcd_to_hex(temp);

    

    temp = DS1302_Read(YEAR_ADDR | 0x01);

    rtc_time->rtc_year = bcd_to_hex(temp);

}

/*******************************************************************************

* 函 数 名         : DS1302_SetTime

* 函数功能           : 向DS1302写入时间

* 输    入         : RTC_TIME类型的结构体指针,RTC_TIME的成员有:

                        rtc_sec    秒

                        rtc_min    分钟

                        rtc_hour   小时

                        rtc_date   日

                        rtc_month  月

                        rtc_day    星期

                        rtc_year   年

* 输    出         : 无

*******************************************************************************/

void DS1302_SetTime(RTC_TIME *rtc_time)

{

    uint8_t temp;

    

    DS1302_Write(0x8E,0X00);         //禁止写保护,就是关闭写保护功能

    

    temp = hex_to_bcd(rtc_time->rtc_sec);

    DS1302_Write(SEC_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_min);

    DS1302_Write(MIN_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_hour);

    DS1302_Write(HR_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_date);

    DS1302_Write(DATE_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_month);

    DS1302_Write(MON_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_day);

    DS1302_Write(DAY_ADDR, temp);

    

    temp = hex_to_bcd(rtc_time->rtc_year);

    DS1302_Write(YEAR_ADDR, temp); 


    DS1302_Write(0x8E,0x80);         //打开写保护功能

}


/*******************************************************************************

* 函 数 名         : DS1302_Init

* 函数功能           : 初始化DS1302,初始化时间时由RTC初始化结构体决定的

* 输    入         : addr

* 输    出         : dat

*******************************************************************************/

void DS1302_Init(void)

{

    DS1302_SetTime(&rtc_time);

}


ds1302.h

#ifndef __DS1302_H_

#define __DS1302_H_


#include "config.h"

推荐阅读

史海拾趣

Deltron / DEM Manufacturing公司的发展小趣事

DEM Manufacturing一直注重技术创新和产品升级。在合并后的几年里,公司投入大量资源用于研发,推出了一系列具有创新性的电子产品。这些产品不仅满足了市场的多样化需求,还为公司赢得了良好的口碑和广泛的客户基础。

ELINA INDEK公司的发展小趣事

因美纳始终将创新与研发作为公司的核心竞争力。随着技术的不断进步,公司不断推出更先进、更便捷的基因测序产品,满足市场的多样化需求。同时,因美纳还积极与全球各大科研机构合作,共同推动基因测序技术的发展和应用。这种持续的创新和研发精神使得因美纳在电子行业中保持领先地位。

Computer Conversions Corp公司的发展小趣事

面对日益严峻的环境问题,Computer Conversions Corp积极响应环保号召,开始研发更加环保的计算机转换技术。公司不仅优化了生产工艺,减少了生产过程中的能源消耗和废弃物排放,还推出了一系列节能型转换设备,帮助客户在提升计算效率的同时,也降低了能源消耗。这一举措不仅赢得了客户的赞赏,也提升了公司的社会形象。

台湾肯尼威(CANNYWELL)公司的发展小趣事

在品质保障的基础上,肯尼威开始积极拓展市场。公司不仅在台湾本地建立了完善的销售网络,还成功进军国际市场。通过与多家国际知名企业的合作,肯尼威的产品逐渐打入电子、机械、医疗器械等多个领域。同时,公司还积极参加国际展会,展示最新的技术和产品,吸引了众多海外客户的关注。

DEMMELPRODUCTS公司的发展小趣事

作为一家有远见的企业,DEMMELPRODUCTS公司始终关注环保和社会责任。公司积极推广绿色生产理念和技术,减少生产过程中的废弃物排放和能源消耗。同时,公司还积极参与社会公益活动,为社会做出了积极的贡献。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

Custom Mmic Design Services Inc公司的发展小趣事

Custom Mmic Design Services Inc(以下简称CMDS)在成立的初期,就致力于开发高性能的微波单片集成电路(MMIC)。当时,市场上对于高频、低功耗的MMIC需求日益增长,但现有产品往往难以满足特定应用的性能要求。CMDS团队通过深入研究,成功开发出了一款新型MMIC,其性能在行业内处于领先地位,迅速获得了客户的认可。这一技术突破不仅为CMDS带来了可观的订单,也使其在微波集成电路领域确立了领先地位。

问答坊 | AI 解惑

新手遇到的问题

这几天我有重新再论坛里瞎转悠了,发现以前很好很老的帖子有浮出水面了,但是当我看到下面好几十楼的回复我蒙了,我不知道里面是否有别人回复的资料,所以我就一口气翻了几十楼。这一点感觉很不方便,希望管理员可以吧那些精华和置顶的帖子里的较好 ...…

查看全部问答>

RFIC和RFID 完全不同吧?

百度的答案,还请大家深入说说: RFIC是RF System 里的Block做成IC ,,基本上成品就是IC ; 而RFID是Radio-frequency identification 是一个系统,有特定的规范。 二者是否有确定的包含与被包含的关系呢?…

查看全部问答>

欢迎s3c6410爱好者加入超级群67958848

欢迎s3c6410爱好者加入超级群67958848…

查看全部问答>

I2C_IOControl 传一个数组出来,老不成功,郁闷死了

BOOL I2C_IOControl(         DWORD context, DWORD code, BYTE *pInBuffer, DWORD inSize, BYTE *pOutBuffer,         DWORD outSize, DWORD *pOutSize ) 里面定义了一个BYTE *str;然后给他空间,也 ...…

查看全部问答>

访问允许异常(section permission fault)

Hi,Dear all, 我在使用Hms30c7202过程中遇到一个难题,我使用的内核是2.6.13.4,大多数能够正常启动运行,个别出现不能启动情况。打印DEBUG信息,非正常设备启动失败,打印: Kernel panic - not syncing: No init found.  Try passi ...…

查看全部问答>

安装CE6的SP1出错toolMsmCA(Error):Setup package issue or CoreCon。。。

安装CE6的SP1是出错 “ToolMsmCA(Error):Setup package issue or CoreCon DataStore corrupted:CDeviceSDKInstallShin Add/Remove failed.HR=0x80004005. 我之前装了VS2005。 这几天才装这个,不知怎么出错,安装进度停在Installing the Gene ...…

查看全部问答>

DDK下重载new/delete的问题

各位,最近在开发一个驱动的时候需要检测内存泄漏,于是自己重载了new/delete,在win32下测了一下没问题,于是决定将其加入到当前的驱动下。可是,问题来了,总是出现LNK2005的错误,我查了一下这个错,应该是连接顺序的问题,出错信息显示在DDK中 ...…

查看全部问答>

急!需要开发条码打印机。不知道如何设计及开发?

市场有一款是uc/os 8 位的代码打印机。 可以接扫描枪,扫入条码,然后按键。打印出一个新条码。 现在想开发这样的东东。谁做过啊? 着急啊。请求指点,合作都可以…

查看全部问答>

STM32F207的固件库有没有出来?

                                 在ST网站上资料很少, 找不到固件库…

查看全部问答>

ASM eagle60 W/B BSOB

近来老板搞了点垃圾产品,在生产时用的是BSOB,但第二点不是翘线就是打不上,很多参数都用过了,不知还有哪里没想到的。求教怎样可以使ASM eagle60 W/B 的BSOB达到最佳。…

查看全部问答>