PIC单片机I2C通信程序
#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(6


