AnsweredAssumed Answered

PFC8563软件驱动遇到问题,可以加我QQ369890771沟通吗,这个QQ邮箱也可以沟通

Question asked by 建生 方 on Apr 10, 2016

PFC8563软件驱动遇到问题,可以加我QQ369890771沟通吗,这个QQ邮箱也可以沟通

PFC8563软件部分是这样的:

#include    "config.h"

void delay(unsigned int n)

{

unsigned int i;

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

}

/*----------------------------------------------- 

函数说明:开始位

-----------------------------------------------  

void start_i2c(void)  

{

SCL=1;NOP(); 

SDA=1;NOP(); 

SDA=0;NOP(); 

SCL=1;NOP(); 

}*/

void I2CStart(void)

{

EA=0;

SDA=1;

SCL=1;

delay(5);//INI

SDA=0;

delay(5); //START

SCL=0;

}

/*----------------------------------------------- 

函数说明:停止位 

-----------------------------------------------  

void stop_i2c(void)  

{  

SDA=0;NOP(); 

SCL=1;NOP(); 

SDA=1;NOP(); 

SCL=1;_nop_();

}   */

void I2CStop(void)

{

SCL=0;

SDA=0;

delay(5); //INI

SCL=1;

delay(5);

SDA=1; //STOP

EA=1;

}

 

 

/*----------------------------------------------- 

调用方式:void SendAck(void) ﹫2001/07/0 4

函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。

-----------------------------------------------  

void ack_i2c(void)  

{  

SDA=1;NOP(); 

SCL=0;NOP(); 

SCL=1;NOP(); 

SCL=0;NOP(); 

}   */

void SendAck(void)

{

SDA=0;

delay(5);

SCL=1;

delay(5);

SCL=0;

}

/*----------------------------------------------- 

函数说明:无需应答位,在读程序中用到 

----------------------------------------------- 

void no_ack(void)  

{  

SDA=1;NOP(); 

SCL=1;NOP(); 

SCL=0;NOP(); 

}   */

void  SendNotAck(void)

{

SDA=1;

delay(5);

SCL=1;

delay(5);

SCL=0;

}

/*----------------------------------------------- 

调用方式:bit I2CAck(void) ﹫2001/07/0 4

函数说明:私有函数,I2C专用,等待从器件接收方的应答

-----------------------------------------------  */

bool WaitAck(void)

{

uchar errtime=255;//

SDA=1;

delay(5);

SCL=1;

delay(5);

while(SDA)//

{

errtime--;

if(!errtime){

I2CStop();

SystemError=0x11;

return false;}

}

SCL=0;

return true;

}

/*----------------------------------------------- 

函数说明:写一个字节(8位)数据 

----------------------------------------------- 

void write_8bit(uchar ch)  

{  

uchar i;  

SCL=0;NOP(); 

for(i=0;i<8;i++)  

{  

SDA=(bit)(ch&0x80);NOP(); 

ch<<=1;  

SCL=1;NOP();

SCL=0;NOP();

}

}*/

void I2CSendByte(Byte chbyte)

{

uchar cntni=8;

while (cntni--)

{

SCL=0;

_nop_();

SDA=(bit)(chbyte&0x80);//

chbyte<<=1;

delay(5);

SCL=1;

delay(5);

}

SCL=0;//

}

/*---------------------------------------------- 

函数说明:读写一个字节(8位)数据 

----------------------------------------------- 

uchar read_8bit(uchar addr )  

{

uchar temp;  

uchar i;  

start_i2c();  

write_8bit(0xA2);         //8563器件写地址     0xA2=10100010  ,读写  A0 为1

ack_i2c();  

write_8bit(addr);

ack_i2c();

start_i2c();

write_8bit(0xA3);        //8563器件读地址  

ack_i2c();

for(i=0;i<9;i++)  

  {

   temp=temp|SDA;  

   if(i<8)  

   {

    temp=temp<<1;  

   }

  SCL=0;NOP(); 

  SCL=1;NOP(); 

  }

if(addr!=0x08)    //除最后一个字节外,其他都要从MASTER发应答。    ?

{ack_i2c();}  

no_ack();

stop_i2c();

return(temp);

}  

void write_one(uchar addr,uchar ddata)  

{  

start_i2c();

write_8bit(0xA2);

ack_i2c();  

write_8bit(addr);  

ack_i2c();

write_8bit(ddata);

ack_i2c();

stop_i2c();

}*/

