⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563lib.c

📁 基于AT89S52控制芯片的电子万年历程序
💻 C
字号:
#include "PCF8563lib.h"

void PCF8563_Delay(uint n)
{
    uint i;
    for(i=0;i<n;i++);
}

void PCF8563_SetCS(struct c_s cs)                    /*设置控制/状态子函数*/
{
    IICWrite(0xa2,0,(uchar*)&cs,sizeof(struct c_s));  /*指针转换*/
    PCF8563_Delay(100);
}

void PCF8563_ReadCS(struct c_s* cs)                  /*读控制/状态字*/
{
    IICRead(0xa2,0,(uchar*)cs,sizeof(struct c_s));
}

void PCF8563_ReadTime(struct time* tm)                /*读时间函数*/
{
    IICRead(0xa2,2,(uchar*)tm,sizeof(struct time));
    tm->seconds &= 0x7f;                                /*屏蔽无关位*/
    tm->minutes &= 0x7f;
    tm->hours &= 0x3f;
    tm->days &= 0x3f;
    tm->weekdays &= 0x07;
    tm->mon_cen &= 0x1f;
}

bit PCF8563_SetTime(struct time tm)                    /*设定时间函数*/
{
    tm.seconds = (tm.seconds%10) | ((tm.seconds/10)<<4);  /*HEX到BCD*/
    tm.minutes = (tm.minutes%10) | ((tm.minutes/10)<<4);
    tm.hours = (tm.hours%10) | ((tm.hours/10)<<4);
    tm.days = (tm.days%10) | ((tm.days/10)<<4);
    tm.weekdays = tm.weekdays;
    tm.mon_cen = (tm.mon_cen%10) | ((tm.mon_cen/10)<<4);
    tm.years = (tm.years%10) | ((tm.years/10)<<4);
    
    IICWrite(0xa2,2,(uchar*)&tm,sizeof(struct time));
    PCF8563_Delay(100);
    return 0;
    
}

void PCF8563_ReadAlarm(struct alarm* alm)               /*读闹钟函数*/
{
    IICRead(0xa2,9,&alm->minute,1);
    IICRead(0xa2,10,&alm->hour,1);
    IICRead(0xa2,11,&alm->day,1);
    IICRead(0xa2,12,&alm->weekday,1);
    
    alm->minute &= 0x7f;                                  /*屏蔽无关位*/
    alm->hour &= 0x3f; 
    alm->day &= 0x3f; 
    alm->weekday &= 0x07; 
    
}

bit PCF8563_SetAlarm(struct alarm alm,bit min,bit hou,bit day,bit wee)
                                                          /*设定闹钟函数*/
{
    if(min){                                              /*如果需要使能分钟报警*/
      alm.minute = (alm.minute%10) | ((alm.minute/10)<<4);
      alm.minute = alm.minute & 0x7f;   
}else{
      alm.minute = alm.minute | 0x80;
}
    if(hou){                                              /*如果需要使能小时报警*/
      alm.hour = (alm.hour % 10) | ((alm.hour/10)<<4);
      alm.hour = alm.hour & 0x7f;
}else{
      alm.hour = alm.hour | 0x80;
}
    if(day){                                              /*如果需要使能天报警*/
      alm.day = (alm.day % 10) | ((alm.day/10)<<4);
      alm.day = alm.day & 0x7f;
}else{
      alm.day = alm.day | 0x80;
}
    if(wee){                                              /*如果需要使能星期报警*/
      alm.weekday = (alm.weekday % 10) | ((alm.weekday/10)<<4);
      alm.weekday = alm.weekday & 0x7f;
}else{
      alm.weekday = alm.weekday | 0x80;
}
  IICWrite(0xa2,9,(uchar*)&alm,sizeof(struct alarm));       /*指针转换*/
  PCF8563_Delay(100);
  return 0;
}

void PCF8563_StartTimer(char freq)                           /*启动定时器*/   
{
    uchar cmd;
    switch(freq)
    {
    case 0:cmd = 0x80;break;
    case 1:cmd = 0x81;break;
    case 2:cmd = 0x82;break;
    case 3:cmd = 0x83;break;
    default:cmd = 0x82;break;
    }
    
    IICWrite(0xa2,14,&cmd,1);
}  
void PCF8563_StopTimer(void)                                /*启动定时器*/
{
    uchar cmd;
    IICRead(0xa2,14,&cmd,1);
    cmd & = 0x7f;
    IICWrite(0xa2,14,&cmd,1);
}       
void PCF8563_SetTimerCount(uchar count)                     /*设置定时器初值*/
{
    IICWrite(0xa2,15,&count,1);
}                               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -