源程序文件名: RTC_DS12887.C
源程序名称: 实时时钟芯片 DS12887 接口驱动的源程序文件
程序版本: 1.0
程序功能:
本程序是用 ATmega16 控制实时时钟芯片 DS12887 接口驱动的源程序文件。
程序说明:
函数入口参数:
函数出口参数:
编译工具软件: CodeVision AVR C 版本:1.24.6 以上
链接子程序文件:
编作者: 磊元
编作者 E-Mail: PTZSW@163.COM
编制日期: 2005年5月22日
------------------------------------------------------------------------------
适用器件芯片类型: Atmel 公司生产的8位 RISC 单片机
器件芯片时钟频率:
存储器模式: 小存储器模式
外部扩展存储器大小:0 【字节】
数据堆栈大小: 256 【字节】
------------------------------------------------------------------------------
源程序版本历史:
2005年5月22日 -------- 版本 1.0 :发行版本
****************************************************************************************
*/
/*======================================================================================
本源程序包括的头部文件
======================================================================================*/
#include "LCDM_Day_Time.h" /* 包含在液晶上显示日期和时间信息的头部文件 */
#include "RTC_DS12887.h" /* 本程序的头部文件 */
/*======================================================================================
程序指令代码清单
======================================================================================*/
/*----------------------------------------------------------------------------
全局静态变量定义:
----------------------------------------------------------------------------*/
static volatile Uchar8 tasks_time=0; /* 时间消息的任务变量 */
/* 时间消息的任务变量的各位定义如下:
┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓
┃ BIT7 ┃ BIT6 ┃ BIT5 ┃ BIT4 ┃ BIT3 ┃ BIT2 ┃ BIT1 ┃ BIT0 ┃
┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫
┃ 保留 ┃ 保留 ┃ 保留 ┃ 保留 ┃ 保留 ┃蜂鸣声响┃闹钟告警┃时间更新┃
┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛
*/
static volatile Uint16 buzzer_alarm_counter=0; /* 蜂鸣器发出声响次数 */
static volatile BCD_TIME time=BCD_TIME_defaults; /* 系统时间结构变量 */
/*----------------------------------------------------------------------------
函数功能: 本函数用于控制蜂鸣器发出声响告警的操作,设定蜂鸣器频率为 2000Hz 。
备注: 蜂鸣器设置为相应的控制引脚高电平时,蜂鸣器发出声响。
----------------------------------------------------------------------------*/
void Buzzer(void)
{
Buzzer_DDR |= Buzzer_PINNum; /* 设置蜂鸣器控制端口为输出引脚 */
Buzzer_PORT |= Buzzer_PINNum; /* 打开蜂鸣器 */
delay_us(500); /* 延时 500us */
Buzzer_PORT &= ~Buzzer_PINNum; /* 关闭蜂鸣器 */
}
#ifdef MCU_No_ExtendedParallelBus /* 无扩展并行总线结构单片机的条件编译 */
/*----------------------------------------------------------------------------
函数功能: 本函数用于虚拟扩展并行总线结构的向外围器件写入数据操作。
函数入口参数:AccessAddress ------ 访问的外围器件地址。
WriteData ---------- 写入的数据。
备注: 本函数仅可访问外围器件的地址数不超过256个。
----------------------------------------------------------------------------*/
void VEPB_WriteData(volatile Uchar8 AccessAddress, volatile Uchar8 WriteData)
{
VEPB_AD_DDR = 0xFF; /* 设置虚拟总线地址/数据总线的数据方向为输出 */
VEPB_AD_PORT = AccessAddress; /* 写入访问的外围器件地址到总线上 */
VEPB_ALE_PORT |= VEPB_ALE_PINNum; /* 地址锁存到外围器件 */
VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;
VEPB_AD_PORT = WriteData; /* 写入数据 */
VEPB_WR_PORT &= ~VEPB_WR_PINNum; /* 使能写入数据 */
VEPB_WR_PORT |= VEPB_WR_PINNum;
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于虚拟扩展并行总线结构的从外围器件读取数据操作。
函数入口参数:AccessAddress ------ 访问的外围器件地址。
函数出口参数:读取的数据。
备注: 本函数仅可访问外围器件的地址数不超过256个。
----------------------------------------------------------------------------*/
Uchar8 VEPB_ReadData(volatile Uchar8 AccessAddress)
{
volatile Uchar8 temp; /* 出口参数寄存器变量 */
VEPB_AD_DDR = 0xFF; /* 设置虚拟总线地址/数据总线的数据方向为输出 */
VEPB_AD_PORT = AccessAddress; /* 写入访问的外围器件地址到总线上 */
VEPB_ALE_PORT |= VEPB_ALE_PINNum; /* 地址锁存到外围器件 */
VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;
VEPB_AD_DDR = 0x00; /* 设置虚拟总线地址/数据总线的数据方向为输入 */
VEPB_AD_PORT = 0xFF; /* 使能虚拟总线地址/数据总线的上拉电阻 */
VEPB_RD_PORT &= ~VEPB_RD_PINNum; /* 使能读取数据 */
temp = VEPB_AD_PIN; /* 读取数据 */
temp = VEPB_AD_PIN; /* 加大读取数据脉冲信号的宽度 */
VEPB_RD_PORT |= VEPB_RD_PINNum;
return (temp);
}
#endif /* "MCU_No_ExtendedParallelBus" 条件编译结束 */
/*----------------------------------------------------------------------------
函数功能: 本函数用于外部中断请求0中断向量的初始化操作。
备注: ①.本函数仅在主函数中调用一次即可。
②.要使能中断还必须在主程序中打开全局中断使能功能,推荐其指令如下:
SREG |= BIT7; / * 使能全局中断 * /
----------------------------------------------------------------------------*/
void external_INT0_initialization(void)
{
#ifdef _MEGA16_INCLUDED_ /* 目标器件芯片为 ATMega16 的条件编译 */
MCUCR &= ~BIT0; /* 设置外部中断请求0的触发方式为:下降沿触发 */
MCUCR |= BIT1;
GICR |= BIT6; /* 使能外部中断请求0 */
GIFR |= BIT6; /* 外部中断请求0标志位清零 */
#endif /* "_MEGA16_INCLUDED_" 条件编译结束 */
#ifdef _MEGA128_INCLUDED_ /* 目标器件芯片为 ATMega128 的条件编译 */
EICRA &= ~BIT0; /* 设置外部中断请求0的触发方式为:下降沿触发 */
EICRA |= BIT1;
EIMSK |= BIT0; /* 使能外部中断请求0 */
EIFR |= BIT6; /* 外部中断请求0标志位清零 */
#endif /* "_MEGA128_INCLUDED_" 条件编译结束 */
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于 DS12887 闹钟中断请求和更新周期结束中断请求处理的中断服务程序。
备注: ①.注意:由于本函数为中断函数,故在调用和返回时无法进行明式数值传递,
因此将在函数体中隐式修改下面这几个全局静态变量数值。
⑴.时间消息的任务变量(tasks_time),用以通知系统执行相应的处理操作。
⑵.系统时间结构变量(time),从 DS12887 中读取更新的系统时间数值。
②.本函数需在设置的 DS12887 中断请求的中断向量函数中调用。在调用之前
需对该中断向量进行初始化,以使能该中断。例:如使用外部中断请求0,
可使用上面提供的 external_INT0_initialization() 函数进行初始化,
而将本本函数放在外部中断请求0服务程序中。
----------------------------------------------------------------------------*/
void DS12887_INT_ISR(void)
{
register Uchar8 temp; /* 临时寄存器变量 */
register Uchar8 temp2; /* 临时寄存器变量2 */
DS12887_CS_PORT &= ~DS12887_CS_PINNum;/* 置 DS12887 片选控制引脚为L */
#ifdef MCU_No_ExtendedParallelBus /* 无扩展并行总线结构单片机的条件编译 */
/* 读取 DS12887 寄存器C(中断标志寄存器)的内容,访问该寄存器后将自动清零所有
标志位,否则芯片将无法产生下一次中断请求。其次可对读取的中断标志位进行判断。 */
temp = VEPB_ReadData(DS12887_REG_C);
#else
temp = DS12887_REG_C;
#endif /* "MCU_No_ExtendedParallelBus" 条件编译结束 */
temp2 = temp;
/* 检查是否为闹钟中断?是,则通知系统对闹钟请求执行相应的处理 */
if ((temp&BIT5)==BIT5)
{
tasks_time |= BIT1; /* 闹钟告警消息任务位置位 */
}
/* 检查是否为更新周期结束中断?是,则通知系统对更新周期结束请求执行相应的处理 */
if ((temp2&BIT4)==BIT4)
{
/* 读取 DS12887 中更新的系统时间数值 */
#ifdef MCU_No_ExtendedParallelBus /* 无扩展并行总线结构单片机的条件编译 */
time.BCD_Second = VEPB_ReadData(DS12887_Second);
time.BCD_Minute = VEPB_ReadData(DS12887_Minute);
time.BCD_Hour = VEPB_ReadData(DS12887_Hour);
time.BCD_Date = VEPB_ReadData(DS12887_Date);
time.BCD_Month = VEPB_ReadData(DS12887_Month);
time.BCD_Year = VEPB_ReadData(DS12887_Year);
time.BCD_Year_H = VEPB_ReadData(DS12887_Year_H);
time.BCD_Week = VEPB_ReadData(DS12887_Week);
#else
time.BCD_Second = DS12887_Second;
time.BCD_Minute = DS12887_Minute;
time.BCD_Hour = DS12887_Hour;
time.BCD_Date = DS12887_Date;
time.BCD_Month = DS12887_Month;
time.BCD_Year = DS12887_Year;
time.BCD_Year_H = DS12887_Year_H;
time.BCD_Week = DS12887_Week;
#endif /* "MCU_No_ExtendedParallelBus" 条件编译结束 */
tasks_time |= BIT0; /* 时间更新消息任务位置位 */
}
DS12887_CS_PORT |= DS12887_CS_PINNum;/* 置 DS12887 片选控制引脚为H */
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于 DS12887 的各控制输入/输出引脚定义和初始状态设置的初始化操作。
备注: 本函数仅在主函数中调用一次即可。
----------------------------------------------------------------------------*/
void RTC_DS12887_initialization(void)
{
register Uchar8 temp; /* 临时寄存器变量 */
/* 下面这些语句用于设置 DS12887 的各控制引脚与MCU的连接定义和初始状态 */
DS12887_CS_DDR |= DS12887_CS_PINNum; /* 设置 DS12887 片选控制为输出引脚 */
DS12887_CS_PORT |= DS12887_CS_PINNum; /* 置 DS12887 片选控制引脚为H */
DS12887_IRQ_DDR &= ~DS12887_IRQ_PINNum;/* 设置 DS12887 中断请求为输入引脚 */
DS12887_IRQ_PORT |= DS12887_IRQ_PINNum;/* 使能 DS12887 中断请求引脚的上拉电阻 */
#ifdef MCU_No_ExtendedParallelBus /* 无扩展并行总线结构单片机的条件编译 */
VEPB_ALE_DDR |= VEPB_ALE_PINNum; /* 设置虚拟总线控制线地址锁存使能为输出引脚 */
VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;
VEPB_WR_DDR |= VEPB_WR_PINNum; /* 设置虚拟总线控制线写使能信号为输出引脚 */
VEPB_WR_PORT |= VEPB_WR_PINNum;
VEPB_RD_DDR |= VEPB_RD_PINNum; /* 设置虚拟总线控制线读锁存信号为输出引脚 */
VEPB_RD_PORT |= VEPB_RD_PINNum;
VEPB_AD_DDR = 0x00; /* 设置虚拟总线地址/数据总线的数据方向为输入 */
VEPB_AD_PORT = 0xFF; /* 使能虚拟总线地址/数据总线的上拉电阻 */
#else
MCUCR |= BIT7; /* 使能外部存储器接口 */
#endif /* "MCU_No_ExtendedParallelBus" 条件编译结束 */
/* 下面这些语句用于 DS12887 初始化操作 */
DS12887_CS_PORT &= ~DS12887_CS_PINNum;/* 置 DS12887 片选控制引脚为L */
#ifdef MCU_No_ExtendedParallelBus /* 无扩展并行总线结构单片机的条件编译 */
/* 启动晶体振荡器,关闭周期中断方波输出 */
VEPB_WriteData(DS12887_REG_A, 0x20);
/* 芯片处于正常工作状态、允许更新周期结束中断、闹钟中断保持原设置状态、
关闭周期中断、关闭方波输出、采用 BCD 码数据格式和 24 小时制模式 */
temp = VEPB_ReadData(DS12887_REG_B);
temp &= 0x32;
temp |= 0x12;
VEPB_WriteData(DS12887_REG_B, temp);
/* 检查内置电池能量状态?如果电池耗尽,系统将进行告警 */
temp = VEPB_ReadData(DS12887_REG_D);
if ((temp&BIT7)==0)
{
Buzzer();
}
/* 写入年前两位数据为 20 */
VEPB_WriteData(DS12887_Year_H, 0x20);
/* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */
temp = VEPB_ReadData(DS12887_REG_C);
#else
/* 启动晶体振荡器,关闭周期中断方波输出 */
DS12887_REG_A = 0x20;
/* 芯片处于正常工作状态、允许更新周期结束中断、关闭周期中断和闹钟中断、
关闭方波输出、采用 BCD 码数据格式和 24 小时制模式 */
temp = DS12887_REG_B;
temp &= 0x32;
temp |= 0x12;
DS12887_REG_B = temp;
/* 检查内置电池能量状态?如果电池耗尽,系统将进行告警 */
temp = DS12887_REG_D;
if ((temp&BIT7)==0)
{
Buzzer();
}
/* 写入年前两位数据为 20 */
DS12887_Year_H = 0x20;
/* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */
temp = DS12887_REG_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 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);
};
}
上一篇:用atmega8做简单的红外线报警器
下一篇:PID应用于电机闭环调速系统
推荐阅读最新更新时间:2024-03-16 15:18