Fri, 13 Aug 2010 10:41:29 +0100
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 |