#if 0
/*===========================================================================================
Project : LED ON/OFF Test
Version : LK-PB-F V01
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED 
Compiler: MPLAB+Hitech-C
Comment : 8개의 스위치를 누를 시에 LED 및 릴레이,부저가 ON/OFF 되는 프로그램이다. 
===========================================================================================*/
#include <pic16f877a.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
#define	XTAL	16000000		// crystal frequency - 4MHz
#include <htc.h>	// Required to interface with delay routines

/* 코드 테스트 74hc574 Q핀으로 출력 값이 저장되고 있음을 프로그램머는 인지하여야 한다.*/
static unsigned char SwKey=0;
void SysInit()
{
	//-- 입출력 레지스터 설정 초기화------------------
	TRISA=0X00;
	TRISB=0X00;
	TRISC=0x00;
	TRISD=0X00;
	TRISE=0X00;


}
void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수 
	while(1)   //---Endless Loop
	{
		PORTA=0Xff;
		PORTB=0Xff;
		PORTC=0Xff;
		PORTD=0Xff;
		PORTE=0Xff;
	__delay_ms(50);
	PORTA=0X00;
		PORTB=0X00;
		PORTC=0X00;
		PORTD=0X00;
		PORTE=0X00;
	__delay_ms(50);
	}
}
#endif 
#if 0
/*===========================================================================================
Project : S/W Test
Version : LK-PB-F V01
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED 
Compiler: MPLAB+Hitech-C
Comment : 8개의 스위치를 누를 시에 LED 및 릴레이,부저가 ON/OFF 되는 프로그램이다. 
===========================================================================================*/
#include <pic16f877a.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
#define	XTAL	16000000		// crystal frequency - 4MHz
#include <htc.h>	// Required to interface with delay routines

/* 코드 테스트 74hc574 Q핀으로 출력 값이 저장되고 있음을 프로그램머는 인지하여야 한다.*/
static unsigned char SwKey=0;

void SwInput()
{
	TRISD=0Xff;
	RC5=0;
	SwKey=PORTD;
	RC5=1;
	TRISD=0X00;
}
void interrupt HIGH_ISR(void) //100us 타이머 카운터 인터럽트 
{	
	INTCON&=~0X04; //타이머 오버플로우 인터럽트 플래그 clear
	SwInput();
	TMR0+=0X83; //1ms
}
void SwTest()
{
	switch(SwKey)
	{
	case 0xfe:
	PORTD=0X01;
	PORTC|=LED_CLK;
	PORTC&=~LATCH;
	PORTD=0Xff;
	PORTC|=FND_RELAY_BUZZER_CLK;
	PORTC&=~LATCH;
	break;
	case 0xfd:
	PORTD=0X02;
	PORTC|=LED_CLK;
	PORTC&=~LATCH;
	PORTD=0X00;
	PORTC|=FND_RELAY_BUZZER_CLK;
	PORTC&=~LATCH;
	break;
	case 0xfb:PORTD=0X04;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	case 0xf7:PORTD=0X08;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	case 0xef:PORTD=0X10;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	case 0xdf:PORTD=0X20;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	case 0xbf:PORTD=0X40;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	case 0x7f:PORTD=0X80;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	default: PORTD=0X00;PORTC|=LED_CLK;PORTC&=~LATCH;break;
	}
}
void SysInit()
{
	//-- 입출력 레지스터 설정 초기화------------------
	TRISA=0X00;
	TRISB=0X00;
	TRISC=0x00;
	TRISD=0X00;
	TRISE=0X00;
}
void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수 
	while(1)   //---Endless Loop
	{
     	SwTest();
	}
}
#endif 

#if 0
/*===========================================================================================
Project : UART Test
Version : LK-PIC16F18F DEV & TRAINING
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED
Compiler: MPLAB+Hitech-C
Comment : UART포트에서 PC쪽으로 "RS232 to USB Serial Data Output Test" 문자를 출력하고 있는 프로그램이다.
===========================================================================================*/
#include <pic16f877a.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
#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핀으로 출력 값이 저장되고 있음을 프로그램머는 인지하여야 한다.*/
void flilflop_Enable(unsigned char Add, unsigned char OuputData)
{
	PORTD = OuputData;PORTB |= CP_Sig; //74hc574 cp sig HIGH
	PORTC = Add; //74hc574 cp sig HIGH and 74HC138 E3 HIGH
	PORTB &= ~CP_Sig; //74hc574 cp sig LOW
	PORTB |= CP_Sig; //74hc574 cp sig HIGH
}
void interrupt HIGH_ISR(void) //100us 타이머 카운터 인터럽트
{
	INTCON &= ~0X04; //타이머 오버플로우 인터럽트 플래그 clear
	if (RCIF)
	{
		while ((TXSTA&0X02 == 0))
		; //송신 버퍼 상태 체크
		TXREG = RCREG;
		RCIF = 0;
	}
	TMR0 += 0X83; //1ms
}
void TxOut(unsigned char data)
{
	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 SysInit()
{
	//-- 입출력 레지스터 설정 초기화------------------
	TRISA = 0X0f;
	TRISB = 0X01;
	PORTB = 0X00;
	TRISC = 0x80;
	PORTC = 0X00;
	TRISD = 0X00;
	PORTD = 0X00;
	TRISE = 0X00;
	PORTE = 0X00;

	//-- 타이머/ 카운터 인터럽트 레지스터 설정 초기화------------
	OPTION_REG = 0b01000100;  //--  T0PS2:T0PS0=100 32분주비 타이머/인터럽트 카운터는 클럭 카운팅시 16Mhz/4= 4Mhz로 구동한다.
	INTCON = 0b10100100; 		//--- GIE=1, TMR0IE=1; 	//-- 외부인터럽트 레지스터 설정 초기화-----------------------
	TMR0 = 0X83; 				//--- 1ms 타이머/카운터 인터럽트 생성

	//---통신 레지스터 초기화---------------------------
	TXSTA = 0B00100000;  //--TXEN=1
	RCSTA = 0B10010000;  //--SPE=1
	SPBRG = 25;           //--16Mhz = 9600Bps
	PIE1 = 0B00100000;   //--RCIE=1
	INTCON = 0B11100100; //--GIE=1, PEIE=1
	//-----------------------------------------------------------

}
//----------------------------------------------------

void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수
	while (1)  //--- Endless Loop
	{
		//printf("RS232 to USB Serial Data Output Test \r\n");

	}
}
#endif 
#if 0
/*===========================================================================================
Project : FND(7-Segment) 카운팅 test
Version : LK-PB-F V01
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED
Compiler: MPLAB+Hitech-C
Comment : FND에 숫자가 0.1초 간격으로 상승하는 프로그램이다.
===========================================================================================*/
#include <pic16f877a.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
#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핀으로 출력 값이 저장되고 있음을 프로그램머는 인지하여야 한다.*/
//------------4 FND ------------------------------------
volatile char Num[11] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X27, 0X7F, 0X6F};  //0~9 배열선언  FND
volatile static unsigned int FndCnt; //FND 카운팅 숫자
volatile static unsigned int CntDelay = 0;; //FND 카운팅 숫자
//------------------------------------------------------
void flilflop_Enable(unsigned char Add, unsigned char OuputData)
{
	PORTD = OuputData;PORTB |= CP_Sig; //74hc574 cp sig HIGH
	PORTB |= CP_Sig; //74hc574 cp sig HIGH
	PORTC = Add; //74hc574 cp sig HIGH and 74HC138 E3 HIGH
	PORTB &= ~CP_Sig; //74hc574 cp sig LOW
	PORTB |= CP_Sig; //74hc574 cp sig HIGH
}
void FndTimer()
{
	volatile static int cnt2 = 0;
	cnt2++;
	if (cnt2 == 100) //0.1Sec ?
	{
		cnt2 = 0;
		FndCnt++;
		if (FndCnt == 9999)
		{
			FndCnt = 0;
		}
	}
}
void FndTest()
{
	volatile static int j, k, l, m = 0;
	j = (FndCnt % 10000) / 1000; //-------1000의자리
	k = (FndCnt % 1000) / 100;  //-------100의자리
	l = (FndCnt % 100) / 10;    //-------10의자리
	m = (FndCnt % 10);        //-------1의자리
	if (CntDelay == 1)
	{
		flilflop_Enable(FND_BUZZER_CLK, 0X02);
		flilflop_Enable(FNDDB_CLK, Num[j]);

	}
	if (CntDelay == 2)
	{
		flilflop_Enable(FND_BUZZER_CLK, 0X04);
		flilflop_Enable(FNDDB_CLK, Num[k]);

	}
	if (CntDelay == 3)
	{

		flilflop_Enable(FND_BUZZER_CLK, 0X08);
		flilflop_Enable(FNDDB_CLK, Num[l]);

	}
	if (CntDelay == 4)
	{
		flilflop_Enable(FND_BUZZER_CLK, 0X10);
		flilflop_Enable(FNDDB_CLK, Num[m]);
		CntDelay = 0;
	}
}

