drivers/device/LCD.c

Fri, 13 Aug 2010 10:41:29 +0100

author
Philip Pemberton <philpem@philpem.me.uk>
date
Fri, 13 Aug 2010 10:41:29 +0100
changeset 0
267b5a25932f
permissions
-rw-r--r--

Initial commit, GPIO v3.1

philpem@0 1 /****************************************************************************
philpem@0 2 **
philpem@0 3 ** Name: LCD.c
philpem@0 4 **
philpem@0 5 ** Description:
philpem@0 6 ** Implements functions for manipulating a
philpem@0 7 ** dot-matrix LCD
philpem@0 8 **
philpem@0 9 ** $Revision: $
philpem@0 10 **
philpem@0 11 ** Disclaimer:
philpem@0 12 **
philpem@0 13 ** This source code is intended as a design reference which
philpem@0 14 ** illustrates how these types of functions can be implemented. It
philpem@0 15 ** is the user's responsibility to verify their design for
philpem@0 16 ** consistency and functionality through the use of formal
philpem@0 17 ** verification methods. Lattice Semiconductor provides no warranty
philpem@0 18 ** regarding the use or functionality of this code.
philpem@0 19 **
philpem@0 20 ** --------------------------------------------------------------------
philpem@0 21 **
philpem@0 22 ** Lattice Semiconductor Corporation
philpem@0 23 ** 5555 NE Moore Court
philpem@0 24 ** Hillsboro, OR 97214
philpem@0 25 ** U.S.A
philpem@0 26 **
philpem@0 27 ** TEL: 1-800-Lattice (USA and Canada)
philpem@0 28 ** (503)268-8001 (other locations)
philpem@0 29 **
philpem@0 30 ** web: http://www.latticesemi.com
philpem@0 31 ** email: techsupport@latticesemi.com
philpem@0 32 **
philpem@0 33 ** --------------------------------------------------------------------------
philpem@0 34 **
philpem@0 35 ** Change History (Latest changes on top)
philpem@0 36 **
philpem@0 37 ** Ver Date Description
philpem@0 38 ** --------------------------------------------------------------------------
philpem@0 39 **
philpem@0 40 ** 3.0 Mar-25-2008 Added Header
philpem@0 41 **
philpem@0 42 **---------------------------------------------------------------------------
philpem@0 43 *****************************************************************************/
philpem@0 44
philpem@0 45 #include "LCD.h"
philpem@0 46 #include "MicoUtils.h"
philpem@0 47
philpem@0 48 void LCD_WriteData(volatile unsigned int *pAddress, unsigned int data)
philpem@0 49 {
philpem@0 50 unsigned int iData = data;
philpem@0 51
philpem@0 52 /* first output the data to write */
philpem@0 53 *pAddress = iData;
philpem@0 54
philpem@0 55 /* strobe enable while maintaining data */
philpem@0 56 iData |= 0x400;
philpem@0 57 *pAddress = iData;
philpem@0 58
philpem@0 59 /* remove strobe while maintaining data */
philpem@0 60 iData &= ~0x400;
philpem@0 61 *pAddress = iData;
philpem@0 62
philpem@0 63 /* all done */
philpem@0 64 return;
philpem@0 65 }
philpem@0 66
philpem@0 67
philpem@0 68 void LCD_DisplayOnOff(MicoGPIOCtx_t *ctx, unsigned int bOn)
philpem@0 69 {
philpem@0 70 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 71 unsigned int value;
philpem@0 72
philpem@0 73 if(bOn == 0) /* turn display off */
philpem@0 74 value = 0x8;
philpem@0 75 else /* turn display on */
philpem@0 76 value = 0xc;
philpem@0 77
philpem@0 78 LCD_WriteData(pAddress, value);
philpem@0 79 MicoSleepMilliSecs(10);
philpem@0 80 }
philpem@0 81
philpem@0 82
philpem@0 83 void LCD_CursorOnOff(MicoGPIOCtx_t *ctx, unsigned int bOn)
philpem@0 84 {
philpem@0 85 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 86 /* cursor on-off control is valid only if the display is turned on */
philpem@0 87 unsigned int iValue;
philpem@0 88
philpem@0 89 if(bOn == 0)
philpem@0 90 iValue = 0x0c;
philpem@0 91 else
philpem@0 92 iValue = 0x0e;
philpem@0 93
philpem@0 94 LCD_WriteData(pAddress, iValue);
philpem@0 95 MicoSleepMilliSecs(10);
philpem@0 96
philpem@0 97 }
philpem@0 98
philpem@0 99
philpem@0 100 void LCD_BlinkOnOff(MicoGPIOCtx_t *ctx, unsigned int bOn)
philpem@0 101 {
philpem@0 102 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 103 /* character-blink on/off is valid only if the display is turned on */
philpem@0 104 unsigned int iValue;
philpem@0 105
philpem@0 106 if(bOn == 0)
philpem@0 107 iValue = 0xc;
philpem@0 108 else
philpem@0 109 iValue = 0xd;
philpem@0 110
philpem@0 111 LCD_WriteData(pAddress, iValue);
philpem@0 112 MicoSleepMilliSecs(10);
philpem@0 113 }
philpem@0 114
philpem@0 115
philpem@0 116 /* clears LCD display */
philpem@0 117 void LCD_ClearDisplay(MicoGPIOCtx_t *ctx)
philpem@0 118 {
philpem@0 119 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 120 LCD_WriteData(pAddress, 0x1);
philpem@0 121 MicoSleepMilliSecs(10);
philpem@0 122 }
philpem@0 123
philpem@0 124
philpem@0 125 /* sets LCD function (#lines for the display, with 8-bit interface */
philpem@0 126 void LCD_SetFunction(MicoGPIOCtx_t *ctx, unsigned int iNumLines)
philpem@0 127 {
philpem@0 128 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 129 unsigned int value;
philpem@0 130
philpem@0 131 /* always sets an 8-bit interface */
philpem@0 132 if(iNumLines == 2)
philpem@0 133 value = 0x38;
philpem@0 134 else
philpem@0 135 value = 0x00;
philpem@0 136
philpem@0 137 LCD_WriteData(pAddress, value);
philpem@0 138 MicoSleepMilliSecs(10);
philpem@0 139 }
philpem@0 140
philpem@0 141 /* sets cursor-move mode */
philpem@0 142 void LCD_SetCursorMoveMode(MicoGPIOCtx_t *ctx, unsigned int bIncrement)
philpem@0 143 {
philpem@0 144 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 145 unsigned int value;
philpem@0 146 if(bIncrement != 0)
philpem@0 147 value = 0x6;
philpem@0 148 else
philpem@0 149 value = 0x4;
philpem@0 150 LCD_WriteData(pAddress, value);
philpem@0 151 MicoSleepMilliSecs(10);
philpem@0 152 }
philpem@0 153
philpem@0 154
philpem@0 155 /* shifts display to left (!= 0) or right (== 0) */
philpem@0 156 void LCD_ShiftDisplay(MicoGPIOCtx_t *ctx, unsigned int bLeft)
philpem@0 157 {
philpem@0 158 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 159 unsigned int value;
philpem@0 160 if(bLeft == 0) /* shift to right */
philpem@0 161 value = 0x18;
philpem@0 162 else /* shift to left */
philpem@0 163 value = 0x1c;
philpem@0 164 LCD_WriteData(pAddress, value);
philpem@0 165 MicoSleepMilliSecs(10);
philpem@0 166 }
philpem@0 167
philpem@0 168
philpem@0 169 /* shifts cursor to left (!= 0) or right (== 0) */
philpem@0 170 void LCD_ShiftCursor(MicoGPIOCtx_t *ctx, unsigned int bLeft)
philpem@0 171 {
philpem@0 172 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 173 unsigned int value;
philpem@0 174 if(bLeft == 0) /* shift to right */
philpem@0 175 value = 0x10;
philpem@0 176 else /* shift to left */
philpem@0 177 value = 0x14;
philpem@0 178 LCD_WriteData(pAddress, value);
philpem@0 179 MicoSleepMilliSecs(10);
philpem@0 180 }
philpem@0 181
philpem@0 182
philpem@0 183 void LCD_WriteChar(MicoGPIOCtx_t *ctx, unsigned char character)
philpem@0 184 {
philpem@0 185 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 186 unsigned int value = (unsigned int)character;
philpem@0 187 value |= 0x200;
philpem@0 188 LCD_WriteData(pAddress, value);
philpem@0 189 MicoSleepMilliSecs(10);
philpem@0 190 }
philpem@0 191
philpem@0 192
philpem@0 193 void LCD_SetCursorPos(MicoGPIOCtx_t *ctx, unsigned int iLine, unsigned int iCol)
philpem@0 194 {
philpem@0 195 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 196 unsigned int value;
philpem@0 197 if(iLine == 0) /* first line */
philpem@0 198 value = 0x80;
philpem@0 199 else /* second line */
philpem@0 200 value = 0xc0;
philpem@0 201
philpem@0 202 value += iCol;
philpem@0 203
philpem@0 204 LCD_WriteData(pAddress, value);
philpem@0 205 MicoSleepMilliSecs(10);
philpem@0 206 }
philpem@0 207
philpem@0 208
philpem@0 209 void LCD_Init(MicoGPIOCtx_t *ctx, unsigned int iLines)
philpem@0 210 {
philpem@0 211 volatile unsigned int *pAddress = (volatile unsigned int *)(ctx->base);
philpem@0 212 /* - wait for power-stabilization */
philpem@0 213 MicoSleepMilliSecs(40);
philpem@0 214
philpem@0 215 *pAddress = 0x0;
philpem@0 216
philpem@0 217 /* - set data-width (8 bits) and lines in display (2) */
philpem@0 218 LCD_SetFunction(ctx, iLines);
philpem@0 219 LCD_SetFunction(ctx, iLines);
philpem@0 220 LCD_SetFunction(ctx, iLines);
philpem@0 221
philpem@0 222
philpem@0 223 /* turn off the display */
philpem@0 224 LCD_DisplayOnOff(ctx, 0);
philpem@0 225
philpem@0 226 /* - clear display */
philpem@0 227 LCD_ClearDisplay(ctx);
philpem@0 228
philpem@0 229 /* turn-on the display */
philpem@0 230 LCD_DisplayOnOff(ctx, 1);
philpem@0 231
philpem@0 232 /* turn on the blinking of the cursor-position */
philpem@0 233 LCD_BlinkOnOff(ctx, 0);
philpem@0 234
philpem@0 235 /* set cursor move-mode to increment */
philpem@0 236 LCD_SetCursorMoveMode(ctx, 1);
philpem@0 237
philpem@0 238 /* all done */
philpem@0 239 return;
philpem@0 240 }
philpem@0 241