/*
 * lcd_sed1335.c - Epson SED 1335 LCD controller
 * (C) 2006 Cole Design and Development
 */

#include <io.h>
#include "lcd_sed1335.h"
#include "logo.h"

#define SET_COMMAND	P3OUT |= 0x10;
#define CLEAR_COMMAND	P3OUT &= ~0x10;
#define SET_READ	P3OUT |= 0x02;
#define CLEAR_READ	P3OUT &= ~0x02;
#define SET_WRITE	P3OUT |= 0x04;
#define CLEAR_WRITE	P3OUT &= ~0x04;
#define DATA_DIR_INPUT	P2DIR = 0x00;
#define DATA_DIR_OUTPUT	P2DIR = 0xFF;

int main(void)
{
	int i;

	DATA_DIR_OUTPUT
	P3DIR = 0x3F;
	P3OUT = 0x27;
	lcd_write_cmd(SED1335_CMD_SYSTEM_SET);
	lcd_write_data(0x30);
	lcd_write_data(0x87);
	lcd_write_data(0x07);
	lcd_write_data(0x27);
	lcd_write_data(0x2B);
	lcd_write_data(0xEF);
	lcd_write_data(0x28);
	lcd_write_data(0x00);
	lcd_write_cmd(SED1335_CMD_SCROLL);
	lcd_write_data(0x00);
	lcd_write_data(0x00);
	lcd_write_data(0xF0);
	lcd_write_data(0x00);
	lcd_write_data(0x04);
	lcd_write_data(0xF0);
	lcd_write_data(0x00);
	lcd_write_data(0x00);
	lcd_write_data(0x00);
	lcd_write_data(0x00);
	lcd_write_cmd(SED1335_CMD_HDOT_SCR);
	lcd_write_data(0x00);
	lcd_write_cmd(SED1335_CMD_OVLAY);
	lcd_write_data(0x00);
	lcd_write_cmd(SED1335_CMD_DISP_OFF);
	lcd_write_data(0x56);
	lcd_clear();
	lcd_write_cmd(SED1335_CMD_CSRW);
	lcd_write_data(0x00);
	lcd_write_data(0x00);
	lcd_write_cmd(SED1335_CMD_CSRFORM);
	lcd_write_data(0x04);
	lcd_write_data(0x86);
	lcd_write_cmd(SED1335_CMD_DISP_ON);
	lcd_write_cmd(SED1335_CMD_CSRDIR_R);
	lcd_print("SED-1335 LCD Controller, by Chris Cole");

	lcd_write_cmd(SED1335_CMD_CSRW);
	lcd_write_data(0x3F);
	lcd_write_data(0x05);
	lcd_write_cmd(SED1335_CMD_MWRITE); 
	for (i=0; i<9600; i++)
		lcd_write_data(data[i]);

	while(1);
}

void lcd_print(char *s)
{
	lcd_write_cmd(SED1335_CMD_MWRITE);
	while (*s)
		lcd_write_data(*s++);
}

void lcd_clear(void)
{
	int i;

	lcd_write_cmd(SED1335_CMD_CSRDIR_R);
	lcd_write_cmd(SED1335_CMD_CSRW);
  	lcd_write_data(0x00);
	lcd_write_data(0x00);
	lcd_write_cmd(SED1335_CMD_MWRITE);
	for (i=0; i<4000; i++)
		lcd_write_data(0x20); // write to character memory
	lcd_write_cmd(SED1335_CMD_CSRW);
	lcd_write_data(0xE8);
	lcd_write_data(0x03);
	lcd_write_cmd(SED1335_CMD_MWRITE); 
	for (i=0; i<(24000); i++)
		lcd_write_data(0x00); // erase graphics memory
}

void lcd_write_cmd(char c)
{
	SET_COMMAND
	P2OUT = c;
	CLEAR_WRITE
	SET_WRITE
}

void lcd_write_data(char c)
{
	CLEAR_COMMAND
	P2OUT = c;
	CLEAR_WRITE
	SET_WRITE
}

char lcd_read_data(void)
{
	char c;

	DATA_DIR_INPUT
	CLEAR_READ
	c = P2IN;
	SET_READ
	DATA_DIR_OUTPUT
	return c;
}


