/*----------------------------------------------------------------------------
函数功能: 本函数用于修改设置 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 Uchar8 SET_BCD_Year_H, /* 年前两位 */
volatile Uchar8 SET_BCD_Year, /* 年 */
volatile Uchar8 SET_BCD_Month, /* 月份 */
volatile Uchar8 SET_BCD_Date, /* 日期 */
volatile Uchar8 SET_BCD_Hour, /* 小时 */
volatile Uchar8 SET_BCD_Minute, /* 分钟 */
volatile Uchar8 SET_BCD_Second, /* 秒 */
volatile Uchar8 SET_BCD_Week) /* 星期 */
{
register Uchar8 temp; /* 临时寄存器变量 */
register Uchar8 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); /* 写入星期数据 */
/* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */
temp = VEPB_ReadData(DS12887_REG_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; /* 写入星期数据 */
/* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */
temp = DS12887_REG_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(Uchar8 AC_status)
{
register Uchar8 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(Uchar8 SET_BCD_HouAlm, Uchar8 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(Uint16 BAC_number)
{
register Uchar8 temp; /* 临时寄存器变量 */
register Uint16 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--; /* 蜂鸣器发出声响次数-1 */
LCDM_BackgroundLight(ON);
delay_ms(300);
LCDM_BackgroundLight(OFF);
Buzzer(); /* 蜂鸣器发出一声声响 */
delay_ms(200);
}
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(Uchar8 LCDM_ShowMode)
{
register Uchar8 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语言源程序文件到此结束
****************************************************************************************
*/
interrupt [EXT_INT0] void ext_int0_isr(void)
{
DS12887_INT_ISR();
}
void main(void)
{
LCDM_initialization();
external_INT0_initialization();
RTC_DS12887_initialization();
SREG |= BIT7; /* 使能全局中断 */
// SET_DS12887_TimeRegister(0x20,0x05,0x05,0x31,0x22,0x51,0x00,0x03);
SET_DS12887_AlarmClock(0x11, 0x12);
while (1)
{
Tasks_TimeUpdate(16);
Tasks_AlarmClock(0x0088);
};
}