⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8583.c

📁 PIC单片机C语言程序设计实例精粹
💻 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 + -