/* ******************************************
 * LCD control with USBIO                   *
 * ******************************************
 * Cable connect sample
 *
 * ******************************************
 *
 * USB-IO ------ LCD
 * P0 1   ------ DB0 DATA BIT0
 * P0 2   ------ DB1
 * P0 3   ------ DB2
 * P0 4   ------ DB3
 * P0 5   ------ DB4
 * P0 6   ------ DB5
 * P0 7   ------ DB6
 * P0 8   ------ DB7
 * P1 1   ------ RS
 * P1 2   ------ 
 * P1 3   ------ R/W
 * P1 4   ------ E
 *
 * Vcc    ------ VDD 5V
 * GND    ------ VSS 0V
 *
 * Vcc ---+
 *        |<--*- Vo Contrast Adj.
 * GND ---+ VR 10k
 *
 * ******************************************
 * */

#define LCD_RS 0x01
#define LED_ON 0x02
#define LCD_RW 0x04
#define LCD_E  0x08

/* cmd_output */
void lcd_cmd(struct usb_dev_handle *udev,int OudData)
{
	uio_out(udev,0,OudData);
	uio_out(udev,1,0);
	uio_out(udev,1,LCD_E);
	uio_out(udev,1,0);

}


/* Set LCD function */
void lcd_func(struct usb_dev_handle *udev,int inDl,int inN,int inF)
{
	lcd_cmd(udev, 0x20 + inDl * 0x10 + inN * 0x8 + inF);
}

/* Display Control */
void lcd_ctrl(struct usb_dev_handle *udev,int inD,int inC,int inB)
{
	lcd_cmd(udev,0x8 + inD * 0x4 + inC * 0x2 + inB);
}

/* Display Clear */
void lcd_cls(struct usb_dev_handle *udev)
{
	lcd_cmd(udev,0x1);
}

/* Home Cursor */
void lcd_home(struct usb_dev_handle *udev)
{
	lcd_cmd(udev,0x2);
}

/* Cursor Option */
void lcd_cursft(struct usb_dev_handle *udev,int inS,int inRL)
{
	lcd_cmd(udev,0x10 + inS * 0x8 + inRL * 0x4);
}

/* CGRAM Address Set */
void lcd_cgram_no(struct usb_dev_handle *udev,int inNo)
{
	lcd_cmd(udev,0x40 + inNo);
}

/* LCD LOCATE Set */
void lcd_locate(struct usb_dev_handle *udev,int inX,int inY)
{
	lcd_cmd(udev,0x80 + inY * 0x40 + inX);
}


/* Entry Mode Setting */
void lcd_mode(struct usb_dev_handle *udev,int inID,int inS)
{
	lcd_cmd(udev, 0x4 + inID * 0x2 + inS);
}


/* 1 Char Display */
void lcd_moji(struct usb_dev_handle *udev,int inChr)
{
	uio_out(udev,0,inChr);
	uio_out(udev,1,LCD_RS);
	uio_out(udev,1,LCD_RS+LCD_E);
	uio_out(udev,1,LCD_RS);

}

/* lcd_init */
void lcd_init(struct usb_dev_handle *udev)
{
	lcd_cmd(udev,0x30);
	lcd_cmd(udev,0x30);
	lcd_cmd(udev,0x30);

	/* Set LCD function
	 * 1: 8 bit data
	 * 1: 2 line
	 * 0: 5x7 dot chara */
	lcd_func(udev,1,1,0);

	/* Display Control
	 * 1: Display On
	 * 0: Cursor Off
	 * 0: Blink Off */
	lcd_ctrl(udev,1,0,0);

	/* Display Clear */
	lcd_cls(udev);

	/* Entry Mode setting 
	 * 1: Inc On
	 * 0: Shift Off */
	lcd_mode(udev,1,0);

}

/* LCD Text disp */
void lcd_text(struct usb_dev_handle *udev,unsigned char *s)
{
	while(*s != '\0')
	{
		if (s[0] != 0x8E)  { // for 2byte KANA 
			lcd_moji(udev,*s);
		}
		s++;
	}
}

