- UID
- 809618
|
#include <hidef.h> /* common defines and macros */
#include <mc9s12dp512.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp512"
///////////////
// IIC 部分 //
///////////////
void IIC_int() /* IIC初始化 */
{
IBFD=0x2b; /* 设置时钟为总线频率512分频 */
IBCR|=0x80; /* 使能IIC */
}
void IIC_Start1() /* 起始条件 */
{
IBCR|=0x30;
}
void IIC_Start2() /* 起始条件 */
{
IBCR|=0x00;
}
void IIC_Stop() /* 停止条件 */
{
IBCR&=0xdf; /* 停止 */
}
void delay(unsigned long m) /* 延时 */
{
while(m--);
}
unsigned char IIC_send_data(unsigned char ch) /* IIC发送程序 */
{
IBSR_IBIF=1; /* 清除标志位 */
IBDR=ch;
while(!IBSR_IBIF); /* 等待响应 */
}
void wait_ack() /* 应答等待程序 */
{
while(IBSR_RXAK);
}
// PLL //
void Set_PLL(void) //初始化PLL子程序,总线时钟为PLL的2分频
{
SYNR=0x02;
REFDV=0x01;
while (!(CRGFLG & 0x08)); //等待时钟频率已稳定锁相环频率已锁定
CLKSEL_PLLSEL=1; //选定所相环时钟
}
//////////////////
// PCF8563 部分 //
//////////////////
unsigned char P8563_Read_Time();
unsigned char P8563_Set_Time();
extern struct Time time; /* 用于装载时间数据的结构体型的变量time */
struct Time /* 时间结构体,包括了秒,分,时,日,周,月,年 */
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char day;
unsigned char week;
unsigned char month;
unsigned char year;
};
unsigned char PCF8563_Write_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf)
{
unsigned char i=0;
IIC_Start1(); /*IIC通信开始 */
if(IIC_send_data(0xa2)) return 1; /*写PCF8563的ID与读写控制位,通信有错误立即返回 */
if(IIC_send_data(addr)) return 1; /*写寄存器地址 */
for(i=0;i<length;i++) /* 写入length个字节 */
{
if(IIC_send_data(pbuf[i])) return 1;/*写数据 */
}
IIC_Stop();
return 0;
}
unsigned char PCF8563_Read_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf) /*从地址addr连续读取length个字节到pbuf */
{
unsigned char i=0,err=0;
IIC_Start1(); /* IIC通信开始 */
if(IIC_send_data(0xa2)) return 1; /* 写PCF8563的ID与读写控制位,通信有错误立即返回 */
if(IIC_send_data(addr)) return 1; /* 写寄存器地址 */
IIC_Start2(); /* IIC通信开始 */
if(IIC_send_data(0xa3)) return 1; /* 写PCF8563的ID与读写控制位 */
for(i=0;i<length-1;i++) /* 写入前length-1个字节,并作出应答 */
{
pbuf[i]=IIC_send_data(addr); /* 读数据 */
while(IBSR_RXAK);
}
pbuf[i]=IIC_send_data(addr); /*写入最后一个字节,并作出无应答 */
while(!IBSR_RXAK);
IIC_Stop();
return 0;
}
unsigned char BCD2Val(unsigned char x)
{
return (x>>4)*10+(x&0x0f); /* 高4位乘以10,再加上低4位,即得到数值 */
}
unsigned char Val2BCD(unsigned char x)
{
return (x/10)*16+(x%10); /* 将十进制的数值十位乘以16,再加上个位,即得到BCD码 */
}
unsigned char P8563_Read_Time()
{
unsigned char temp[7];
if(!PCF8563_Read_Bytes(0x02,7,temp)) /* 读取时间,即读取PCF8563的时间寄存器,地址从0x02开始 */
{
/* 以下对读取到temp数组中的时间数据进行截取 */
/* 并转换为十进制数值写入到time中去 */
time.second=BCD2Val(temp[0]&0x7f); //秒
time.minute=BCD2Val(temp[1]&0x7f); //分
time.hour =BCD2Val(temp[2]&0x3f); //小时
time.day =BCD2Val(temp[3]&0x3f); //日
time.week =BCD2Val(temp[4]&0x07); //星期
time.month =BCD2Val(temp[5]&0x1f); //月
time.year =BCD2Val(temp[6] ); //年
return 0;
}
else
return 1;
}
unsigned char P8563_Set_Time()
{
unsigned char temp[7];
unsigned char i;
for(i=0;i<7;i++)
{
temp[i]=Val2BCD(((unsigned char *)(&time))[i]);/* 将time中的时间数据转换为BCD格式,并写入到temp数组中 */
}
return PCF8563_Write_Bytes(0x02,7,temp); /* 将temp数组的数据写入到PCF8563中 */
}
////////////
// 主程序 //
////////////
void main()
{IIC_int();
EnableInterrupts;
Set_PLL;
P8563_Set_Time(); /* 设置时间,即将time中的时间数据写入PCF8563 */
time.year =10; /* 向time中装入要设置的时间数据 */
time.month = 5;
time.day =16;
time.hour =10;
time.minute=25;
time.second=50;
time.week = 7;
while(1) /* 循环 */
{
P8563_Read_Time(); /* 读取时间 */
delay(60000); /* 延时一段时间 */
}
while(1);
} |
|