📄 pcf8583.c
字号:
#include "pic.h"
#include "pic1687x.h"
//#include "usart.h"
void INII2C(void);
void DELAY(int time);
void DELAY1(int time);
//void READTIME(unsigned char time1[3]);
//void DISPLAY(unsigned char time2[6]);
//void SPIINIT();
//void initial();
void INIPCF8583();
READTIMESTART();
READTIMEEND();
void USART(int a);
void INITIAL(void);
void CHECKSSPIF();
void CHECKACKSTAT();
void SPILED(unsigned char byte);
static volatile unsigned char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //*绝对寻址位操作指令*/
static bit PORTA_4 @ PORTAIT(PORTA,4);
static bit BF @ PORTAIT(SSPSTAT,0);
static bit TXSTA_5 @ PORTAIT(TXSTA,5); //*定义PORTB 0位*//
main()
{
unsigned char time[6];
int x;
//init_usart();
INITIAL();
TRISD=0X00;
INII2C();
//INIPCF8583();//???????????????????????????
TRISD=0X00;
while(1)
{
PORTD=0Xf0;
DELAY1(10);
PORTD=0Xff;
DELAY1(10);
READTIMESTART();
SEN=1;
CHECKSSPIF();
SSPBUF=0xA2;
CHECKSSPIF();
SSPIF=0;
CHECKACKSTAT();
ACKSTAT=1;
SSPBUF=2;//发送读地址
CHECKSSPIF();
SSPIF=0;
CHECKACKSTAT();
RSEN=1;//产生重启动信号
for(x=0;x<100;x++){;}
CHECKSSPIF();
SSPBUF=0XA3;
CHECKSSPIF();
CHECKACKSTAT();
//PORTD=0xf0;for(z=0;z<1000;z++) for(y=0;y<30;y++);
RCEN=1; //开启接收
DELAY1(1);
time[0]=SSPBUF;
SSPIF=0;
ACKDT=0;
ACKEN=1; //发送应答信号
while(ACKEN==1)
{
}
RCEN=1;
DELAY1(1);
time[1]=SSPBUF;
SSPIF=0;
ACKDT=0;
ACKEN=1; //发送应答信号
while(ACKEN==1)
{
}
RCEN=1;
DELAY1(1);
time[2]=SSPBUF;
SSPIF=0;
ACKDT=0;
ACKEN=1; //发送应答信号
while(ACKEN==1)
{
}
RCEN=1;
DELAY1(1);
time[3]=SSPBUF;
SSPIF=0;
ACKDT=0;
ACKEN=1; //发送应答信号
while(ACKEN==1)
{
}
RCEN=1;
DELAY1(1);
time[4]=SSPBUF;
SSPIF=0;
ACKDT=1;
ACKEN=1; //发送应答信号
while(ACKEN==1)
{
}
READTIMEEND();
//PORTD=0xf0;DELAY1(60);
//PORTD=(time[2]&0x30)^0xff;DELAY1(100);
//PORTD=0xf8;DELAY1(60);
//PORTD=((time[2]&0x0f)<<4)^0xff;DELAY1(100);
USART(0x4e);
USART(0x6f);
USART(0x77);
USART(0x20);
USART(0x54);
USART(0x69);
USART(0x6d);
USART(0x65);
USART(0x20);
USART(0x69);
USART(0x73);
USART(0x20);
USART(0x30);
USART(((time[3]&0xc0)>>4)+0x37);//year
USART(0x2e);
USART(((time[4]&0x10)>>4)+0x30);//month
USART((time[4]&0x0f)+0x30);
USART(0x2e);
USART(((time[3]&0x30)>>4)+0x30);//day
USART((time[3]&0x0f)+0x30);
USART(0x20);
USART(0x20);
USART(((time[2]&0x30)>>4)+0x30);//hour
USART((time[2]&0x0f)+0x30);
//PORTD=0xfc;DELAY1(60);
//PORTD=(time[1]&0xf0)^0xff;DELAY1(100);
//PORTD=0xfe;DELAY1(60);
//PORTD=((time[1]&0x0f)<<4)^0xff;DELAY1(100);
USART(0x3a);
USART(((time[1]&0xf0)>>4)+0x30);//minute
USART((time[1]&0x0f)+0x30);
//PORTD=0xfa;DELAY1(60);
//PORTD=(time[0]&0xf0)^0xff;DELAY1(100);
//PORTD=0xf5;DELAY1(60);
//PORTD=((time[0]&0x0f)<<4)^0xff;DELAY1(100);
USART(0x3a);
USART(((time[0]&0xf0)>>4)+0x30);//second
USART((time[0]&0x0f)+0x30);
USART(0x20);
USART(0x20);
USART(0x20);
DELAY1(100);
}
}
void INII2C(void)
{ TRISC3=1;//设置SCL为输入
TRISC4=1;//设置SDA为输入
SSPCON=0X28;//00101000 I2C 主模式CLOCK=FOSC/(4*(SSPADD+1))
SSPCON2=0x00;
SSPSTAT=0X80;//关闭转换率控制,以适应标准速度 遵循I2C总线标准 不在进行数据发送
//不需要用户更新SSPADD地址
SSPADD=0X02;//设定I2C波特率
GIE=0;
SSPEN=1;//ssp模块使能
}
void INIPCF8583()
{
int x;
SSPIF=0;
SEN=1; //产生起始信号
for(x=0;x<100;x++);
CHECKSSPIF();
SSPBUF=0XA2; //发送写地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //器件字节地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0x80; //初始化控制状态寄存器
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器01
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器02
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器03
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X16; //初始化时间状态寄存器04
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X21; //初始化时间状态寄存器05
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0XB2; //初始化时间状态寄存器06
CHECKSSPIF();
CHECKACKSTAT();
RSEN=1; //产生起始信号
for(x=0;x<100;x++);
CHECKSSPIF();
SSPBUF=0XA2; //发送写地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //器件字节地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0x00; //初始化控制状态寄存器
CHECKSSPIF();
CHECKACKSTAT();
PEN=1;
CHECKSSPIF();
}
void DELAY1(int time)
{
int x,y;
for(x=0;x<1000;x++)
{
for(y=0;y<time;y++);
}
}
void DELAY(int time)
{
int x,y;
for(x=0;x<1000;x++)
{
for(y=0;y<time;y++);
}
}
void CHECKSSPIF()//检测sspbuf发送是否完成
{
while(SSPIF==0)//检测启动信号发送数据是否完成
{;
}
SSPIF=0;
}
void CHECKACKSTAT()//检测应答信号
{
while(ACKSTAT==1)//检测应答信号
{
}
ACKSTAT=1;
}
READTIMESTART()
{ int x;
SEN=1; //产生起始信号
for(x=0;x<100;x++);
CHECKSSPIF();
SSPBUF=0XA2; //发送写地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //器件字节地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0x40; //初始化控制状态寄存器
CHECKSSPIF();
CHECKACKSTAT();
PEN=1;
CHECKSSPIF();
}
READTIMEEND()
{ int x;
RSEN=1; //产生起始信号
for(x=0;x<100;x++);
CHECKSSPIF();
SSPBUF=0XA2; //发送写地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //器件字节地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0x00; //初始化控制状态寄存器
CHECKSSPIF();
CHECKACKSTAT();
PEN=1;
CHECKSSPIF();
}
void USART(int a)
{ TXSTA_5=0X01;
while(!TXIF)
continue;
TXREG=a;
}
void INITIAL(void)
{ SPBRG=23;//波特率9600//
TRISC=0XFF;//设置端口c//
TXSTA=0XA6;//10100110//
RCSTA=0XB0;//10110000//
PIR1=0X00;//第一外设中断标志寄存器//
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -