#include "main.h"
#include <String.h>
#include <portb.h>

void enable_delay(void);
void init(void);
void writeData(rom char *);
void writeByte(char);
void clear_display(void);
void second_line(void);
void display_shift(void);
char keypad_scan(void);


rom char *pointer;
rom char tomb[] = "hello";
rom char tomb2[] = "siker";
char kp;
char key;

void main (void){
	init();
	
	pointer = &tomb[0];
	writeData(pointer);
	key = keypad_scan();
	if(key=='9'){
		clear_display();
		pointer = &tomb2[0];
		writeData(pointer);
		Delay10KTCYx(200);
	}


}

void writeByte(char data){  // egy karakter irasa az lcd-re
	struct bit *A; 
	A = (struct bit *)&data; 
		TRISD = 0x00;
		
        DATA4 = A->b7;
        DATA5 = A->b6;
        DATA6 = A->b5;
        DATA7 = A->b4;
		enable_delay();	
		
        DATA4 = A->b3;
        DATA5 = A->b2;
        DATA6 = A->b1;
        DATA7 = A->b0;
        
		enable_delay();
		Delay1KTCYx(5);
	return;
}

void writeData(rom char *buffer){ //tomb irasa az lcd-re
	 int szamlalo = 0;

	while(*buffer){	
		if(szamlalo==16)
			second_line();
//		if(szamlalo>32){
//			display_shift();
			
//		}
		RS = 1;
		writeByte(*buffer);
		*buffer++;
		szamlalo++;
	}
	RS = 0;
	return;
}




void enable_delay(void){ //engedelyezo jel kuldese lcd-re
        Delay10TCYx(2);
        Enable = 1;                     
        Delay10TCYx(2);
        Enable = 0;
	return;
}


void init(void){ //lcd init
	TRISD = 0x00;
	TRISE = 0x00;

	Delay1KTCYx(200);


//function set
	PORTE = 0x00;
	PORTD = 0x40;
		enable_delay();
	PORTD = 0x10;
		enable_delay();

//display on/off 
	Delay1KTCYx(5);
	
	PORTE = 0x00;
	PORTD = 0x00;
		enable_delay();
	PORTD = 0xf0;
		enable_delay();

	Delay1KTCYx(5);
//clear display

clear_display();

//entry mod set
	PORTE = 0x00;
	PORTD = 0x00;
		enable_delay();
	PORTD = 0x60;
		enable_delay();
	Delay1KTCYx(5);
	


	return;
}

void clear_display(){ //keprenyo torlese
	PORTE = 0x00;
	PORTD = 0x00;
		enable_delay();
	PORTD = 0x80;
		enable_delay();


	Delay1KTCYx(20);
	return;

}

void second_line(){
	PORTE = 0x00;
	PORTD = 0x30;
	enable_delay();
	PORTD = 0x00;
	enable_delay();
	Delay1KTCYx(5);
	return;
}

char keypad_scan(){
DisablePullups();
TRISB = 0b00011111;
kp = 'N';
while(kp == 'N')
{
LATB =  0b11000000;
if(PORTBbits.RB1 == 0) kp = '1';
if(PORTBbits.RB2 == 0) kp = '3';
if(PORTBbits.RB3 == 0) kp = '7';
if(PORTBbits.RB4 == 0) kp = '*';
LATB =  0b10100000;
if(PORTBbits.RB1 == 0) kp = '2';
if(PORTBbits.RB2 == 0) kp = '5';
if(PORTBbits.RB3 == 0) kp = '8';
if(PORTBbits.RB4 == 0) kp = '0';
LATB =  0b01100000;
if(PORTBbits.RB1 == 0) kp = '3';
if(PORTBbits.RB2 == 0) kp = '6';
if(PORTBbits.RB3 == 0) kp = '9';
if(PORTBbits.RB4 == 0) kp = '#';

} 
return kp;

}