You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
7.1 KiB
C
220 lines
7.1 KiB
C
/***********************************************************************************
|
|
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
|
|
***********************************************************************************/
|
|
|
|
|