OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [ARM7_LPC2368_Rowley/] [LCD/] [portlcd.c] - Rev 637

Go to most recent revision | Compare with Previous | Blame | View Log

/*****************************************************************************
 *
 * Project          : lwIP Web
 * Subproject       : 
 * Name             : portlcd.c
 * Function         : Routines for LCD
 * Designer         : K. Sterckx
 * Creation date    : 22/01/2007
 * Compiler         : GNU ARM
 * Processor        : LPC2368
 * Last update      :
 * Last updated by  :
 * History          : 
 *  based on example code from NXP
 *
 ************************************************************************
 *
 *  This code is used to place text on the LCD.
 *
 ************************************************************************/
 
#include <targets/LPC2368.h>
#include "portlcd.h"
#include "FreeRTOS.h"
#include "task.h"
 
/* Please note, on old MCB2300 board, the LCD_E bit is p1.30, on the new board
it's p1.31, please check the schematic carefully, and change LCD_CTRL and LCD_E 
accordingly if you have a different board. */
 
/* LCD IO definitions */
#define LCD_E     0x80000000            /* Enable control pin                */
#define LCD_RW    0x20000000            /* Read/Write control pin            */
#define LCD_RS    0x10000000            /* Data/Instruction control          */
#define LCD_CTRL  0xB0000000            /* Control lines mask                */
#define LCD_DATA  0x0F000000            /* Data lines mask                   */
 
/* Local variables */
static unsigned int lcd_ptr;
 
/* 8 user defined characters to be loaded into CGRAM (used for bargraph) */
static const unsigned char UserFont[8][8] = {
	{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 },
	{ 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C },
	{ 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },
	{ 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F },
	{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
};
 
/* Local Function Prototypes */
static void     lcd_write( unsigned int c );
static void     lcd_write_4bit( unsigned int c );
static unsigned int lcd_read_stat( void );
static void     lcd_write_cmd( unsigned int c );
static void     lcd_write_data( unsigned int d );
static void     lcd_wait_busy( void );
 
 
/******************************************************************************
** Function name:  lcd_write_4bit
**
** Descriptions:
**
** parameters:     four bits to write
** Returned value: None
** 
******************************************************************************/
static void lcd_write_4bit(unsigned int c)
{
	/* Write a 4-bit command to LCD controller. */
	FIO1DIR |= LCD_DATA | LCD_CTRL;
	FIO1CLR  = LCD_RW   | LCD_DATA;
	FIO1SET  = (c & 0xF) << 24;
	FIO1SET  = LCD_E;
	vTaskDelay(0);
	FIO1CLR  = LCD_E;
	vTaskDelay(0);
	return;
}
 
/******************************************************************************
** Function name: lcd_write
**
** Descriptions:
**
** parameters:     word to write
** Returned value: None
** 
******************************************************************************/
static void lcd_write(unsigned int c)
{
	/* Write data/command to LCD controller. */
	lcd_write_4bit (c >> 4);
	lcd_write_4bit (c);
	return;
}
 
/******************************************************************************
** Function name: lcd_read_stat
**
** Descriptions:
**
** parameters:     None
** Returned value: status
** 
******************************************************************************/
static unsigned int lcd_read_stat(void)
{
	/* Read status of LCD controller (ST7066) */
	unsigned int stat;
 
	FIO1DIR &= ~LCD_DATA;
	FIO1CLR  = LCD_RS;
	FIO1SET  = LCD_RW;
	vTaskDelay( 0 );
	FIO1SET  = LCD_E;
	vTaskDelay( 0 );
	stat    = (FIO1PIN >> 20) & 0xF0;
	FIO1CLR  = LCD_E;
	vTaskDelay( 0 );
	FIO1SET  = LCD_E;
	vTaskDelay( 0 );
	stat   |= (FIO1PIN >> 24) & 0xF;
	FIO1CLR  = LCD_E;
	return (stat);
}
 
/******************************************************************************
** Function name: lcd_wait_busy
**
** Descriptions:
**
** parameters:     None
** Returned value: None
** 
******************************************************************************/
static void lcd_wait_busy(void)
{
	/* Wait until LCD controller (ST7066) is busy. */
	unsigned int stat;
 
	do
	{
		stat = lcd_read_stat();
	}
	while (stat & 0x80); /* Wait for busy flag */
 
	return;
}
 
/******************************************************************************
** Function name: lcd_write_cmd
**
** Descriptions:
**
** parameters:     command word
** Returned value: None
** 
******************************************************************************/
static void lcd_write_cmd(unsigned int c)
{
	/* Write command to LCD controller. */
	lcd_wait_busy();
	FIO1CLR = LCD_RS;
	lcd_write(c);
	return;
}
 
/******************************************************************************
** Function name: lcd_write_data
**
** Descriptions:
**
** parameters:     data word
** Returned value: None
** 
******************************************************************************/
static void lcd_write_data(unsigned int d)
{
	/* Write data to LCD controller. */
	lcd_wait_busy();
	FIO1SET = LCD_RS;
	lcd_write(d);
	return;
}
 
/******************************************************************************
** Function name: LCD_init
**
** Descriptions:
**
** parameters:     None
** Returned value: None
** 
******************************************************************************/
void LCD_init(void)
{
	/* Initialize the ST7066 LCD controller to 4-bit mode. */
	PINSEL3 = 0x00000000;
#if USE_FIO
	SCS |= 0x00000001;/* set GPIOx to use Fast I/O */
#endif
	FIO1DIR |= LCD_CTRL | LCD_DATA;
	FIO1CLR  = LCD_RW   | LCD_RS   | LCD_DATA;
 
	lcd_write_4bit(0x3);                /* Select 4-bit interface            */
	vTaskDelay(100);
	lcd_write_4bit(0x3);
	vTaskDelay(100);
	lcd_write_4bit(0x3);
	lcd_write_4bit(0x2);
 
	lcd_write_cmd(0x28);                /* 2 lines, 5x8 character matrix     */
	lcd_write_cmd(0x0e);                /* Display ctrl:Disp/Curs/Blnk=ON    */
	lcd_write_cmd(0x06);                /* Entry mode: Move right, no shift  */
 
	LCD_load( (unsigned char *)&UserFont, sizeof (UserFont) );
	LCD_cls();
	return;
}
 
/******************************************************************************
** Function name: LCD_load
**
** Descriptions:
**
** parameters:     pointer to the buffer and counter
** Returned value: None
** 
******************************************************************************/
void LCD_load(unsigned char *fp, unsigned int cnt)
{
	/* Load user-specific characters into CGRAM */
	unsigned int i;
 
	lcd_write_cmd( 0x40 );                /* Set CGRAM address counter to 0    */
	for (i = 0; i < cnt; i++, fp++)  
	{
		lcd_write_data( *fp );
	}
	return;
}
 
/******************************************************************************
** Function name: LCD_gotoxy
**
** Descriptions:
**
** parameters:     pixel X and Y
** Returned value: None
** 
******************************************************************************/
void LCD_gotoxy(unsigned int x, unsigned int y)
{
	/* Set cursor position on LCD display. Left corner: 1,1, right: 16,2 */
	unsigned int c;
 
	c = --x;
	if (--y) 
	{
		c |= 0x40;
	}
	lcd_write_cmd (c | 0x80);
	lcd_ptr = y*16 + x;
	return;
}
 
/******************************************************************************
** Function name: LCD_cls
**
** Descriptions:
**
** parameters:     None
** Returned value: None
** 
******************************************************************************/
void LCD_cls(void)
{
	/* Clear LCD display, move cursor to home position. */
	lcd_write_cmd (0x01);
	LCD_gotoxy (1,1);
	return;
}
 
/******************************************************************************
** Function name: LCD_cur_off
**
** Descriptions:
**
** parameters:     None
** Returned value: None
** 
******************************************************************************/
void LCD_cur_off(void)
{
	/* Switch off LCD cursor. */
	lcd_write_cmd(0x0c);
	return;
}
 
 
/******************************************************************************
** Function name: LCD_on
**
** Descriptions:
**
** parameters:     None
** Returned value: None
** 
******************************************************************************/
void LCD_on(void)
{
	/* Switch on LCD and enable cursor. */
	lcd_write_cmd (0x0e);
	return;
}
 
/******************************************************************************
** Function name: LCD_putc
**
** Descriptions:
**
** parameters:     unsigned char character
** Returned value: None
** 
******************************************************************************/
void LCD_putc(unsigned char c)
{ 
	/* Print a character to LCD at current cursor position. */
	if (lcd_ptr == 16) 
	{
		lcd_write_cmd (0xc0);
	}
	lcd_write_data(c);
	lcd_ptr++;
	return;
}
 
/******************************************************************************
** Function name: LCD_puts
**
** Descriptions:
**
** parameters:     pointer to the buffer
** Returned value: None
** 
******************************************************************************/
void LCD_puts(unsigned char *sp)
{
	/* Print a string to LCD display. */
	while (*sp) 
	{
		LCD_putc (*sp++);
	}
	return;
}
 
/******************************************************************************
** Function name: LCD_bargraph
**
** Descriptions:
**
** parameters:     value and size
** Returned value: None
** 
******************************************************************************/
void LCD_bargraph(unsigned int val, unsigned int size)
{
	/* Print a bargraph to LCD display.  */
	/* - val:  value 0..100 %            */
	/* - size: size of bargraph 1..16    */
	unsigned int i;
 
	val = val * size / 20;               /* Display matrix 5 x 8 pixels       */
	for (i = 0; i < size; i++) 
	{
		if (val > 5) 
		{
			LCD_putc(5);
			val -= 5;
		}
		else
		{
			LCD_putc(val);
			break;
		}
	}
	return;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.