📄 rtc_ds12887.c
字号:
temp = DS12887_REG_C; // 清零 DS12887 寄存器C所有标志位
DS12887_REG_A = 0x20; // 启动晶体振荡器,关闭周期中断方波输出
temp = DS12887_REG_B; // 芯片处于正常工作状态、允许更新周期结束中断、
temp &= 0x32; // 闹钟中断保持原设置状态、
temp |= 0x12; // 关闭周期中断、关闭方波输出、
DS12887_REG_B = temp; // 采用 BCD 码数据格式和 24 小时制模式
temp = DS12887_REG_D; // 检查内置电池能量状态?
if ((temp&BIT7)==0)
{
Buzzer(); // 如果电池耗尽,系统将进行告警
}
DS12887_Year_H = 0x20; // 写入年前两位数据为 20
temp = DS12887_REG_C; // 清零 DS12887 寄存器C所有标志位
#endif // "MCU_No_ExtendedParallelBus" 条件编译结束
DS12887_CS_PORT |= DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为H
}
/*==========================================================================================
函数功能: 本函数用于修改设置 DS12887 各个时标寄存器的时间数值(BCD 码)操作。
函数入口参数:SET_BCD_Year_H ------ 设置的年前两位时间数值(BCD码)。
SET_BCD_Year -------- 设置的年时间数值(BCD码)。
SET_BCD_Month ------- 设置的月份时间数值(BCD码)。
SET_BCD_Date -------- 设置的日期时间数值(BCD码)。
SET_BCD_Hour -------- 设置的小时时间数值(BCD码)。
SET_BCD_Minute ------ 设置的分钟时间数值(BCD码)。
SET_BCD_Second ------ 设置的秒时间数值(BCD码)。
SET_BCD_Week -------- 设置的星期时间数值(BCD码)。
备注:
==========================================================================================*/
void SET_DS12887_TimeRegister(volatile unsigned char SET_BCD_Year_H, // 年前两位
volatile unsigned char SET_BCD_Year, // 年
volatile unsigned char SET_BCD_Month, // 月份
volatile unsigned char SET_BCD_Date, // 日期
volatile unsigned char SET_BCD_Hour, // 小时
volatile unsigned char SET_BCD_Minute, // 分钟
volatile unsigned char SET_BCD_Second, // 秒
volatile unsigned char SET_BCD_Week) // 星期
{
register unsigned char temp; // 临时寄存器变量
register unsigned char temp2; // 临时寄存器变量2
SREG &= ~BIT7; // 关闭全局中断
DS12887_CS_PORT &= ~DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus // 无扩展并行总线结构单片机的条件编译
temp2 = VEPB_ReadData(DS12887_REG_B); // 使芯片处于禁止更新状态、其他设置保持原来状态
temp = VEPB_ReadData(DS12887_REG_B);
temp |= BIT7;
VEPB_WriteData(DS12887_REG_B, temp);
VEPB_WriteData(DS12887_Year_H, SET_BCD_Year_H); // 写入年前两位数据
VEPB_WriteData(DS12887_Year, SET_BCD_Year); // 写入年数据
VEPB_WriteData(DS12887_Month, SET_BCD_Month); // 写入月份数据
VEPB_WriteData(DS12887_Date, SET_BCD_Date); // 写入日期数据
VEPB_WriteData(DS12887_Hour, SET_BCD_Hour); // 写入小时数据
VEPB_WriteData(DS12887_Minute, SET_BCD_Minute); // 写入分钟数据
VEPB_WriteData(DS12887_Second, SET_BCD_Second); // 写入秒数据
VEPB_WriteData(DS12887_Week, SET_BCD_Week); // 写入星期数据
temp = VEPB_ReadData(DS12887_REG_C); // 清零 DS12887 寄存器C所有标志位
temp2 &= ~BIT7; // 使芯片处于正常工作状态、其他设置保持原来状态
VEPB_WriteData(DS12887_REG_B, temp2);
#else
temp2 = DS12887_REG_B; // 使芯片处于禁止更新状态、其他设置保持原来状态
temp = DS12887_REG_B;
temp |= BIT7;
DS12887_REG_B = temp;
DS12887_Year_H = SET_BCD_Year_H; // 写入年前两位数据
DS12887_Year = SET_BCD_Year; // 写入年数据
DS12887_Month = SET_BCD_Month; // 写入月份数据
DS12887_Date = SET_BCD_Date; // 写入日期数据
DS12887_Hour = SET_BCD_Hour; // 写入小时数据
DS12887_Minute = SET_BCD_Minute; // 写入分钟数据
DS12887_Second = SET_BCD_Second; // 写入秒数据
DS12887_Week = SET_BCD_Week; // 写入星期数据
temp = DS12887_REG_C; // 清零 DS12887 寄存器C所有标志位
temp2 &= ~BIT7; // 使芯片处于正常工作状态、其他设置保持原来状态
DS12887_REG_B = temp2;
#endif // "MCU_No_ExtendedParallelBus" 条件编译结束
DS12887_CS_PORT |= DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为H
SREG |= BIT7; // 使能全局中断
}
/*==========================================================================================
函数功能: 本函数用于控制 DS12887 闹钟打开/关闭的操作。
函数入口参数:AC_status ------ 仅可取二个值 ON 或 OFF 中的一个。
==========================================================================================*/
void DS12887_AlarmClock(unsigned char AC_status)
{
register unsigned char temp; // 临时寄存器变量
if (AC_status == ON)
{
SREG &= ~BIT7; // 关闭全局中断
DS12887_CS_PORT &= ~DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus // 无扩展并行总线结构单片机的条件编译
temp = VEPB_ReadData(DS12887_REG_B); // 设置允许闹钟中断、其他设置保持原来状态
temp |= BIT5;
VEPB_WriteData(DS12887_REG_B, temp);
#else
temp = DS12887_REG_B; // 设置允许闹钟中断、其他设置保持原来状态
temp |= BIT5;
DS12887_REG_B = temp;
#endif // "MCU_No_ExtendedParallelBus" 条件编译结束
DS12887_CS_PORT |= DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为H
SREG |= BIT7; // 使能全局中断
}
if (AC_status == OFF)
{
SREG &= ~BIT7; // 关闭全局中断
DS12887_CS_PORT &= ~DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus // 无扩展并行总线结构单片机的条件编译
temp = VEPB_ReadData(DS12887_REG_B); // 设置禁止闹钟中断、其他设置保持原来状态
temp &= ~BIT5;
VEPB_WriteData(DS12887_REG_B, temp);
#else
temp = DS12887_REG_B; // 设置禁止闹钟中断、其他设置保持原来状态
temp &= ~BIT5;
DS12887_REG_B = temp;
#endif // "MCU_No_ExtendedParallelBus" 条件编译结束
DS12887_CS_PORT |= DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为H
SREG |= BIT7; // 使能全局中断
}
}
/*==========================================================================================
函数功能: 本函数用于设置 DS12887 闹钟各个时标寄存器的时间数值(BCD 码)操作。
函数入口参数:SET_BCD_HouAlm ------ 设置的分钟闹钟时间数值(BCD码)。
SET_BCD_MinAlm ------ 设置的小时闹钟时间数值(BCD码)。
备注: ①.设置 DS12887 闹钟各个时标寄存器的时间数值后,将打开闹钟告警中断。
②.本函数将秒闹钟时间数值自动设置为0秒。
==========================================================================================*/
void SET_DS12887_AlarmClock(unsigned char SET_BCD_HouAlm, unsigned char SET_BCD_MinAlm)
{
SREG &= ~BIT7; // 关闭全局中断
DS12887_CS_PORT &= ~DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus // 无扩展并行总线结构单片机的条件编译
VEPB_WriteData(DS12887_HouAlm, SET_BCD_HouAlm); // 写入小时闹钟数据
VEPB_WriteData(DS12887_MinAlm, SET_BCD_MinAlm); // 写入分钟闹钟数据
VEPB_WriteData(DS12887_SecAlm, 0x00); // 写入秒闹钟数据
#else
DS12887_HouAlm = SET_BCD_HouAlm; // 写入小时闹钟数据
DS12887_MinAlm = SET_BCD_MinAlm; // 写入分钟闹钟数据
DS12887_SecAlm = 0x00; // 写入秒闹钟数据
#endif // "MCU_No_ExtendedParallelBus" 条件编译结束
DS12887_CS_PORT |= DS12887_CS_PINNum; // 置 DS12887 片选控制引脚为H
DS12887_AlarmClock(ON); // 打开闹钟告警中断
SREG |= BIT7; // 使能全局中断
}
/*==========================================================================================
函数功能: 本函数用于闹钟告警中断的任务时间消息处理操作。
函数入口参数:BAC_number ------ 蜂鸣器发出声响次数值。
本函数还将在函数体中检查隐含的全局静态变量参数变量 tasks_time
(时间消息的任务)位1的布尔值而执行发出声响告警操作。
备注: ①.本函数需要放在主函数的不间断循环体中运行。
②.本函数在执行过程中将修改 tasks_time(时间消息的任务)变量的位1
和位2,与 buzzer_alarm_counte(蜂鸣器发出声响次数)变量的数值。
==========================================================================================*/
void Tasks_AlarmClock(unsigned int BAC_number)
{
register unsigned char temp; // 临时寄存器变量
register unsigned int temp_2; // 临时双寄存器变量
temp = tasks_time;
if ((temp&BIT1) == BIT1) // 如果闹钟告警消息任务位置位,将发出声响告警
{
temp = tasks_time;
if ((temp&BIT2) == BIT2)
{
temp_2 = buzzer_alarm_counter;
if (temp_2 > 0x0000)
{
Buzzer(); // 蜂鸣器发出一响声
buzzer_alarm_counter = buzzer_alarm_counter-1; // 蜂鸣器发出声响次数-1
LCDM_BackgroundLight(ON);
delay_ms(2);
Buzzer();
delay_ms(100);
Buzzer();
delay_ms(8);
LCDM_BackgroundLight(OFF);
Buzzer();
delay_ms(300);
}
else
{
tasks_time &= ~BIT2; // 蜂鸣声响消息任务位清零
tasks_time &= ~BIT1; // 闹钟告警消息任务位清零
}
}
else
{
buzzer_alarm_counter = BAC_number; // 置蜂鸣器发出声响次数值
tasks_time |= BIT2; // 蜂鸣声响消息任务位置位
}
}
}
/*==========================================================================================
函数功能: 本函数用于时间更新中断的任务时间消息处理操作。
函数入口参数:LCDM_ShowMode --- 在液晶上显示日期和时间的点阵字符样式选择值。
共有下列两种选择值和点阵字符样式供选择:
入口参数= 8 :8×16点阵字符样式。
入口参数= 16 :16×16点阵字符样式。
本函数还将在函数体中检查隐含的全局静态变量参数变量 tasks_time
(时间消息的任务)位0的布尔值而执行时间更新操作。
备注: ①.本函数需要放在主函数的不间断循环体中运行。
②.本函数在执行过程中将修改 tasks_time(时间消息的任务)变量的位0。
==========================================================================================*/
void Tasks_TimeUpdate(unsigned char LCDM_ShowMode)
{
register unsigned char temp; // 临时寄存器变量
temp = tasks_time;
if ((temp&BIT0)==BIT0) // 更新中断消息任务位是否置位?
{
switch (LCDM_ShowMode)
{
case 8:
LCDM_DayTime_Show_8_16(&time); // 在液晶上显示8×16字符的日期和时间
break;
case 16:
LCDM_DayTime_Show_16_16(&time); // 在液晶上显示16×16字符的日期和时间
break;
default:
LCDM_DayTime_Show_8_16(&time); // 在液晶上显示8×16字符的日期和时间
}
tasks_time &= ~BIT0; // 时间更新消息任务位清零
}
}
/*
********************************************************************************************
本C语言源程序文件到此结束
********************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -