📄 rtc.c
字号:
/*************************************************/
/****************实时时钟********************/
/*************2003年4月16日*********************/
/************WROTE BY WANGSW********************/
#include "reg52x2.h"
#include "define.h"
#include "lcd.h"
#include "iic.h"
#include "rtc.h"
static RTCType eRTCType;
byte data g_RTCPool[4];
RTCMember g_RTCMember;
static byte code Pcf8563Init[16] = /*实时时钟初始化数据*/
{
0x00, /*控制状态寄存器TEST|0 |STOP| 0 |TTESTC|0 |0 |0 */
0x00, /*控制状态寄存器 0 | 0 | 0 | TI/TP| AF | TF |AIE |TIE */
0x30, /*second D7=VL(voltage low)*/
0x29, /*minute*/
0x00, /*hour*/
0x00, /*day*/
0x00, /*week*/
0x00, /*month D7=centruy*/
0x00, /*year*/
0x80, /*minute alarm D7=alarm enable 低电平有效*/
0x80, /*hour alarm D7=alarm enable*/
0x80, /*day alarm D7=alarm enable*/
0x80, /*week alarm D7=alarm enable*/
0x83, /*D7=FE:clkout enable D1,D0:
00: 32.768KHz
01:1024
10:32
11:1
*/
0x00, /*D7=TE:timer enable D1,D0:
00:4096Hz
01:64
10:1
11:1/60
*/
0x00 /*timer back data倒计数值*/
};
#ifndef SOFT_RTC /*r如果定义了外围硬件实时时钟计数*/
/******************************************************************************************
*函数名: Int1RTC
*参数: 无
*返回值: 无
*描述:
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
static void Int1RTC(void) interrupt 2
{
EA = 0; /*r关闭所有中断*/
msg_queue_in(MSG_RTC, NONE);
EA = 1;
}
#endif
extern void rtc_pcf8563_init(void)
{
while(!iic_send_str(PCF8563, 0x00, Pcf8563Init, 16))
{
delay(0x200);
}
iic_rcv_str(PCF8563, 0x02, g_RTCPool, 2);
}
/******************************************************************************************
*函数名: rtc_init
*参数: hour
minute
second
*返回值: 无
*描述: 实时软件时钟计数器初始化
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void rtc_soft_init(byte hour, byte minute, byte second)
{
g_RTCMember.hour = hour;
g_RTCMember.minute = minute;
g_RTCMember.second = second;
g_RTCPool[0] = g_DAA[g_RTCMember.second];
g_RTCPool[1] = g_DAA[g_RTCMember.minute];
g_RTCPool[2] = g_DAA[g_RTCMember.hour];
}
/******************************************************************************************
*函数名: rtc_process
*参数: 无
*返回值: 无
*描述: 定义时钟从秒->分钟->小时的进位规则,并抛出已过一秒时
钟的消息
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void rtc_soft_routine(void)
{
#ifdef SOFT_RTC
if(++g_RTCMember.second > 59)
{
g_RTCMember.second = 0;
g_RTCMember.minute++;
}
if(g_RTCMember.minute > 59)
{
g_RTCMember.minute = 0;
g_RTCMember.hour++;
}
msg_queue_in(MSG_RTC, RTC_SECOND);
#endif
}
/******************************************************************************************
*函数名: rtc_read
*参数: 无
*返回值: g_RTC 时钟结构体
*描述: 读取当前时钟结构体内容
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern RTCMember rtc_soft_read(void)
{
return(g_RTCMember);
}
extern void rtc_pcf8563_process(RTCType eRTCType)
{
eRTCType = eRTCType;
iic_rcv_str(PCF8563, 0x02, g_RTCPool, 2);
}
extern void rtc_soft_process(RTCType eRTCType)
{
eRTCType = eRTCType; /*以备今后用*/
g_RTCPool[0] = g_DAA[g_RTCMember.second];
g_RTCPool[1] = g_DAA[g_RTCMember.minute];
g_RTCPool[2] = g_DAA[g_RTCMember.hour];
}
/**************************应用程序*********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -