#include "S1D13700.h"

/*
 * --------------------------------------------------
 * Warteschleifenfunktion
 * Eingabe: Anzahl an Millisikunden
 * Ausgabe: keine
 * --------------------------------------------------
 */
void wait_ms(unsigned int time){

	unsigned int i;

	do{
		for(i=0; i<40000; i++);		// Warte 1ms
		time--;
	}while(time);

}

/*
 * --------------------------------------------------
 * Command senden
 * Eingabe: Hexwert (8bit)
 * Ausgabe: keine
 * --------------------------------------------------
 */
void lcd_send_cmd(unsigned char cmd){
	unsigned short int buffer;

	_CS = 0;	// Chip select
	wait_us(1);
	A0  = 1;	// COMMAND
	wait_us(1);


	 // wait_us(1);		// Drossel^^

	buffer = DBUS_W;
	buffer = buffer & 0xff00;
	buffer = buffer | cmd;
	DBUS_W=buffer;


	_WR = 0;	// Schreiben auf 0
	_RD = 1;	// nicht lesen

	DDR=DDROUT;

//	while(!bFM3_GPIO_PDOR4_PE);
	//DBUS_W=DBUS_W & 0xff00;
	//DBUS_W=DBUS_W | cmd;
	//DBUS_W=cmd;	//	SYSTEM SET
	  wait_us(1);
	_WR=1;				// Steigende Taktflanke zum schreiben
	  wait_us(1);
	_CS = 1;	// Chip select

}


/*
 * --------------------------------------------------
 * Parameter senden
 * Eingabe: Hexwert (8bit)
 * Ausgabe: keine
 * --------------------------------------------------
 */
void lcd_send_parameter(unsigned char par){
	unsigned short int buffer;
	_CS = 0;	// Chip select
	wait_us(1);
	A0  = 0;	// Parameter
	wait_us(1);

	//wait_us(1);
	buffer = DBUS_W;
	buffer = buffer & 0xff00;
	buffer = buffer | par;
	DBUS_W=buffer;



	_WR = 0;	// Schreiben auf 0
	_RD = 1;	// nicht lesen
	DDR=DDROUT;

	wait_us(1);
	_WR=1;			// steigende Schreibflanke
	wait_us(1);
	_CS = 1;	// Chip select
}

/*
 * --------------------------------------------------
 * Parameter von Display Lesen
 * Eingabe: keine
 * Ausgabe: Wert an Curserposition (8bit)
 * --------------------------------------------------
 */
unsigned char lcd_read_parameter(void){

	unsigned char buffer;
	_CS = 0;	// Chip select
	A0  = 1;	// Parameter
	wait_us(1);
	_WR = 1;	// Schreiben auf 0
	_RD = 1;	// nicht lesen

	DDR=DDRIN;
	wait_us(1);
	_RD=0;		// Lesen
	wait_us(1);
	buffer=DBUS_R;
	wait_us(1);
	_RD=1;			// steigende Leseflanke
	wait_us(1);
	_CS = 1;	// Chip select
	return buffer;
}


/*
 * --------------------------------------------------
 * Read-Funktion
 * Eingabe: Adresse	Hbyte, LByte
 * Ausgabe: Wert in Adresse (8bit)
 * --------------------------------------------------
 */
unsigned char lcd_read(unsigned char addrh, unsigned char addrl){

	lcd_send_cmd(CSRW);
	lcd_send_parameter(addrl);
	lcd_send_parameter(addrh);


	lcd_send_cmd(MEMREAD);
	return lcd_read_parameter();
}
/*
 * --------------------------------------------------
 * CMD-Read-Funktion
 * Eingabe: CMD
 * Ausgabe: Wert 1. parameter
 * --------------------------------------------------
 */
unsigned char lcd_reg_read(unsigned char cmd){
	lcd_send_cmd(cmd);
	return lcd_read_parameter();
}
/*
 * --------------------------------------------------
 * Display initialisieren
 * Eingabe: keine
 * Ausgabe: keine (noch)
 * --------------------------------------------------
 */
void lcd_init(void){

	unsigned short int buffer;

	//DDR=DDROUT;		// Port als ausgang!
	_CS = 1;
	_RES = 0;		// Reset auf 0 = RESETTEN
	wait_ms(3);		// Reset 3ms lang halten
	_RES = 1;		// Reset auf 1 = kein Reset mehr*/
	wait_ms(10);	// 5 ms warten bis Osz. stabil


	lcd_send_cmd(POWER_SAVE);
	lcd_send_cmd(POWER_SAVE);
	lcd_send_cmd(POWER_SAVE);
	lcd_send_cmd(POWER_SAVE);

	lcd_send_cmd(SYSTEM_SET);			//Systemset-register
	lcd_send_parameter(0x30);			// Siehe BSP (single drive)
	lcd_send_parameter(0x87);			// Horrizontale Charatiersize = 8px
	lcd_send_parameter(0x07);			// Vertivcale "			"	  = 8px
	lcd_send_parameter(0x27);			// 40 Adressen / Linie
	lcd_send_parameter(0x1e);			// max Adressen 7 Line
	lcd_send_parameter(0xef);			// 240px vertikale auflösung
	lcd_send_parameter(0x28);
	lcd_send_parameter(0x00);

	//lcd_send_cmd(CGRAM_ADR);			// CG-Ramadress
	//lcd_send_parameter(0x00);			//
	//lcd_send_parameter(0x64);			// 0x6400

	lcd_send_cmd(SCROLL);				// SCROLL-Register
	lcd_send_parameter(0x00);			//	SAD1L
	lcd_send_parameter(0x00);			//	SAD1H
	lcd_send_parameter(0xF0);			//	SL1	(=240 displaylinien)
	lcd_send_parameter(0xB0);			// 	SAD2L
	lcd_send_parameter(0x04);			// 	SAD2H  (0x25A8)
	lcd_send_parameter(0xF0);			//	SL2 (=240 displaylinien)
	lcd_send_parameter(0x00);			//	SAD3L
	lcd_send_parameter(0x00);			//	SAD3H	(0x4B50)
	lcd_send_parameter(0x00);			//	SAD4L 0x0
	lcd_send_parameter(0x00);			//	SAD4H 0x0

	lcd_send_cmd(HDOT_SCR);				//
	lcd_send_parameter(0x00);			// Horizontaler Pixelshit =0

	lcd_send_cmd(GRAYSCALE);
	lcd_send_parameter(0x00);


	lcd_send_cmd(OVLAY);				// Layereinstellungen
	lcd_send_parameter(0x01);			// Layer verodern und Screenbloc1 und 3 im Textmodus

	lcd_send_cmd(DISP_OFF);				// Diaply inactiv
	lcd_send_parameter(0x05);			//	alle Screenblocks an (kein blinken) Curser an kein blinken!


	//lcd_send_cmd(CGRAM_ADR);
	//lcd_send_parameter(0x00);
	//lcd_send_parameter(0x70);


	lcd_send_cmd(CSRW);					//Curserposition im ersten Screenblock auf adresse 0
	lcd_send_parameter(0x00);
	lcd_send_parameter(0x00);
	lcd_send_cmd(MEMWRITE);
	for(buffer =0; buffer < 0x04b0; buffer++){
		lcd_send_parameter('A');
		}

	lcd_send_cmd(CSRFORM);
	lcd_send_parameter(0x04);
	lcd_send_parameter(0x86);



	lcd_send_cmd(CSRW);					//Curserposition im ersten Screenblock auf adresse 0
	lcd_send_parameter(0x00);
	lcd_send_parameter(0x00);

	lcd_send_cmd(DISP_ON);				// Anzeige einschalten

	lcd_send_cmd(0x4c);					// Curser richtung!

	lcd_send_cmd(MEMWRITE);
	lcd_send_parameter(0xff);
	lcd_send_parameter(0xff);
	lcd_send_parameter(0xff);
	lcd_send_parameter('h');
	lcd_send_parameter('a');
	lcd_send_parameter('l');
	lcd_send_parameter('l');
	lcd_send_parameter('0');
	lcd_send_parameter('h');
	lcd_send_parameter('a');
	lcd_send_parameter('l');
	lcd_send_parameter('l');
	lcd_send_parameter('0');
	lcd_send_parameter('h');
	lcd_send_parameter('a');
	lcd_send_parameter('l');
	lcd_send_parameter('l');
	lcd_send_parameter('0');
	lcd_send_parameter('h');
	lcd_send_parameter('a');
	lcd_send_parameter('l');
	lcd_send_parameter('l');
	lcd_send_parameter('0');
	lcd_send_parameter('h');
	lcd_send_parameter('a');
	lcd_send_parameter('l');
	lcd_send_parameter('l');
	lcd_send_parameter('0');
}


/*
 * --------------------------------------------------
 * Warteschleifenfunktion µS	(temporär)
 * Eingabe: Anzahl an µSekunden
 * Ausgabe: keine
 * --------------------------------------------------
 */
void wait_us(unsigned int time){
	unsigned int i;

	do{
		for(i=0; i<80; i++);
		time--;
	}while(time);
}