void interrupt HIGH_ISR(void) //100us 타이머 카운터 인터럽트
{
	INTCON &= ~0X04; //타이머 오버플로우 인터럽트 플래그 clear
	CntDelay++;
	FndTimer();
	TMR0 += 0X83; //1ms
}
void SysInit()
{
	//-- 입출력 레지스터 설정 초기화------------------
	TRISA = 0X0f;
	TRISB = 0X01;
	PORTB = 0X00;
	TRISC = 0x80;
	PORTC = 0X00;
	TRISD = 0X00;
	PORTD = 0X00;
	TRISE = 0X00;
	PORTE = 0X00;
	//-- 타이머/ 카운터 인터럽트 레지스터 설정 초기화------------
	OPTION_REG = 0b01000100;  //--  T0PS2:T0PS0=100 32분주비 타이머/인터럽트 카운터는 클럭 카운팅시 16Mhz/4= 4Mhz로 구동한다.
	INTCON = 0b10100100; 		//--- GIE=1, TMR0IE=1; 	//-- 외부인터럽트 레지스터 설정 초기화-----------------------
	TMR0 = 0X83; 				//--- 1ms 타이머/카운터 인터럽트 생성
			flilflop_Enable(LED_CLK, 0);
}
void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수
	while (1)   //---Endless Loop
	{
		FndTest();
	}
}
#endif
///////////////////////////////////////////////////////////////////////////////////////
/////////////////////프로젝트 코드 구분 라인 /////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
#if 0
/*===========================================================================================
Project : FND(7-Segment) 카운팅 test
Version : LK-PB-F V01
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED
Compiler: MPLAB+Hitech-C
Comment : FND에 숫자가 0.1초 간격으로 상승하는 프로그램이다.
===========================================================================================*/
#include <pic16f877a.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
#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핀으로 출력 값이 저장되고 있음을 프로그램머는 인지하여야 한다.*/
//------------4 FND ------------------------------------
volatile char Num[11] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X27, 0X7F, 0X6F};  //0~9 배열선언  FND
volatile static unsigned int FndCnt; //FND 카운팅 숫자
volatile static unsigned int CntDelay = 0;; //FND 카운팅 숫자
//------------------------------------------------------
void flilflop_Enable(unsigned char OuputData)
{
	/*
	PORTD = OuputData;PORTB |= CP_Sig; //74hc574 cp sig HIGH
	PORTB |= CP_Sig; //74hc574 cp sig HIGH
	PORTC = Add; //74hc574 cp sig HIGH and 74HC138 E3 HIGH
	PORTB &= ~CP_Sig; //74hc574 cp sig LOW
	PORTB |= CP_Sig; //74hc574 cp sig HIGH
	*/
	PORTB = OuputData;
}
void FndTimer()
{
	volatile static int cnt2 = 0;
	cnt2++;
	if (cnt2 == 500) //0.1Sec ?
	{
		cnt2 = 0;
		FndCnt++;
		if (FndCnt == 9)
		{
			FndCnt = 0;
		}
	}
}
void FndTest()
{
	/*
	volatile static int j, k, l, m = 0;
	j = (FndCnt % 10000) / 1000; //-------1000의자리
	k = (FndCnt % 1000) / 100;  //-------100의자리
	l = (FndCnt % 100) / 10;    //-------10의자리
	m = (FndCnt % 10);        //-------1의자리
	if (CntDelay == 1)
	{
		flilflop_Enable(FND_BUZZER_CLK, 0X02);
		flilflop_Enable(FNDDB_CLK, Num[j]);

	}
	if (CntDelay == 2)
	{
		flilflop_Enable(FND_BUZZER_CLK, 0X04);
		flilflop_Enable(FNDDB_CLK, Num[k]);

	}
	if (CntDelay == 3)
	{

		flilflop_Enable(FND_BUZZER_CLK, 0X08);
		flilflop_Enable(FNDDB_CLK, Num[l]);

	}
	if (CntDelay == 4)
	{
		flilflop_Enable(FND_BUZZER_CLK, 0X10);
		flilflop_Enable(FNDDB_CLK, Num[m]);
		CntDelay = 0;
	}
	*/
	volatile static int j, k, l, m = 0;
	m = (FndCnt % 10);        //-------1의자리
	flilflop_Enable(Num[m]<<1);
}