Byte I2CReceiveByte(void)

{

unsigned char cnti2=8;

unsigned char ddata=0;

SDA=1;

while (cnti2--)

{

ddata<<=1;

SCL=0;

delay(5);//

SCL=1;

delay(5);

ddata|=SDA;

}

SCL=0;//

return ddata;

}

/*----------------------------------------------- 

函数说明:修改时间:年,月,日,星期,时(24小时制),分,秒 

-----------------------------------------------*/  

/*

void wt_time(uchar *time)  

{  

uchar i;  

temp[6]=time[0];  //年    0x00

temp[5]=time[1];   //月   0x50       0101 0000  12月

temp[3]=time[2];   //日   0x21       0010 0001    1日

temp[4]=time[3];   //星期   0x07    

temp[2]=time[4];   //时   0x30,     0x30 =0011 0000=48    48二进制就是0011 0000

temp[1]=time[5];   //分   0X01,     

temp[0]=time[6];   //秒    0x04

start_i2c();  

write_8bit(0xA2);  

ack_i2c();

write_8bit(0x02);  

ack_i2c();

for(i=0;i<7;i++)

{  

write_8bit(temp[i]);

ack_i2c();

//addrl=addrl+1;       //页写不须软件累加地址,器件按存入字节数自动累加地址  

}

stop_i2c();

}   */  

/*----------------------------------------------- 

void GETPCF8563(uchar firsttype,uchar count,uchar *buFF)

功能:读取时钟芯片8563的时间,要设置要读的第一个时间类型

firsttype,并设置读取的字节数,则一次把时间读取到buFF中,

顺序是:0x02:秒,0x03:分,0x04:小时,0x05:日,0x06:星期,

0x07:月(世纪),0x08年:

-----------------------------------------------------*/  

void GetPCF8563(uchar firsttype,uchar count,uchar *buff)

{

uchar cnti;

I2CStart();

I2CSendByte(0xA2);

WaitAck();

I2CSendByte(firsttype);

WaitAck();

I2CStart();

I2CSendByte(0xA3);

WaitAck();

for (cnti=0;cnti<count;cnti++)

{

buff[cnti]=I2CReceiveByte();

if(cnti!=count-1) SendAck();//

}

SendNotAck();

I2CStop();

RSTSTAT=0x26;

}

 

 

void SetPCF8563(uchar timetype,uchar value)

{

bit re;

I2CStart();

I2CSendByte(0xA2);

re=WaitAck();

I2CSendByte(timetype);

WaitAck();

I2CSendByte(value);

WaitAck();

I2CStop();

RSTSTAT=0x26;

}

/*

void rd_time(uchar *time)  

{  

int i;  

uchar addr=0x02;  

uchar temp;  

uchar temp2;  

for(i=0;i<7;i++)  

{

   temp=read_8bit(addr);

   if(i==0)            //去掉无效位  //秒  

   {temp2=temp&0x7f;   time[6]=temp2;}

   if(i==1)            //去掉无效位    //分  

   {temp2=temp&0x7f;   time[5]=temp2;}

   if(i==2)     //时    

   {temp2=temp&0x3f; time[4]=temp2;}

   if(i==3)     //日     

   {temp2=temp&0x3f; time[2]=temp2; }

   if(i==4)          //星期  

   {temp2=temp&0x07; time[3]=temp2;}

   if(i==5)          //月  

   {temp2=temp&0x1f; time[1]=temp2;}  

   if(i==6)        //年  

   {temp2=temp; time[0]=temp2;}

   flash_delay(50);  

   addr=addr+1;   //页读须软件累加地址  

}

}   */ 

/*-------------------------------------------------------------------------------- 

函数说明:向8563寄存器指定地址写数据  

addr是寄存器地址,ddata是要送的数值。 

---------------------------------------------------------------------------------*/  

/* void set_8563(uchar addr,uchar ddata)  

{

start_i2c();

write_8bit(0xA2);

ack_i2c();

write_8bit(addr);

ack_i2c();

write_8bit(ddata);

ack_i2c();

stop_i2c();

}   */ 

