本帖最后由 MOn51 于 2015-4-18 20:03 编辑
给你一个:
#include "Use.h"
#include "Ver.H"
//**********************************************************
#define Wr_IIC 0xa2
#define Rd_IIC (Wr_IIC+1)
#define HIGH 1
#define LOW 0
#define NOP_1uS() NOP()//;NOP();NOP()//;NOP();NOP();NOP()
//定义管脚********************************
#define SDA TRISIO1
#define SCL TRISIO0
#define SDA_IN GPIO1
#define SDA_OUT TRISIO1=0
/***********************************************
开始位
************************************************/
void Start_IIC(void){
SDA=HIGH;
SCL=HIGH;
NOP_1uS();
SDA=LOW;
SCL=LOW;
}
/********************************
停止位
**********************************/
void Stop_IIC(void){
SDA=LOW;
SCL=HIGH;
NOP_1uS();
SDA=HIGH;
SCL=LOW;
}
/*********************************
应答位,返回SDA信号
**********************************/
unsigned char Ack(void){
unsigned char cy;
SCL=HIGH;
cy=SDA_IN;
SCL=LOW;
return cy;
}
/***********************************
主应答 返回SDA
************************************/
void McuAck(void){
SDA=LOW;
SCL=HIGH;
NOP_1uS();
SCL=LOW;
}
/************************************
不应答
*************************************/
void Mcu_NO_Ack(void){
SDA=HIGH;
SCL=HIGH;
NOP_1uS();
SCL=LOW;
}
/************************************
写入一个字节 ,返回成功标志
*************************************/
void Wr_Byte(unsigned char Dat){
unsigned char i;
for (i=0;i<8;i++){
SDA= ((Dat & 0x80)>0)? 1:0;
Ack();
Dat<<=1;
}
SDA=HIGH;
Ack();
}
/**********************************
读取一个字节
***********************************/
unsigned char Rd_Byte(void){
unsigned char i,j;
SDA=HIGH;
for (i=0;i<8;i++){
j<<=1;
j +=Ack();
}
return j;
}
/****************************************************
连续写入字节,返回UINT8标志
*****************************************************/
void Wr_PCF8563(unsigned char EeAdr,unsigned char *RamAdr,unsigned char Number){
Start_IIC();
Wr_Byte(0xa2); /*写命令*/
Wr_Byte(EeAdr); /*写地址*/
while (Number--){
Wr_Byte(*RamAdr++); //2004-12-19
}
Stop_IIC();
}
/****************************************************
连续读取,返回UINT8标志
*****************************************************/
void Read_PCF8563(unsigned char EeAdr,unsigned char *RamAdr,unsigned char Number){
Start_IIC();
Wr_Byte(0xa2); /*写命令*/
Wr_Byte(EeAdr); /*写地址*/
Start_IIC();
Wr_Byte(0xa3);
while (--Number){
*RamAdr++=Rd_Byte();
McuAck();
}
*RamAdr=Rd_Byte();
Mcu_NO_Ack();
Stop_IIC();
}
/***************************************
BCD转换BIN
***************************************/
unsigned char BCDToBIN(unsigned char i){
unsigned char j;
j = i & 0x0f; //保护
return ((i>>4)*10+j);
}
/**************************************
BIN转化BCD
**************************************/
unsigned char BINToBCD(unsigned char i){
unsigned char j;
j=i%10; //得余数
i=i/10;
i=i<<4;
return (i|j);
}
/*************************************************************
初始化PCF8563 YEAR D6=1 代表已经初始化
*************************************************************/
void PCF8563_config(void){
unsigned char Buf[2],i=10;
TIMER t;
// Buf[0]=0; Buf[1]=0;
// Wr_PCF8563(0,Buf,1);
tDelay(18000);
Read_Timer(&t);
t.Sec=7;
t.Min=51;
t.Hour=8;
t.Day=8;
t.Mon=5;
t.Week=6;
t.Year=5;
Write_Timer(&t);
Buf[0]=0; Buf[1]=0;
Wr_PCF8563(0,Buf,1);
}
//*******************************************************************
//读取时间
//*******************************************************************
void Read_Timer(TIMER *timer){
TIMER t;
unsigned char i,*p,*pT;//,buf[8];
// buf[0]=0; buf[1]=0;
// Wr_PCF8563(0,buf,2);
Read_PCF8563(2,(unsigned char *)&t,7);
// i=t.Year & 0x40;
/*
t.Sec=buf[0];
t.Min=buf[1];
t.Hour=buf[2];
t.Day=buf[3];
t.Week=buf[4];
t.Mon=buf[5];
t.Year=buf[6];
*/
// if(i==0){
// PCF8563_config();
// }else{
t.Year &=B1011_1111;
t.Sec &=B0111_1111;
t.Mon &=B0001_1111;
t.Week &=B0000_0111;
t.Day &=B0011_1111;
t.Hour &=B0011_1111;
t.Min &=B0111_1111;
p=(unsigned char *)timer;
pT=(unsigned char *)&t;
for(i=0;i<sizeof(t);i++) *p++=BCDToBIN(*pT++);
// }
}
/********************************************************************
写入时间,年必须添加标志位!
*********************************************************************/
void Write_Timer(TIMER *timer){
TIMER t;
// unsigned char buf[8];
unsigned char i,*p,*pT;
p=(unsigned char *)&t;
pT=(unsigned char *)timer;
for(i=0;i<sizeof(t);i++) *p++=BINToBCD(*pT++);
t.Year |=0x40;
Wr_PCF8563(2,(unsigned char *)&t,7);
}
|