void interrupt HIGH_ISR(void) //100us 타이머 카운터 인터럽트
{
	INTCON &= ~0X04; //타이머 오버플로우 인터럽트 플래그 clear
	CntDelay++;
	FndTimer();
	TMR0 += 0X83; //1ms
}
void SysInit()
{
	//-- 입출력 레지스터 설정 초기화------------------
	TRISA = 0X0f;
	TRISB = 0X01;
	PORTB = 0X00;
	TRISC = 0x80;
	PORTC = 0X00;
	TRISD = 0X00;
	PORTD = 0X00;
	TRISE = 0X00;
	PORTE = 0X00;
	//-- 타이머/ 카운터 인터럽트 레지스터 설정 초기화------------
	OPTION_REG = 0b01000100;  //--  T0PS2:T0PS0=100 32분주비 타이머/인터럽트 카운터는 클럭 카운팅시 16Mhz/4= 4Mhz로 구동한다.
	INTCON = 0b10100100; 		//--- GIE=1, TMR0IE=1; 	//-- 외부인터럽트 레지스터 설정 초기화-----------------------
	TMR0 = 0X83; 				//--- 1ms 타이머/카운터 인터럽트 생성

}
void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수
	while (1)   //---Endless Loop
	{
		FndTest();
	}
}
#endif
///////////////////////////////////////////////////////////////////////////////////////
/////////////////////프로젝트 코드 구분 라인 /////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#if 0
/*===========================================================================================
Project : RTC(시계IC), 외부EEPROM I2C 통신 테스트
Version : LK-PB-F V01
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED
Compiler: MPLAB+Hitech-C
Comment : I2C통신을 이용하여 RTC(시계IC)를 제어하는 프로그램 예제소스이며,
UART통신 포트로 RTC(시계IC) 정보를 출력하고 있다.
===========================================================================================*/
#include <pic16f877a.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
void flilflop_Enable(unsigned char Add, unsigned char OuputData)
{
	PORTD = OuputData;PORTB |= CP_Sig; //74hc574 cp sig HIGH
	PORTC = Add; //74hc574 cp sig HIGH and 74HC138 E3 HIGH
	PORTB &= ~CP_Sig; //74hc574 cp sig LOW
	PORTB |= CP_Sig; //74hc574 cp sig HIGH
}
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));
	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;
	//---통신 레지스터 초기화---------------------------
	TXSTA = 0B00100000;  //--TXEN=1
	RCSTA = 0B10010000;  //--SPE=1
	SPBRG = 25;           //--16Mhz = 9600Bps
	//-----------------------------------------------------------
	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
	SSPCON = 0B00101000;                 //---------- SSPEN Enable SSPM = I2C Master Mode
	SSPCON2 = 0B00000000;
	SSPADD = 9;                        //---------- Master Clock = Fosc/(4*(SSPADD+1)); 400Khz 통신
	//--ADC 레지스터 설정----------------------------------------
	ADCON0 = 0B00000101; //-- ADCS1=0,ADCON0=0(2분주비), ADON=1;
	ADCON1 = 0B10000000; //-- ADFM=1
	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

}
void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수
	while (1)   //---Endless Loop
	{
		IN1307_EEPROM_Test();
	}
}
#endif
#if 0
/*===========================================================================
================
Project : 가변저항, 조도센서, 온도센서, 적외선수광센서 AD컨버터 Test
Version : LK-PB-F V01
Date    : 2020-08-31
Author  : Kyung Nam Lee
Company : LKEMBEDDED
Compiler: MPLAB+Hitech-C
Comment : 가변저항, 조도센서를 AD컨버팅(날로그의 전압을 디지털값으로 변환)하여
, 이때
변환된 데이터를 UART포트에 출력하는 프로그램이다.
=============================================================================
==============*/
#include <pic16f877a.h>
#include <stdio.h>
#define _XTAL_FREQ 16000000
//#define	XTAL	16000000		// crystal frequency - 4MHz
#include <htc.h>	// Required to interface with delay routines
unsigned int ad_buff[2];

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 SysInit()
{
	//-- 입출력 레지스터 설정 초기화------------------
	TRISA = 0X03;
	TRISB = 0X01;
	PORTB = 0X00;
	TRISC = 0x80;
	PORTC = 0X00;
	TRISD = 0X00;
	PORTD = 0X00;
	TRISE = 0X00;
	PORTE = 0X00;

	//---통신 레지스터 초기화---------------------------
	TXSTA = 0B00100000;  //--TXEN=1
	RCSTA = 0B10010000;  //--SPE=1
	SPBRG = 25;           //--16Mhz = 9600Bps
	PIE1 = 0B00100000;   //--RCIE=1
	INTCON = 0B11100100; //--GIE=1, PEIE=1

	//--ADC 레지스터 설정----------------------------------------
	ADCON0 = 0B00000101; //-- ADCS1=0,ADCON0=0(2분주비), ADON=1;
	ADCON1 = 0B10000000; //-- ADFM=1

}
unsigned int ADC_Test(unsigned char adc_input)
{

	unsigned int data = 0;
	unsigned int data, data2 = 0;
	//---------------------------아날로그 입력 설정
	PCFG0 = 0;
	PCFG1 = 0;
	PCFG2 = 0;
	PCFG3 = 0;
	//-------------------------------adc입력핀 설정
	ADCON0 = (adc_input << 3 & 0x38);
	//-----------------------------------클럭 설정
	ADON = 1;
	//-----------------------------------ADC ON
	ADCS0 = 0;
	ADCS1 = 0;
	__delay_us(10);
	GO_DONE = 1;
	while (!GO_DONE)
	; //---------ADC가 완료 될때까지 대기
	data = ADRESH;           //--HIGH ADC Data Register
	data = (data << 8);
	data |= ADRESL;          //--LOW ADC Data Register
	ADIF = 0;   //---반드시 클리어 해야 다음 컨버젼 시작
	return data;

}
void main()
{
	SysInit(); //--- 시스템 설정 초기화 함수
	while (1)   //Endless Loop
	{
		printf("VR10k:%d \r\n",ADC_Test(0));
	}
}
#endif