实时时钟芯片 DS12887 接口驱动程序
扫描二维码
随时随地手机看文章
****************************************************************************************
源程序文件名:RTC_DS12887.C
源程序名称:实时时钟芯片DS12887接口驱动的源程序文件
程序版本: 1.0
程序功能:
本程序是用ATmega16控制实时时钟芯片DS12887接口驱动的源程序文件。
程序说明:
函数入口参数:
函数出口参数:
编译工具软件:CodeVisionAVRC版本: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"/*本程序的头部文件*/
/*======================================================================================
程序指令代码清单
======================================================================================*/
/*----------------------------------------------------------------------------
全局静态变量定义:
----------------------------------------------------------------------------*/
staticvolatileUchar8tasks_time=0;/*时间消息的任务变量*/
/*时间消息的任务变量的各位定义如下:
┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓
┃BIT7┃BIT6┃BIT5┃BIT4┃BIT3┃BIT2┃BIT1┃BIT0┃
┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫
┃保留┃保留┃保留┃保留┃保留┃蜂鸣声响┃闹钟告警┃时间更新┃
┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛
*/
staticvolatileUint16buzzer_alarm_counter=0;/*蜂鸣器发出声响次数*/
staticvolatileBCD_TIMEtime=BCD_TIME_defaults;/*系统时间结构变量*/
/*----------------------------------------------------------------------------
函数功能:本函数用于控制蜂鸣器发出声响告警的操作,设定蜂鸣器频率为2000Hz。
备注:蜂鸣器设置为相应的控制引脚高电平时,蜂鸣器发出声响。
----------------------------------------------------------------------------*/
voidBuzzer(void)
{
Buzzer_DDR|=Buzzer_PINNum;/*设置蜂鸣器控制端口为输出引脚*/
Buzzer_PORT|=Buzzer_PINNum;/*打开蜂鸣器*/
delay_us(500);/*延时500us*/
Buzzer_PORT&=~Buzzer_PINNum;/*关闭蜂鸣器*/
}
#ifdefMCU_No_ExtendedParallelBus/*无扩展并行总线结构单片机的条件编译*/
/*----------------------------------------------------------------------------
函数功能:本函数用于虚拟扩展并行总线结构的向外围器件写入数据操作。
函数入口参数:AccessAddress------访问的外围器件地址。
WriteData----------写入的数据。
备注:本函数仅可访问外围器件的地址数不超过256个。
----------------------------------------------------------------------------*/
voidVEPB_WriteData(volatileUchar8AccessAddress,volatileUchar8WriteData)
{
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个。
----------------------------------------------------------------------------*/
Uchar8VEPB_ReadData(volatileUchar8AccessAddress)
{
volatileUchar8temp;/*出口参数寄存器变量*/
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;/*使能全局中断*/
----------------------------------------------------------------------------*/
voidexternal_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服务程序中。
----------------------------------------------------------------------------*/
voidDS12887_INT_ISR(void)
{
registerUchar8temp;/*临时寄存器变量*/
registerUchar8temp2;/*临时寄存器变量2*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片选控制引脚为L*/
#ifdefMCU_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中更新的系统时间数值*/
#ifdefMCU_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的各控制输入/输出引脚定义和初始状态设置的初始化操作。
备注:本函数仅在主函数中调用一次即可。
----------------------------------------------------------------------------*/
voidRTC_DS12887_initialization(void)
{
registerUchar8temp;/*临时寄存器变量*/
/*下面这些语句用于设置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中断请求引脚的上拉电阻*/
#ifdefMCU_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*/
#ifdefMCU_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码)。
备注:
----------------------------------------------------------------------------*/
voidSET_DS12887_TimeRegister(volatileUchar8SET_BCD_Year_H,/*年前两位*/
volatileUchar8SET_BCD_Year,/*年*/
volatileUchar8SET_BCD_Month,/*月份*/
volatileUchar8SET_BCD_Date,/*日期*/
volatileUchar8SET_BCD_Hour,/*小时*/
volatileUchar8SET_BCD_Minute,/*分钟*/
volatileUchar8SET_BCD_Second,/*秒*/
volatileUchar8SET_BCD_Week)/*星期*/
{
registerUchar8temp;/*临时寄存器变量*/
registerUchar8temp2;/*临时寄存器变量2*/
SREG&=~BIT7;/*关闭全局中断*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片选控制引脚为L*/
#ifdefMCU_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中的一个。
----------------------------------------------------------------------------*/
voidDS12887_AlarmClock(Uchar8AC_status)
{
registerUchar8temp;/*临时寄存器变量*/
if(AC_status==ON)
{
SREG&=~BIT7;/*关闭全局中断*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片选控制引脚为L*/
#ifdefMCU_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*/
#ifdefMCU_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秒。
----------------------------------------------------------------------------*/
voidSET_DS12887_AlarmClock(Uchar8SET_BCD_HouAlm,Uchar8SET_BCD_MinAlm)
{
SREG&=~BIT7;/*关闭全局中断*/
DS12887_CS_PORT&=~DS12887_CS_PINNum;/*置DS12887片选控制引脚为L*/
#ifdefMCU_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(蜂鸣器发出声响次数)变量的数值。
----------------------------------------------------------------------------*/
voidTasks_AlarmClock(Uint16BAC_number)
{
registerUchar8temp;/*临时寄存器变量*/
registerUint16temp_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。
----------------------------------------------------------------------------*/
voidTasks_TimeUpdate(Uchar8LCDM_ShowMode)
{
registerUchar8temp;/*临时寄存器变量*/
temp=tasks_time;
/*如果更新中断消息任务位置位,将执行相应的更新处理操作*/
if((temp&BIT0)==BIT0)
{
switch(LCDM_ShowMode)
{
case8:
LCDM_DayTime_Show_8_16(&time);/*在液晶上显示8×16字符的日期和时间*/
break;
case16:
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]voidext_int0_isr(void)
{
DS12887_INT_ISR();
}
voidmain(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);
};
}