/*********************************************************************************** | |
Filename: lcd.c | |
DESCRIPTION LCD Module utility functions. | |
Written for KS0066u compatible LCD Module. | |
(8 characters by 2 lines) | |
Copyright : 2006 Renesas Technology Europe Ltd. | |
Copyright : 2006 Renesas Technology Corporation. | |
All Rights Reserved | |
***********************************************************************************/ | |
/*********************************************************************************** | |
Revision History | |
DD.MM.YYYY OSO-UID Description | |
26.07.2006 RTE-MBA First Release | |
***********************************************************************************/ | |
/********************************************************************************** | |
System Includes | |
***********************************************************************************/ | |
#include <machine.h> | |
/********************************************************************************** | |
User Includes | |
***********************************************************************************/ | |
/* iodefine.h provides a structure to access all of the device registers. */ | |
#include "iodefine.h" | |
/* rsk1664def.h provides common defines for widely used items. */ | |
#include "rskrx210def.h" | |
#include "lcd.h" | |
/***************************************************************************** | |
Name: InitDisplay | |
Parameters: none | |
Returns: none | |
Description: Intializes the LCD display. | |
*****************************************************************************/ | |
void InitialiseDisplay( void ) | |
{ | |
/* Power Up Delay for LCD Module */ | |
EN_PIN = SET_BIT_HIGH; | |
DisplayDelay(7000); | |
EN_PIN = SET_BIT_LOW; | |
/* Display initialises in 8 bit mode - so send one write (seen as 8 bit) | |
to set to 4 bit mode. */ | |
/* Function Set */ | |
LCD_nibble_write(CTRL_WR,0x03); | |
LCD_nibble_write(CTRL_WR,0x03); | |
DisplayDelay(39); | |
/* Configure display */ | |
LCD_nibble_write(CTRL_WR,0x03); | |
LCD_nibble_write(CTRL_WR,0x02); | |
LCD_nibble_write(CTRL_WR,(LCD_DISPLAY_ON | LCD_TWO_LINE )); | |
LCD_nibble_write(CTRL_WR,(LCD_DISPLAY_ON | LCD_TWO_LINE )); | |
DisplayDelay(39); | |
/* Display ON/OFF control */ | |
LCD_write(CTRL_WR,LCD_CURSOR_OFF); | |
DisplayDelay(39); | |
/* Display Clear */ | |
LCD_write(CTRL_WR,LCD_CLEAR); | |
DisplayDelay(1530); | |
/* Entry Mode Set */ | |
LCD_write(CTRL_WR,0x06); | |
LCD_write(CTRL_WR,LCD_HOME_L1); | |
} | |
/********************************************************************************** | |
End of function InitialiseDisplay | |
***********************************************************************************/ | |
/***************************************************************************** | |
Name: DisplayString | |
Parameters: position Line number of display | |
string Pointer to data to be written to display. | |
Last character should be null. | |
Returns: none | |
Description: This function controls LCD writes to line 1 or 2 of the LCD. | |
You need to use the defines LCD_LINE1 and LCD_LINE2 in order | |
to specify the starting position. | |
For example, to start at the 2nd position on line 1... | |
DisplayString(LCD_LINE1 + 1, "Hello") | |
*****************************************************************************/ | |
void DisplayString(unsigned char position, char * string) | |
{ | |
static unsigned char next_pos = 0xFF; | |
/* Set line position if needed. We don't want to if we don't need | |
to because LCD control operations take longer than LCD data | |
operations. */ | |
if( next_pos != position) | |
{ | |
if(position < LCD_LINE2) | |
{ | |
/* Display on Line 1 */ | |
LCD_write(CTRL_WR, (unsigned char)(LCD_HOME_L1 + position) ); | |
} | |
else | |
{ | |
/* Display on Line 2 */ | |
LCD_write(CTRL_WR, (unsigned char)(LCD_HOME_L2 + position - LCD_LINE2) ); | |
} | |
/* set position index to known value */ | |
next_pos = position; | |
} | |
do | |
{ | |
LCD_write(DATA_WR,*string++); | |
/* increment position index */ | |
next_pos++; | |
} | |
while(*string); | |
} | |
/********************************************************************************** | |
End of function DisplayString | |
***********************************************************************************/ | |
/***************************************************************************** | |
Name: LCD_write | |
Parameters: value - the value to write | |
data_or_ctrl - To write value as DATA or CONTROL | |
1 = DATA | |
0 = CONTROL | |
Returns: none | |
Description: Writes data to display. Sends command to display. | |
*****************************************************************************/ | |
void LCD_write(unsigned char data_or_ctrl, unsigned char value) | |
{ | |
/* Write upper nibble first */ | |
LCD_nibble_write(data_or_ctrl, (value & 0xF0) >> 4); | |
/* Write lower nibble second */ | |
LCD_nibble_write(data_or_ctrl, (value & 0x0F)); | |
} | |
/********************************************************************************** | |
End of function LCD_write | |
***********************************************************************************/ | |
/***************************************************************************** | |
Name: LCD_nibble_write | |
Parameters: value - the value to write | |
data_or_ctrl - To write value as DATA or CONTROL | |
1 = DATA | |
0 = CONTROL | |
Returns: none | |
Description: Writes data to display. Sends command to display. | |
*****************************************************************************/ | |
void LCD_nibble_write(unsigned char data_or_ctrl, unsigned char value) | |
{ | |
unsigned char ucStore; | |
if (data_or_ctrl == DATA_WR) | |
{ | |
RS_PIN = SET_BIT_HIGH; | |
} | |
else | |
{ | |
RS_PIN = SET_BIT_LOW; | |
} | |
/* There must be 40ns between RS write and EN write */ | |
DisplayDelay(1); | |
/* EN enable chip (HIGH) */ | |
EN_PIN = SET_BIT_HIGH; | |
/* Tiny delay */ | |
DisplayDelay(1); | |
/* Clear port bits used */ | |
/* Set upper lower 4 bits of nibble on port pins. */ | |
ucStore = DATA_PORT; | |
ucStore &= ~DATA_PORT_MASK; | |
/* OR in data */ | |
ucStore |= ((value << DATA_PORT_SHIFT) & DATA_PORT_MASK ); | |
/* Write lower 4 bits of nibble */ | |
DATA_PORT = ucStore; | |
/* write delay while En High */ | |
DisplayDelay(20); | |
/* Latch data by dropping EN */ | |
EN_PIN = SET_BIT_LOW; | |
/* Data hold delay */ | |
DisplayDelay(20); | |
if(data_or_ctrl == CTRL_WR) | |
{ | |
/* Extra delay needed for control writes */ | |
DisplayDelay(40); | |
} | |
} | |
/********************************************************************************** | |
End of function LCD_nibble_write | |
***********************************************************************************/ | |
/***************************************************************************** | |
Name: DisplayDelay | |
Parameters: units - Approximately in microseconds | |
Returns: none | |
Description: Delay routine for LCD display. | |
*****************************************************************************/ | |
void DisplayDelay(unsigned long int units) | |
{ | |
unsigned long counter = units * DELAY_TIMING; | |
while(counter--) | |
{ | |
nop(); // ~ 10ns | |
} | |
} | |
/********************************************************************************** | |
End of function DisplayDelay | |
***********************************************************************************/ | |