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;// 年
}