#include <p18f6585.h>
#include <math.h>
#include <usart.h>
#include "main.h"
#include "config.h"
#include "delays2.h"
#include "lcd.h"
#include "keyboard.h"
#include "timers.h"

void kbd(void);
void usart(void);
/*void hi_prioriint(void)
{
	_asm
	GOTO usart
	_endasm
}*/

void init() {
	OpenUSART(	USART_TX_INT_OFF &
				USART_RX_INT_OFF &
				USART_ASYNCH_MODE &
				USART_EIGHT_BIT &
				USART_CONT_RX &
				USART_BRGH_HIGH,
				25);
	init_usart();
	init_keyboard();	// функция за инициализация на клавиатурата
	//init_lcd();			// функция за инициализация на дисплея
	lcdInit();
	init_timer();		// функция за инициализация на Timer 0 и прекъсванията
}

//#pragma interrupt usart
void usart()
{	
	int flag = 0;
	int count=0;
	int result;
	while(flag!=1)
	{	
		while(count!=16)
		{
		while(BusyUSART());
		while(!DataRdyUSART());
		result = ReadUSART();
		lcdSendData(result);
	if(result == 42) 
		{	
			flag = 1;
			break;
		}
		count++;
		}
	count = 0;
	lcdSetSecondLine();
	while(count!=16)
		{
		while(BusyUSART());
		while(!DataRdyUSART());
		result = ReadUSART();
		lcdSendData(result);
	if(result == 42) 
		{	
			flag = 1;
			break;
		}
		count++;
		}
	count = 0;
	lcdClear();
	lcdSetFirstLine();
	}
}

void sendreceive()
{
	int i;
	char receive[10];
	char msg[] = "PIC2!";

	while(BusyUSART());
	while(!DataRdyUSART());
	getsUSART(receive,5);
	lcdWriteText("RX: ");
	for(i=0;i<=4;i++)
	{
		lcdSendData(receive[i]);
	}

	while(BusyUSART());
	putsUSART(msg);
	lcdSetSecondLine();
	lcdWriteText("TX: ");
	for(i=0;i<=4;i++)
	{
		lcdSendData(msg[i]);
	}
}

void main(void)
{
	int i,result;
	char receive[10];
	char msg[] = "PIC2!";
	unsigned char keyboard_button;
	init();
	
	lcdClear();
	lcdWriteText("LCD Loaded...");
	lcdSetSecondLine();
	lcdWriteText("Hello!");
	delay_1s;delay_1s;
	lcdClear();
	lcdSetFirstLine();

	//INTCONbits.PEIE=1;
	//INTCONbits.GIEH=1;

	//PORTGbits.RG3 = 0; //za infrared
	//PORTGbits.RG1 = 1; // za infrared
	//sendreceive();
	
	//TXSTAbits.TXEN = 0;
	//RCSTAbits.CREN = 1;
	
	usart();
	kbd();
	
while(1); 

} // void main(void);

//#pragma interrupt kbd
void kbd(void)
{
		int flag = 0;
		unsigned char keyboard_button;
	while(flag!=1){
		keyboard_button=check_button();		//проверка за натиснат бутон
		switch (keyboard_button) {
			case 48: // button 0
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				while(BusyUSART());
				WriteUSART(keyboard_button);
				break;	
			case 49: // button 1
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;	
			case 50: // button 2
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;
			case 51: // button 3
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;
			case 52: // button 4
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;	
			case 53: // button 5
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;	
			case 54: // button 6
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;
			case 55: // button 7
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;	
			case 56: // button 8
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;	
			case 57: // button 9
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				WriteUSART(keyboard_button);
				break;
			case 35: // button #
				lcdClear();
				break;
			case 42: // button *
				lcdSendData(keyboard_button);
				delay_100ms;delay_100ms;
				flag = 1;
				break;
			}
	}
}