ds1302驱动程序+lcd12864串行显示,使用结构体写,可读性更强

发布者:Serendipity66最新更新时间:2020-01-23 来源: 51hei关键字:ds1302  驱动程序  lcd12864  串行显示  结构体  可读性 手机看文章 扫描二维码
随时随地手机看文章

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"

[1] [2]
关键字:ds1302  驱动程序  lcd12864  串行显示  结构体  可读性 引用地址:ds1302驱动程序+lcd12864串行显示,使用结构体写,可读性更强

上一篇:51单片机串口通信Bad Apple视频播放源程序(LCD12864显示)
下一篇:STC89C52+LCD12864+DS1302+DS18B20时钟原理图+源程序

推荐阅读最新更新时间:2024-10-27 22:35

USB接口芯片SL811HS在51单片机系统中应用
1 引言 USB(通用串行总线)是INTEL、DEC、MI-CROSOFT、IBM等公司联合提出的、最近几年逐步在PC领域广为应用的新型接口技术。USB接口通用性好、实时性强、传输方式多样、成本低、支持即插即用、易于扩展且便于使用,这些优点使其得到许多硬件厂商的青睐。目前各种类型的USB产品已大量涌入市场,同时也被广泛地用在PC机及嵌入式系统中。 USB的拓扑结构中居核心地位的是Host(也称为主机),任何一次USB数据传输都必须由主机发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间或是两个主机之间无法直接通信。而目前,扮演主机角色的大多是个人电脑PC。而我们买到和使用的USB移动设备都是USB外
[单片机]
Arm-Linux摄像头驱动程序的移植
Arm开发板上摄像头的移植有两种方法:第一,将驱动程序添加到内核,通过编译内核,烧写到板子上;第二种,通过动态加载摄像头驱动模块的方法进行硬件的驱动。作者首先在PC的linux系统进行摄像驱动程序的移植,保证驱动程序版本正确,然后将驱动程序编译成模块,通过文件系统挂载到板子,然后进行加载,进而创建摄像头设备节点。下面将具体介绍摄像头动态加载的过程。 移植过程所使用的摄像头型号ZC301P,arm板上的内核版本为2.6.9,开发板为pxa270,所采用的驱动程序包为spca5xx-20060501.tar.gz。 第一步,使用命令解压文件: tar zxvf spca5xx-20060501.tar.gz
[单片机]
DS1302做的可调时钟
/////////////////////////////////////////////////////////////////// /*名称:单片机读取DS1302时钟芯片,带调整功能 / /* / ///////////////////////////////////////////////////////////////////*/ #include reg52.h #define uchar unsigned char #define uint unsigned int #define xiemiao 0x80 #define xiefen
[单片机]
C64x系列DSP/BIOS中设备驱动程序的设计
摘要:为了高效地对外部设备进行控制,给硬件设备编写驱动程序是一种有效的解决方法。C64x系列的DSP系统提出了类/微型驱动模型的驱动程序结构。实践结果表明,采用类/微型驱动模型进行驱动程序设计后,应用软件可以复用绝大部分相似设备的驱动程序,因而极大地提高了驱动程序的开发效率。 关键词:数字信号处理器 I/O设备驱动 类/微型驱动模型 实时操作系统 随着新技术的不断涌现和DSP实时系统的日趋复杂,不同类型的外部设备越来越多。为这些外部设备编写驱动程序已经成为依赖操作系统管理硬件的内在要求。但是,由于内存管脚、响应时间和电源管理等条件的限制,为一个给定的DSP系统编写设备驱动程序有时候会很困难。针对设备驱动程序开发者遇到的上述难
[应用]
MSP430单片机的PCF8563时钟芯片C语言驱动程序
#define NOP _NOP();_NOP() #define NowSec cNowTime #define NowMin cNowTime #define NowHour cNowTime #define NowDate cNowTime #define NowMonth cNowTime #define NowYear cNowTime #define SetSec cSetTime #define SetMin
[单片机]
用51单片机控制LCD12864显示屏源程序
12864液晶在出厂时其对比度已经调好,所以用户在使用的时候第三管脚可不用接任何东西,本实验板上为了兼容多家12864液晶所以加了液晶对比度调节电位器,若用户使用我们配套的12864液晶可不用管它,液晶的第三管脚悬空就可以。有些液晶功耗比较大,用户在使用的时候可将液晶的第19、20引脚的背光不接,这样字体会很清楚。 单片机源程序如下: /**********************BST-V51实验开发板例程************************ * 平台:BST-V51 + Keil U3 + STC89C52 * 名称: * 晶振:11.0592MHZ * 说明:免费开源,不提供源代码分析. ********
[单片机]
用51单片机控制<font color='red'>LCD12864</font><font color='red'>显示</font>屏源程序
STC52串口信息显示LCD12864屏上
/********************************************************************************* * 【使用说明】: 使用前请短接J2跳线帽,串口助手设置为比特率9600,无校验位,停止位1, 发送数据为16进制形式 **********************************************************************************/ /*预处理命令*/ #include reg52.h //包含单片机寄存器的头文件 #include intrins.h #define uchar unsigned ch
[单片机]
E-1330点阵液晶屏驱动程序
/* 线路图 89C51 E-1330 -------- | 8 P1.0-1.7|=========== D0-7 | P3.0|----------- A0 P3.1|----------- R/W P3.2|----------- E | -- /CS | | | --- | 反相器 RESET |----| 。--- /RES -------- */ #include reg51.h sbit p_a0=P3^0; sbit p_rw=P3^1; sbit p_e=P3^2; //指令写入函数 void ctrl(unsigned char c) { p_a0=1; //a0为1代表写入指令 p_rw=0; p_e
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved