历史上的今天
今天是: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"
史海拾趣
|
百度的答案,还请大家深入说说: RFIC是RF System 里的Block做成IC ,,基本上成品就是IC ; 而RFID是Radio-frequency identification 是一个系统,有特定的规范。 二者是否有确定的包含与被包含的关系呢?… 查看全部问答> |
|
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 ...… 查看全部问答> |
|
各位,最近在开发一个驱动的时候需要检测内存泄漏,于是自己重载了new/delete,在win32下测了一下没问题,于是决定将其加入到当前的驱动下。可是,问题来了,总是出现LNK2005的错误,我查了一下这个错,应该是连接顺序的问题,出错信息显示在DDK中 ...… 查看全部问答> |
|
市场有一款是uc/os 8 位的代码打印机。 可以接扫描枪,扫入条码,然后按键。打印出一个新条码。 现在想开发这样的东东。谁做过啊? 着急啊。请求指点,合作都可以… 查看全部问答> |
|
近来老板搞了点垃圾产品,在生产时用的是BSOB,但第二点不是翘线就是打不上,很多参数都用过了,不知还有哪里没想到的。求教怎样可以使ASM eagle60 W/B 的BSOB达到最佳。… 查看全部问答> |




