DS12887接口驱动程序(接上篇)_zhideer_百度空间

/*----------------------------------------------------------------------------
函数功能:    本函数用于修改设置 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);   
};
}



郑重声明:资讯 【DS12887接口驱动程序(接上篇)_zhideer_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——