/**-------------------------------------------------------------------------

函数说明:设置报警闹钟。 

addr:报警寄存器地址,具体数值 

09h 分钟报警32:没小时的第32分钟报----1 

0Ah 小时报警17:每天的17点报警--------2 

0BH 日报警21:每月的21号报警----------3 

0CH 星期报警3:没星期的星期3报警------4 

--------------------------------------------------------------------------------- 

void set_timeAla(uchar num,uchar count)  

{  

uchar temp;  

temp=read_8bit(0x01);   //读出控制寄存器2中原有数据  

temp=temp|0x02;  

write_one(0x01,temp);   

if(num==1) { set_8563(0x09,count);}  

if(num==2) { set_8563(0x0a,count);}  

if(num==3) { set_8563(0x0b,count);}  

if(num==4) { set_8563(0x0c,count);}  

}   */

void SetAlarm(uchar alarmtype,uchar count)

{

SetPCF8563(0x01,0x02);

SetPCF8563(alarmtype,count);

}

 

 

/**-------------------------------------------------------------------------

------- 

函数说明:秒中断设置 

----------------------------------------------------------------------------

-----  

void set_secAla(uchar num)  

{  

    uchar temp;

    temp=read_8bit(0x01);   //读出控制寄存器2中原有数据  

    temp=temp|0x11;  

    write_one(0x01,temp);   

    set_8563(0x0e,0x81);              //脉冲中断模式,不需要清楚TF位   0x81=10000001

   if(num==1){set_8563(0x0f,64); }//       //1秒中断  

   if(num==2){set_8563(0x0f,128); }//       //2秒中断  

   if(num==3){set_8563(0x0f,192); }//       //3秒中断  

   if(num==4){set_8563(0x0f,255); } //     //4秒中断  

}*/

/**-------------------------------------------------------------------------

------- 

函数说明:清除所有报警设置。 

----------------------------------------------------------------------------

-----  

void clr_timeAla(void)  

{

set_8563(0x01,0x00);        //关中断  

set_8563(0x09,0x80);  

set_8563(0x0A,0x80);  

set_8563(0x0B,0x80);  

set_8563(0x0C,0x80);  

// SetPCF8563(0x0D,0x00);  

// SetPCF8563(0x0E,0x03);  

}*/

void CleanAlarm(void)

{

SetPCF8563(0x01,0x00);

SetPCF8563(0x09,0x80);

SetPCF8563(0x0A,0x80);

SetPCF8563(0x0B,0x80);

SetPCF8563(0x0C,0x80);

// SetPCF8563(0x0D,0x00);

// SetPCF8563(0x0E,0x03);

}

/**-------------------------------------------------------------------------

------- 

函数说明:清除报警标志位AF和倒计时标志位TF 

----------------------------------------------------------------------------

-----  

void clr_AF_TF(void)  

{  

uchar temp;  

temp=read_8bit(0x01);   //读出控制寄存器2中原有数据  

temp=temp&0x13;   //0001 0011

write_one(0x01,temp);   

}*/

/****************************************************************************

** 名    称:BCDtoHEX

** 功    能:将10进制改成16进制

** 入口参数:tdat : 一字节的BCD

** 出口参数:HEX  : 一字节的HEX

****************************************************************************/

uint8 BCDtoHEX(uint8 tdat)

{

   return((tdat/16)*10 + tdat%16);

}

/****************************************************************************

* 名称:HEXTtoBCD

* 功能:

* 入口参数:HEX

* 出口参数:BCD

****************************************************************************/

uint8 HEXtoBCD(uint8 tdat)

{

   return ((tdat/10)*16 + tdat%10);

}

/****************************************************************************

* 名称:HEXTtoBCD

* 功能:

* 入口参数:HEX

* 出口参数:BCD

****************************************************************************/

void decode_8563_time(void)

{

disp[0]=(bu[0]&0x0f);  //秒  个位

disp[1]=(bu[0]&0x70)>>4;//秒   十位

disp[2]=(bu[1]&0x0f);//分钟  个位

disp[3]=(bu[1]&0x70)>>4;//分钟  十位

disp[4]=(bu[2]&0x0f);//  小时      个位

disp[5]=(bu[2]&0x30)>>4;// 小时    十位

disp[6]= (bu[3]&0x0f);// 日期     个位

disp[7]= (bu[3]&0x30)>>4;// 日期   十位

disp[8]= (bu[4]&0x07);// 星期

disp[9]= (bu[5]&0x0f);// 月

disp[10]=(bu[5]&0x10)>>4;//  月

disp[11]=(bu[6]&0x0f);// 年

disp[12]=(bu[6]&0xf0)>>4;// 年

}

Outcomes