📄 ds1302.c
字号:
//===============================================================================
//模块名称: ds1302.h
//简介: 实时时钟芯片ds1302功能函数
//版本: 1.0
//作者: 王伟民
//日期: 2007.12
//下一步工作:
//===============================================================================
#include <p18F4520.h>
#include"coolbaby.h"
#include"lcd1602.h"
#include"ds1302.h"
/*定义待设置的时间: 秒、 分、 时、 日、 月、 星期、年、控制字*/
const rom char time_tab[]={0x00,0x25,0x12,0x11,0x12,0x06,0x07,0x00};
char table[7];//定义读取时间和日期存放表格(从DS1302中读取的原始数据,格式见<<串行实时时钟/日历芯片DSl302的特性及其应用>>P2-3)
char date[5];//定义格式化日期存放表格
char time[5];//定义格式化时间存放表格
/********************************************************************
函 数 名:ds1302_init()DS1302初始化函数
功 能:DS1302初始化
入口参数:无
返 回 值:无
***********************************************************************/
void ds1302_init(void)
{
SCLK=0;/*拉低时钟信号*/
RST=0;/*复位DS1302*/
RST=1;/*使能DS1302*/
ds1302_write(0x8e);/*发控制命令*/
ds1302_write(0);/*允许写DS1302*/
RST=0;/*复位*/
}
/********************************************************************
函 数 名:ds1302_write()写一个字节数据函数
功 能:往DS1302中写入一个字节
入口参数:time_tx 要写入的一个字节
返 回 值:无
***********************************************************************/
void ds1302_write(unsigned char time_tx)
{
int j; //设置循环变量
TRIS_IO=OUT; //设置数据口方向为输出
for(j=0;j<8;j++) //连续写8bit
{
IO=0; //先设置数据为0
SCLK=0; //时钟信号拉低
if(time_tx&0x01!=0) IO=1; //判断待发送的数据位是0或1
time_tx=time_tx>>1; //待发送的数据右移1位
SCLK=1; //拉高时钟信号
}
SCLK=0; //写完一个字节,拉低时钟信号
}
/********************************************************************
函 数 名:ds1302_read()读一个字节函数
功 能:从DS1302读一个字节
入口参数:无
返 回 值:unsigned char :读取的数据
***********************************************************************/
unsigned char ds1302_read(void)
{
int j;//设置循环变量
unsigned char time_rx=0;
TRIS_IO=IN;//设置数据口方向为输入
for(j=0;j<8;j++)//连续读取8bit
{
SCLK=0;//拉低时钟信号
time_rx=time_rx>>1; //接收寄存器右移1位
if (IO==1) time_rx|=0B10000000;//把接收到的数据放到接收寄存器的最高位
SCLK=1; //拉高时钟信号
}
SCLK=0; //拉低时钟信号
return(time_rx); //返回读取到的数据
}
/********************************************************************
函 数 名:set_time()设置时间函数
功 能:设置初始时间
说 明:使用了多字节写方式
入口参数:无
要写的初始时间事先放置在本函数内部定义的数组time_tab[]内,其数据存放格式为:
秒、分、时、日、月、星期、年、控制字(BCD码)
返 回 值:无
***********************************************************************/
void set_time(void)
{
int i; /*定义循环变量*/
RST=1;/*使能DS1302*/
ds1302_write(0xbe);/*时钟多字节写命令*/
for(i=0;i<8;i++) /*连续写8个字节数据*/
{
ds1302_write(time_tab[i]);/*调用写一个字节函数*/
}
RST=0;/*复位*/
}
/********************************************************************
函 数 名:get_time_info()读取全部时间信息函数
功 能:读取DS1302内部的全部时间信息
入口参数:无
返 回 值:无。读取全部时间信息存放在全局数组table[7]中
***********************************************************************/
void get_time_info(void)
{
int i; //设置循环变量
RST=1; //使能DS1302
ds1302_write(0xbf); //发送多字节读取命令
for(i=0;i<7;i++) //连续读取7个字节数据
{
table[i]=ds1302_read();//调用读取1个字节数据的函数
}
RST=0;//复位DS1302
}
/********************************************************************
函 数 名:get_time()读取时间函数
功 能:读取DS1302当前时间
入口参数:无
返 回 值:无。读取的时间按“时分秒”格式(BCD码)存放在全局数组time[5]中。
***********************************************************************/
void get_time(void)
{
get_time_info(); /*读取全部时间信息函数*/
/*从原始数据中提取时分秒,格式化后存放在time[5]中*/
time[0]=table[0]&0b00001111;//求秒的个位
time[1]=table[0]&0b01110000; //求秒的十位
time[1]>>=4;//右移4位
time[2]=table[1]&0b00001111; //求分的个位
time[3]=table[1]&0b01110000; //求分的十位
time[3]>>=4;
time[4]=table[2]&0b00001111; //求时的个位
time[5]=table[2]&0b00110000; //求时的十位
time[5]>>=4;
}
/********************************************************************
函 数 名:get_date()读取日期函数
功 能:读取DS1302当前日期
入口参数:无
返 回 值:无。读取的日期按“年月日”格式(BCD码)存放在全局数组date[5]中。
***********************************************************************/
void get_date(void)
{
get_time_info(); /*读取全部时间信息函数*/
/*从原始数据中提取年月日,格式化后存放在data[5]中*/
date[0]=table[3]&0b00001111;//求日的个位
date[1]=table[3]&0b00110000; //求日的十位
date[1]>>=4;//右移4位
date[2]=table[4]&0b00001111; //求月的个位
date[3]=table[4]&0b00010000; //求月的十位
date[3]>>=4;
date[4]=table[6]&0b00001111; //求年的个位
date[5]=table[6]&0b11110000; //求年的十位
date[5]>>=4;
}
/********************************************************************
函 数 名:display_time()显示时间函数
功 能:在LCD屏上显示当前时间,显示格式:**:**:**
入口参数:无
返 回 值:无
***********************************************************************/
void display_time(void)
{
int i;
get_time();//调用取时间函数
i=time[5]; //得时的十位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
i=time[4]; //得时的个位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
LCD_wrchar(':');/*显示":"*/
i=time[3]; //得分的十位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
i=time[2]; //得分的个位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
LCD_wrchar(':');/*显示":"*/
i=time[1]; //得秒的十位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
i=time[0]; //得秒的个位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
}
/********************************************************************
函 数 名:display_date()显示日期函数
功 能:在LCD屏上显示当前日期,显示格式:**年**月**日
入口参数:无
返 回 值:无
***********************************************************************/
void display_date(void)
{
int i;
get_date();/*调用取日期函数*/
i=date[5]; //得年的十位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
i=date[4]; //得年的个位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
LCD_wrchar(USER_CHAR1);/*在LCD屏上显示单个预定义字符:年*/
i=date[3]; //得月的十位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
i=date[2]; //得月的个位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
LCD_wrchar(USER_CHAR2);/*在LCD屏上显示单个预定义字符:月*/
i=date[1]; //得日的十位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
i=date[0]; //得日的个位
i|=0b00110000;//BCD转换成ASCII码
LCD_wrchar(i);//显示
LCD_wrchar(USER_CHAR3);/*在LCD屏上显示单个预定义字符:日*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -