/*===========================================================================================
Project : RTC(½Ã°èIC), ¿ÜºÎEEPROM I2C Åë½Å Å×½ºÆ® 
Version : LK-PB-F V01
Date    : 2011-07-28
Author  : Kyung Nam Lee
Company : LKEMBEDDED 
Compiler: MPLAB+Hitech-C
Comment : I2CÅë½ÅÀ» ÀÌ¿ëÇÏ¿© RTC(½Ã°èIC), ¿ÜºÎEEPROM IC¸¦ Á¦¾îÇÏ´Â ÇÁ·Î±×·¥ ¿¹Á¦¼Ò½ºÀÌ¸ç,
		  UARTÅë½Å Æ÷Æ®·Î RTC(½Ã°èIC), ¿ÜºÎEEPROM IC Á¤º¸¸¦ Ãâ·ÂÇÏ°í ÀÖ´Ù. 
===========================================================================================*/

#include <pic18f452.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
//#define	XTAL	16000000		// crystal frequency - 4MHz
#include <htc.h>	// Required to interface with delay routines
#define LED_CLK 0X00
#define FNDDB_CLK 0X01
#define FND_BUZZER_CLK 0X02
#define LCDCON_CLK 0X03
#define LCDDB_CLK 0X04
#define DC_SERVO_MOTOR_Relay_CLK 0X05
#define DOT_LED_A_CLK 0X06
#define DOT_LED_K_CLK 0X07
#define CP_Sig 0X10  //Active Low Cp

/* ÄÚµå Å×½ºÆ® 74hc574 QÇÉÀ¸·Î Ãâ·Â °ªÀÌ ÀúÀåµÇ°í ÀÖÀ½À» ÇÁ·Î±×·¥¸Ó´Â ÀÎÁöÇÏ¿©¾ß ÇÑ´Ù.*/
typedef unsigned char   BYTE;
typedef unsigned int   WORD;
typedef unsigned long   DWORD; 
#define On             1
#define Off            0

BYTE Read_I2C(BYTE ID,BYTE addr)
	{
	BYTE Read_Data=0;
	// Start Condition
	SEN = 1;                              //---------- Initiate bus Start Condition
	while(SEN);                           //---------- Wait Start Condition is Finished      
	
	// EEPROM Address Byte Write
	SSPBUF = ID;                        //---------- Send EEPROM ADDRESS & Write
	while(( SSPCON2 & 0x1F ) | ( RW ));   //-------- Wait I2C Idle
	//while(SSPSTAT&0x04); 
	while(ACKSTAT);                       //------- Wait ACK               
	
	// Address Byte Write
	SSPBUF = addr;                           
	while(( SSPCON2 & 0x1F ) | ( RW ));   //---------- Wait I2C Idle
	//while(SSPSTAT&0x04);
	while(ACKSTAT);                       //---------- Wait ACK               
	
	
	// ReStart Condition
	RSEN = 1;                            //---------- Send Repeated Start
	while(RSEN);                         //---------- Wait ReStart Condition is Finished      
	
	// EEPROM Address Byte Write
	SSPBUF = ID|1;                       //---------- Send EEPROM ADDRESS & Read
	while(( SSPCON2 & 0x1F ) | ( RW ));  //---------- Wait I2C Idle
	//while(SSPSTAT&0x04); 
	while(ACKSTAT);                      //---------- Wait ACK               
	
	// Data Read Byte 
	RCEN = 1;                            //---------- Enable Receive Mode
	while(RCEN);                         //---------- Wait Receiving is Idle            
	
	Read_Data = SSPBUF;                  //---------- retrieve config reg or temp reg
	
	// Stop Condition
	PEN = 1;                             //---------- Enable Stop Condition
	while(PEN);                          //---------- Wait Stop Condition is Finished      
	
	return(Read_Data);
}
void Write_I2C(BYTE ID,BYTE addr,BYTE data)
{
	// Start Condition
	SEN = 1;                             //---------- Initiate bus Start Condition
	while(SEN);                          //---------- Wait Start Condition is Finished      
	
	// EEPROM Address Byte Write
	SSPBUF = ID;                       //---------- Send EEPROM ADDRESS & Write
	while(( SSPCON2 & 0x1F ) | ( RW ));  //---------- Wait I2C Idle
	//	while(SSPSTAT&0x04);
	while(ACKSTAT);                      //---------- Wait ACK               
	
	// Low Address Byte Write
	SSPBUF = addr;                           
	while(( SSPCON2 & 0x1F ) | ( RW ));  //---------- Wait I2C Idle
	//while(SSPSTAT&0x04);
	while(ACKSTAT);                      //---------- Wait ACK               
	
	// Data Byte Write
	SSPBUF = data;                           
	while(( SSPCON2 & 0x1F ) | ( RW ));  //---------- Wait I2C Idle
	//while(SSPSTAT&0x04);  //---------- Wait I2C Idle
	while(ACKSTAT);                      //---------- Wait ACK               
	
	// Stop Condition
	PEN = 1;                             //---------- Enable Stop Condition
	while(PEN);                          //---------- Wait Stop Condition is Finished      
}
void TxOut(unsigned char data)
{
	while((TXSTA&0X02==0));                                                                                                                                        	while((TXSTA&0X02==0)); //¼Û½Å ¹öÆÛ »óÅÂ Ã¼Å© 
	TXREG=data;
}
void putch(unsigned char byte) 
{
	/* output one byte */
	while(!TRMT)	/* set whilst TX in progress */
		continue;
	TXREG = byte;
}
void IN1307_EEPROM_Test()
{
	static unsigned char data,data1,data2=0;
	static unsigned char h,m,s=0;
	static unsigned eeprom_data=0;
	data=Read_I2C(0Xd0,0);
	data1=(data&0x0f);  // 1ÀÇ ÀÚ¸® ÃÊ 
	data2=(data&0x70);  // 10ÀÇ ÀÚ¸® ÃÊ 
	data2=(data2>>4)*10; //ÃÊ 
	s=(data2+data1);
     
	data=Read_I2C(0Xd0,1);
	data1=(data&0x0f);  // 1ÀÇ ÀÚ¸® ÃÊ 
	data2=(data&0x70);  // 10ÀÇ ÀÚ¸® ÃÊ 
	data2=(data2>>4)*10;
	m=(data2+data1);    //ºÐ 
	
	data=Read_I2C(0Xd0,2);
	data1=(data&0x0f);  // 1ÀÇ ÀÚ¸® ÃÊ 
	data2=(data&0x30);  // 10ÀÇ ÀÚ¸® ÃÊ 
	data2=(data2>>4)*10;
	h=(data2+data1);  //½Ã°£
    printf("RTC(hour:%d minute:%d second:%d) \r\n",h,m,s);  
     
}
void SysInit()
{
	//-- ÀÔÃâ·Â ·¹Áö½ºÅÍ ¼³Á¤ ÃÊ±âÈ­------------------
	TRISA = 0X0f;
	TRISB = 0X01;
	PORTB = 0X00;
	TRISC = 0x80;
	PORTC = 0X00;
	TRISD = 0X00;
	PORTD = 0X00;
	TRISE = 0X00;
	PORTE = 0X00;
	
	TRISC3 = 1;                           //---------- Set SCL (PORTC,3) pin to input
	TRISC4 = 1;                           //---------- Set SDA (PORTC,4) pin to input
	SSPSTAT = 0B00000000;                 //---------- Slew Rate Control bit(400Khz)WER
	SSPCON1 = 0B00101000;                 //---------- SSPEN Enable SSPM = I2C Master Mode
	SSPCON2 = 0B00000000;
	SSPADD =    9;   


	Write_I2C(0Xd0,0x00,0x00);   //---------- RTC SECONDS
	Write_I2C(0Xd0,0x01,0x03);   //---------- RTC MINUTES
	Write_I2C(0Xd0,0x02,0x06);   //---------- RTC HOURS
	Write_I2C(0Xd0,0x07,0x13);   //---------- RTC CONTROL RAM INITIALIZE

	//---Åë½Å ·¹Áö½ºÅÍ ÃÊ±âÈ­---------------------------
	TXSTA = 0B00100000;  //--TXEN=1
	RCSTA = 0B10010000;  //--SPE=1
	SPBRG = 25;           //--16Mhz = 9600Bps
}
void main()
{
	SysInit(); //--- ½Ã½ºÅÛ ¼³Á¤ ÃÊ±âÈ­ ÇÔ¼ö 
	while(1)
	while(1)   //---Endless Loop
	{
		IN1307_EEPROM_Test();
	}
}