📄 ds1302.c
字号:
/*-------------------------------------------------------------
模块功能: 实时时钟模块( 时钟芯片型号:DS1302)
文件名: ds1302.c
创建者: 曾繁东
创建时间: 2008-2-24
修改者:
修改时间:
---------------------------------------------------------------*/
#include "ds1302.h"
#include "upsd3300_lcd.h"
#include <string.h>
#include "upsd3300_timer.h"
unsigned char xdata Disparea[80]; //存放显示的字符40 byte
//unsigned char idata ucTime[12]; //时间寄存器
unsigned char xdata ucTime[12]; //时间寄存器
unsigned char xdata backsec; //秒暂存
extern uint8 send_count;
extern unsigned char xdata UpTxBuf[100]; //上行通讯发送缓存
//080309
extern uint8 data tm3; //采集间隔时间
extern uint8 data screen_status;
uint8 Send_Sound_addr;
extern bit list_graph_status;
/*--------------------------------------------------------------------
模块功能: 实时时钟写入一字节
模块名称: rt_input_byte()
参数说明: ucda 写入的数据
返 回: 无
----------------------------------------------------------------------*/
void rt_input_byte(uint8 ucdata)
{
uint8 i;
ACC = ucdata;
//T_SCLK = 0;//这个加上有时序更准确(写一个字节地址后,再写一字节数据)
for(i =8; i>0; i--)
{
T_IO = ACC0; //输出ACC^0
T_SCLK = 0;
//_nop_();
//_nop_();
T_SCLK = 1; //时钟上升沿写入1位数据
//_nop_();
//_nop_();
ACC >>= 1; //从低位到高位
}
}
/*
void rt_input_byte(uint8 ucdata)
{
uint8 i;
ACC = ucdata;
//T_SCLK = 0;//这个加上有时序更准确(写一个字节地址后,再写一字节数据)
for(i = 0; i < 8; i ++)
{
T_SCLK = 0;
T_IO = ACC0; //输出ACC^0
//_nop_();
//_nop_();
T_SCLK = 1; //时钟上升沿写入1位数据
//_nop_();
//_nop_();
ACC >>= 1; //从低位到高位
//_nop_();
//_nop_();
//_nop_();
//_nop_();
}
}
*/
/*--------------------------------------------------------------------
模块功能: 实时时钟读取一字节
模块名称: rt_output_byte()
参数说明: 无
返 回: 读出的数据
----------------------------------------------------------------------*/
uint8 rt_output_byte(void)
{
uint8 i;
//T_RST = 1; //启动数据传输
for(i=8; i>0; i--)
{
ACC >>= 1; //将前一个下降沿读出的数据右移
T_IO = 1; //读入之前置1
T_SCLK = 1;
T_SCLK = 0; //时钟下降沿读出1位数据
ACC7 = T_IO;
}
return(ACC);
}
/*--------------------------------------------------------------------
模块功能: 往DS1302写入数据
模块名称: rt_write_data()
参数说明: addr 寄存器地址,data 要写的数据
返 回: 无
----------------------------------------------------------------------*/
void rt_write_data(uint8 ucaddr, uint8 ucdata)
{
T_IO = 0;
T_SCLK = 0;
T_RST = 1;
rt_input_byte(ucaddr);
//_nop_();
//_nop_();
rt_input_byte(ucdata);
T_RST = 0;
T_SCLK = 1;
T_IO = 1;
}
/*--------------------------------------------------------------------
模块功能: 读取DS1302某地址的数据
模块名称: rt_read_data()
参数说明: addr 寄存器地址
返 回: 读出的数据
----------------------------------------------------------------------*/
uint8 rt_read_data(uint8 ucaddr)
{
uint8 ucdata;
T_IO = 0;
T_SCLK = 0;
T_RST = 1;
rt_input_byte(ucaddr); //写地址
ucdata = rt_output_byte(); //读数据
T_RST = 0;
T_SCLK = 1;
T_IO = 1;
return(ucdata);
}
/*--------------------------------------------------------------------
模块功能: 设置时间
模块名称: rt_set_clock()
参数说明: pclock 时钟数据指针
返 回: 无
----------------------------------------------------------------------*/
void rt_set_clock(uint8 *pclock )
{
uint8 i;
uint8 addr = 0x80;
rt_write_data(0x8e,0x00); // 控制命令,WP=0
//for(i = 7; i>0; i--)
for(i = 0; i < 7; i ++)
{
rt_write_data(addr,*pclock); // 秒 分 时 日 月 星期 年
pclock++;
addr +=2;
}
//rt_write_data(0x90,0xa5); //电池冲电限流电阻2K
rt_write_data(0x8e,0x80); // 控制命令,WP=1, 写保护
}
/*--------------------------------------------------------------------
模块功能: 获得时间
模块名称: rt_get_clock()
参数说明: curclock 获得的时钟数据存储指针
返 回: 无
----------------------------------------------------------------------*/
void rt_get_clock(uint8 *curclock )
{
uint8 i;
uint8 addr = 0x81;
for (i=0; i<7; i++)
{
*curclock = rt_read_data(addr);//格式为: 秒 分 时 日 月 星期 年
curclock ++;
addr += 2;
}
}
/*--------------------------------------------------------------------
模块功能: DS1302 多数据写入
模块名称: RT_Write_Many_Data
参数说明: addr, SRAM 地址pdata, 写入数据的指针, length 长度
返 回: 无
----------------------------------------------------------------------*/
void RT_Write_Many_Data(uint8 addr, uint8 *ucdata, uint8 length)
{
uint8 i;
rt_write_data(0x8e,0x00); // 控制命令,WP=0
for(i = 0; i < length; i++)
{
rt_write_data(addr, *ucdata); //写入一个字节
ucdata++;
addr +=2;
}
rt_write_data(0x8e,0x80); // 控制命令,WP=1, 写保护
}
/*--------------------------------------------------------------------
模块功能: DS1302 多数据读出
模块名称: rt_get_clock()
参数说明: addr, SRAM 地址pdata, 读出数据的指针, length 长度
返 回: 无
----------------------------------------------------------------------*/
void RT_Read_Many_Data(uint8 addr, uint8 *ucdata, uint8 length)
{
uint8 i;
for (i = 0; i < length; i++)
{
*ucdata = rt_read_data(addr);//读出一个字节
ucdata ++;
addr += 2;
}
}
/*--------------------------------------------------------------------
模块功能: DS1302 一个数据写入
模块名称: RT_Write_One_Data
参数说明: addr, SRAM 地址;ucdata, 写入的数据
返 回: 无
----------------------------------------------------------------------*/
void RT_Write_One_Data(uint8 addr, uint8 ucdata)
{
rt_write_data(0x8e,0x00); // 控制命令,WP=0
rt_write_data(addr, ucdata); //写入一个字节
rt_write_data(0x8e,0x80); // 控制命令,WP=1, 写保护
}
void TimeDisplay(void) //;显示时间
{
if(list_graph_status)
return;
if(screen_status == 0 || screen_status == 3 || screen_status == 4)
{
Disparea[0] = 2;
Disparea[1] = 0; //century = 20
Disparea[2] = ucTime[6]>>4;
Disparea[3] = ucTime[6]&0x0f;//year
Disparea[4] = 26; //'-'
Disparea[5] = ucTime[4]>>4;
Disparea[6] = ucTime[4]&0x0f;//month
Disparea[7] = 26; //'-'
Disparea[8] = ucTime[3]>>4;
Disparea[9] = ucTime[3]&0x0f;//date
Disparea[10] = 21; //' '
Disparea[11] = 21; //' '
Disparea[12] = ucTime[2]>>4;
Disparea[13] = ucTime[2]&0x0f;//hour
Disparea[14] = 29; //':'
Disparea[15] = ucTime[1]>>4;
Disparea[16] = ucTime[1]&0x0f;//minute
Disparea[17] = 29; //':'
ucTime[0] &= 0x7f;
Disparea[18] = ucTime[0]>>4;
Disparea[19] = ucTime[0]&0x0f;//second
display_string24(478, 2, Disparea, 20);
}
}
void set_current_clock(void) //;显示时间
{
ucTime[0] = 0x00;
ucTime[1] = 0x24;
ucTime[2] = 0x08;
ucTime[3] = 0x26;
ucTime[4] = 0x02;
ucTime[5] = 0x01;
ucTime[6] = 0x08;
rt_set_clock(ucTime);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -