Baseline for testing
LCD.cpp@2:73721d9e0056, 2019-09-17 (annotated)
- Committer:
- foxbrianr
- Date:
- Tue Sep 17 13:48:43 2019 +0000
- Revision:
- 2:73721d9e0056
- Parent:
- 1:0f1dffc6103a
Beta 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
foxbrianr | 2:73721d9e0056 | 1 | /************************************************************************** |
foxbrianr | 2:73721d9e0056 | 2 | * @file LCD.cpp |
foxbrianr | 2:73721d9e0056 | 3 | * @brief Base class for wrapping the interface with the New Haven 40x4 |
foxbrianr | 2:73721d9e0056 | 4 | * LCD monitor. |
foxbrianr | 2:73721d9e0056 | 5 | * @version: V1.0 |
foxbrianr | 2:73721d9e0056 | 6 | * @date: 9/17/2019 |
foxbrianr | 2:73721d9e0056 | 7 | |
foxbrianr | 2:73721d9e0056 | 8 | * |
foxbrianr | 2:73721d9e0056 | 9 | * @note |
foxbrianr | 2:73721d9e0056 | 10 | * Copyright (C) 2019 E3 Design. All rights reserved. |
foxbrianr | 2:73721d9e0056 | 11 | * |
foxbrianr | 2:73721d9e0056 | 12 | * @par |
foxbrianr | 2:73721d9e0056 | 13 | * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768 |
foxbrianr | 2:73721d9e0056 | 14 | * processor based microcontroller for the ESCM 2000 Monitor and Display. |
foxbrianr | 2:73721d9e0056 | 15 | * * |
foxbrianr | 2:73721d9e0056 | 16 | * @par |
foxbrianr | 2:73721d9e0056 | 17 | * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED |
foxbrianr | 2:73721d9e0056 | 18 | * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF |
foxbrianr | 2:73721d9e0056 | 19 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. |
foxbrianr | 2:73721d9e0056 | 20 | * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR |
foxbrianr | 2:73721d9e0056 | 21 | * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. |
foxbrianr | 2:73721d9e0056 | 22 | * |
foxbrianr | 2:73721d9e0056 | 23 | ******************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 24 | #include "mbed.h" |
foxbrianr | 0:c428f1d60316 | 25 | #include "LCD.h" |
foxbrianr | 1:0f1dffc6103a | 26 | #include <stdio.h> |
foxbrianr | 1:0f1dffc6103a | 27 | #include <ctype.h> |
foxbrianr | 0:c428f1d60316 | 28 | |
foxbrianr | 2:73721d9e0056 | 29 | |
foxbrianr | 2:73721d9e0056 | 30 | #define WAIT_TIME 100 |
foxbrianr | 2:73721d9e0056 | 31 | |
foxbrianr | 2:73721d9e0056 | 32 | #define wait_ms(x) ThisThread::sleep_for(x) |
foxbrianr | 2:73721d9e0056 | 33 | |
foxbrianr | 2:73721d9e0056 | 34 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 35 | LCD::LCD(): |
foxbrianr | 0:c428f1d60316 | 36 | LCD_E1(p17), |
foxbrianr | 0:c428f1d60316 | 37 | LCD_E2(p18), |
foxbrianr | 0:c428f1d60316 | 38 | LCD_RS(p19), |
foxbrianr | 0:c428f1d60316 | 39 | LCD_RW(p20), |
foxbrianr | 0:c428f1d60316 | 40 | //LCD_D4(p24), |
foxbrianr | 0:c428f1d60316 | 41 | //LCD_D5(p23), |
foxbrianr | 0:c428f1d60316 | 42 | //LCD_D6(p22), |
foxbrianr | 0:c428f1d60316 | 43 | //LCD_D7(p21), |
foxbrianr | 0:c428f1d60316 | 44 | //bus constructor is the reverse order of the pins in the byte order. |
foxbrianr | 0:c428f1d60316 | 45 | // d0 - d7 |
foxbrianr | 0:c428f1d60316 | 46 | LCD_DATA( p24, p23, p22, p21) |
foxbrianr | 0:c428f1d60316 | 47 | { |
foxbrianr | 0:c428f1d60316 | 48 | |
foxbrianr | 0:c428f1d60316 | 49 | |
foxbrianr | 0:c428f1d60316 | 50 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 51 | LCD_DATA.mode(OpenDrain); |
foxbrianr | 0:c428f1d60316 | 52 | LCD_E1.mode(OpenDrain); |
foxbrianr | 0:c428f1d60316 | 53 | LCD_E2.mode(OpenDrain); |
foxbrianr | 0:c428f1d60316 | 54 | LCD_RS.mode(OpenDrain); |
foxbrianr | 0:c428f1d60316 | 55 | LCD_RW.mode(OpenDrain); |
foxbrianr | 0:c428f1d60316 | 56 | isOutput=1; |
foxbrianr | 0:c428f1d60316 | 57 | |
foxbrianr | 0:c428f1d60316 | 58 | } |
foxbrianr | 2:73721d9e0056 | 59 | |
foxbrianr | 2:73721d9e0056 | 60 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 61 | LCD::~LCD() |
foxbrianr | 0:c428f1d60316 | 62 | { |
foxbrianr | 0:c428f1d60316 | 63 | } |
foxbrianr | 0:c428f1d60316 | 64 | |
foxbrianr | 0:c428f1d60316 | 65 | |
foxbrianr | 0:c428f1d60316 | 66 | |
foxbrianr | 2:73721d9e0056 | 67 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 68 | void LCD::command1(char i) //Top half of the display |
foxbrianr | 0:c428f1d60316 | 69 | { |
foxbrianr | 0:c428f1d60316 | 70 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 71 | LCD_DATA = i; |
foxbrianr | 0:c428f1d60316 | 72 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 73 | LCD_RS = 0; |
foxbrianr | 0:c428f1d60316 | 74 | LCD_E1 = 1; |
foxbrianr | 0:c428f1d60316 | 75 | wait_us(40); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 76 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 77 | |
foxbrianr | 0:c428f1d60316 | 78 | //printf("C1:%x\n\r", i); |
foxbrianr | 0:c428f1d60316 | 79 | } |
foxbrianr | 0:c428f1d60316 | 80 | |
foxbrianr | 2:73721d9e0056 | 81 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 82 | void LCD::command2(char i) //Bottom half of the display |
foxbrianr | 0:c428f1d60316 | 83 | { |
foxbrianr | 0:c428f1d60316 | 84 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 85 | LCD_DATA = i; |
foxbrianr | 0:c428f1d60316 | 86 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 87 | LCD_RS = 0; |
foxbrianr | 0:c428f1d60316 | 88 | LCD_E2 = 1; |
foxbrianr | 0:c428f1d60316 | 89 | wait_us(40); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 90 | LCD_E2 = 0; |
foxbrianr | 0:c428f1d60316 | 91 | |
foxbrianr | 0:c428f1d60316 | 92 | //printf("C2:%x\n\r", i); |
foxbrianr | 0:c428f1d60316 | 93 | } |
foxbrianr | 0:c428f1d60316 | 94 | |
foxbrianr | 2:73721d9e0056 | 95 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 96 | void LCD::writedata1(char i) //Top half of the display |
foxbrianr | 0:c428f1d60316 | 97 | {; |
foxbrianr | 0:c428f1d60316 | 98 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 99 | LCD_DATA = i; |
foxbrianr | 0:c428f1d60316 | 100 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 101 | LCD_RS = 1; |
foxbrianr | 0:c428f1d60316 | 102 | LCD_E1 = 1; |
foxbrianr | 0:c428f1d60316 | 103 | wait_us(40); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 104 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 105 | } |
foxbrianr | 0:c428f1d60316 | 106 | |
foxbrianr | 2:73721d9e0056 | 107 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 108 | void LCD::writedata2(char i) //Bottom half of the display |
foxbrianr | 0:c428f1d60316 | 109 | { |
foxbrianr | 0:c428f1d60316 | 110 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 111 | LCD_DATA = i; |
foxbrianr | 0:c428f1d60316 | 112 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 113 | LCD_RS = 1; |
foxbrianr | 0:c428f1d60316 | 114 | LCD_E2 = 1; |
foxbrianr | 0:c428f1d60316 | 115 | wait_us(40); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 116 | LCD_E2 = 0; |
foxbrianr | 0:c428f1d60316 | 117 | } |
foxbrianr | 0:c428f1d60316 | 118 | |
foxbrianr | 2:73721d9e0056 | 119 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 120 | void LCD::nextline1(){ |
foxbrianr | 0:c428f1d60316 | 121 | writeCommand(0xc0,1,0); //set DDRAM address to 40 (line 2) |
foxbrianr | 0:c428f1d60316 | 122 | } |
foxbrianr | 2:73721d9e0056 | 123 | |
foxbrianr | 2:73721d9e0056 | 124 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 125 | void LCD::nextline2(){ |
foxbrianr | 0:c428f1d60316 | 126 | writeCommand(0xc0,0,1); //set DDRAM address to 40 (line 4) |
foxbrianr | 0:c428f1d60316 | 127 | } |
foxbrianr | 0:c428f1d60316 | 128 | |
foxbrianr | 2:73721d9e0056 | 129 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 130 | void LCD::display(char *show){ //show character data on display |
foxbrianr | 0:c428f1d60316 | 131 | char datum; |
foxbrianr | 0:c428f1d60316 | 132 | int i; |
foxbrianr | 0:c428f1d60316 | 133 | for (i=0;i<40;i++){ |
foxbrianr | 0:c428f1d60316 | 134 | datum=*show; //point to 1st line data |
foxbrianr | 0:c428f1d60316 | 135 | writeData(datum,1,0); //write to 1st line |
foxbrianr | 0:c428f1d60316 | 136 | ++show; //next letter |
foxbrianr | 0:c428f1d60316 | 137 | } |
foxbrianr | 0:c428f1d60316 | 138 | nextline1(); //move address to line 2 |
foxbrianr | 0:c428f1d60316 | 139 | for (i=0;i<40;i++){ |
foxbrianr | 0:c428f1d60316 | 140 | datum=*show; |
foxbrianr | 0:c428f1d60316 | 141 | writeData(datum,1,0); //write to 2nd line |
foxbrianr | 0:c428f1d60316 | 142 | ++show; |
foxbrianr | 0:c428f1d60316 | 143 | } |
foxbrianr | 0:c428f1d60316 | 144 | for (i=0;i<40;i++){ |
foxbrianr | 0:c428f1d60316 | 145 | datum=*show; |
foxbrianr | 0:c428f1d60316 | 146 | writeData(datum,0,1); //write to 3rd line |
foxbrianr | 0:c428f1d60316 | 147 | ++show; |
foxbrianr | 0:c428f1d60316 | 148 | } |
foxbrianr | 0:c428f1d60316 | 149 | nextline2(); //move address to line 4 |
foxbrianr | 0:c428f1d60316 | 150 | for (i=0;i<40;i++){ |
foxbrianr | 0:c428f1d60316 | 151 | datum=*show; |
foxbrianr | 0:c428f1d60316 | 152 | writeData(datum,0,1); //write to 4th line |
foxbrianr | 0:c428f1d60316 | 153 | ++show; |
foxbrianr | 0:c428f1d60316 | 154 | } |
foxbrianr | 0:c428f1d60316 | 155 | } |
foxbrianr | 0:c428f1d60316 | 156 | |
foxbrianr | 0:c428f1d60316 | 157 | |
foxbrianr | 2:73721d9e0056 | 158 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 159 | void LCD::writeByte1(int value) { |
foxbrianr | 0:c428f1d60316 | 160 | |
foxbrianr | 0:c428f1d60316 | 161 | // ------------------------------------------------- |
foxbrianr | 0:c428f1d60316 | 162 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 163 | LCD_DATA = value >> 4; |
foxbrianr | 0:c428f1d60316 | 164 | |
foxbrianr | 0:c428f1d60316 | 165 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 166 | LCD_E1 = 1; |
foxbrianr | 2:73721d9e0056 | 167 | wait_ms(2); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 168 | __nop(); |
foxbrianr | 0:c428f1d60316 | 169 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 170 | |
foxbrianr | 0:c428f1d60316 | 171 | // ------------------------------------------------- |
foxbrianr | 0:c428f1d60316 | 172 | wait_ms(1); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 173 | |
foxbrianr | 0:c428f1d60316 | 174 | // ------------------------------------------------- |
foxbrianr | 0:c428f1d60316 | 175 | LCD_DATA = value >> 0; |
foxbrianr | 0:c428f1d60316 | 176 | LCD_E1 = 1; |
foxbrianr | 2:73721d9e0056 | 177 | wait_ms(2); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 178 | __nop(); |
foxbrianr | 0:c428f1d60316 | 179 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 180 | |
foxbrianr | 0:c428f1d60316 | 181 | //printf("x1:%x\n\r", value); |
foxbrianr | 0:c428f1d60316 | 182 | } |
foxbrianr | 0:c428f1d60316 | 183 | |
foxbrianr | 2:73721d9e0056 | 184 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 185 | void LCD::writeByte2(int value) { |
foxbrianr | 0:c428f1d60316 | 186 | |
foxbrianr | 0:c428f1d60316 | 187 | // ------------------------------------------------- |
foxbrianr | 0:c428f1d60316 | 188 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 189 | LCD_DATA = value >> 4; |
foxbrianr | 0:c428f1d60316 | 190 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 191 | LCD_E2 = 1; |
foxbrianr | 2:73721d9e0056 | 192 | wait_ms(2); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 193 | __nop(); |
foxbrianr | 0:c428f1d60316 | 194 | LCD_E2 = 0; |
foxbrianr | 0:c428f1d60316 | 195 | |
foxbrianr | 0:c428f1d60316 | 196 | // ------------------------------------------------- |
foxbrianr | 0:c428f1d60316 | 197 | wait_ms(1); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 198 | |
foxbrianr | 0:c428f1d60316 | 199 | // ------------------------------------------------- |
foxbrianr | 0:c428f1d60316 | 200 | LCD_DATA = value >> 0; |
foxbrianr | 0:c428f1d60316 | 201 | LCD_E2 = 1; |
foxbrianr | 2:73721d9e0056 | 202 | wait_ms(2); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 203 | __nop(); |
foxbrianr | 0:c428f1d60316 | 204 | LCD_E2 = 0; |
foxbrianr | 0:c428f1d60316 | 205 | |
foxbrianr | 0:c428f1d60316 | 206 | //printf("x2:%x\n\r", value); |
foxbrianr | 0:c428f1d60316 | 207 | } |
foxbrianr | 0:c428f1d60316 | 208 | |
foxbrianr | 0:c428f1d60316 | 209 | /************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 210 | void LCD::init(void) |
foxbrianr | 0:c428f1d60316 | 211 | { |
foxbrianr | 1:0f1dffc6103a | 212 | wait_ms(100); |
foxbrianr | 1:0f1dffc6103a | 213 | |
foxbrianr | 1:0f1dffc6103a | 214 | LCD_E1 = 0; |
foxbrianr | 1:0f1dffc6103a | 215 | LCD_E2 = 0; |
foxbrianr | 1:0f1dffc6103a | 216 | |
foxbrianr | 1:0f1dffc6103a | 217 | for (int i=0; i<3; i++) { |
foxbrianr | 1:0f1dffc6103a | 218 | command1(0x3);//Wake up |
foxbrianr | 1:0f1dffc6103a | 219 | command2(0x3); |
foxbrianr | 1:0f1dffc6103a | 220 | wait_ms(1); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 221 | } |
foxbrianr | 0:c428f1d60316 | 222 | command1(0x2);// Set 4 bit mode |
foxbrianr | 0:c428f1d60316 | 223 | command2(0x2); |
foxbrianr | 0:c428f1d60316 | 224 | wait_ms(1); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 225 | |
foxbrianr | 1:0f1dffc6103a | 226 | |
foxbrianr | 0:c428f1d60316 | 227 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 228 | LCD_RS = 0; |
foxbrianr | 1:0f1dffc6103a | 229 | |
foxbrianr | 1:0f1dffc6103a | 230 | writeCommand(0x2C,1,1); //Turn on display |
foxbrianr | 1:0f1dffc6103a | 231 | |
foxbrianr | 1:0f1dffc6103a | 232 | writeCommand(LCD_setDisplayOff,1,1); //Turn on display |
foxbrianr | 0:c428f1d60316 | 233 | //writeCommand2(LCD_setDisplayOff); |
foxbrianr | 1:0f1dffc6103a | 234 | |
foxbrianr | 1:0f1dffc6103a | 235 | writeCommand(LCD_clearDisplay,1,1); //Clear display |
foxbrianr | 0:c428f1d60316 | 236 | //writeCommand2(LCD_clearDisplay); |
foxbrianr | 0:c428f1d60316 | 237 | |
foxbrianr | 1:0f1dffc6103a | 238 | writeCommand(LCD_entryModeSet,1,1); //Entry mode cursor increment |
foxbrianr | 0:c428f1d60316 | 239 | //writeCommand2(LCD_entryModeSet); |
foxbrianr | 1:0f1dffc6103a | 240 | |
foxbrianr | 1:0f1dffc6103a | 241 | writeCommand(LCD_setDisplayOn,1,1); //Turn on display; no cursor |
foxbrianr | 0:c428f1d60316 | 242 | //writeCommand2(LCD_setDisplayOn); |
foxbrianr | 1:0f1dffc6103a | 243 | |
foxbrianr | 1:0f1dffc6103a | 244 | |
foxbrianr | 1:0f1dffc6103a | 245 | LCD_E1 = 0; |
foxbrianr | 1:0f1dffc6103a | 246 | LCD_E2 = 0; |
foxbrianr | 1:0f1dffc6103a | 247 | |
foxbrianr | 0:c428f1d60316 | 248 | } |
foxbrianr | 0:c428f1d60316 | 249 | |
foxbrianr | 2:73721d9e0056 | 250 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 251 | void LCD::locate(int row, int column) { |
foxbrianr | 1:0f1dffc6103a | 252 | _row = row; |
foxbrianr | 0:c428f1d60316 | 253 | _column = column; |
foxbrianr | 2:73721d9e0056 | 254 | } |
foxbrianr | 1:0f1dffc6103a | 255 | |
foxbrianr | 2:73721d9e0056 | 256 | /*****************************************************************************/ |
foxbrianr | 1:0f1dffc6103a | 257 | void LCD::cls(){ |
foxbrianr | 0:c428f1d60316 | 258 | |
foxbrianr | 2:73721d9e0056 | 259 | clear(1,1); |
foxbrianr | 2:73721d9e0056 | 260 | wait_ms(2); |
foxbrianr | 2:73721d9e0056 | 261 | |
foxbrianr | 2:73721d9e0056 | 262 | //fprintf(stdout,"C1:\n\r"); |
foxbrianr | 1:0f1dffc6103a | 263 | } |
foxbrianr | 2:73721d9e0056 | 264 | /*****************************************************************************/ |
foxbrianr | 2:73721d9e0056 | 265 | void LCD::clear() |
foxbrianr | 2:73721d9e0056 | 266 | { |
foxbrianr | 2:73721d9e0056 | 267 | locate(0,0);write(" "); |
foxbrianr | 2:73721d9e0056 | 268 | locate(1,0);write(" "); |
foxbrianr | 2:73721d9e0056 | 269 | locate(2,0);write(" "); |
foxbrianr | 2:73721d9e0056 | 270 | locate(3,0);write(" "); |
foxbrianr | 2:73721d9e0056 | 271 | } |
foxbrianr | 2:73721d9e0056 | 272 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 273 | void LCD::clear(int e1, int e2 ){ |
foxbrianr | 1:0f1dffc6103a | 274 | |
foxbrianr | 2:73721d9e0056 | 275 | waitBusy(); |
foxbrianr | 0:c428f1d60316 | 276 | writeCommand(LCD_clearDisplay,e1,e2); |
foxbrianr | 0:c428f1d60316 | 277 | _row = 0; |
foxbrianr | 0:c428f1d60316 | 278 | _column = 0; |
foxbrianr | 1:0f1dffc6103a | 279 | |
foxbrianr | 0:c428f1d60316 | 280 | } |
foxbrianr | 0:c428f1d60316 | 281 | |
foxbrianr | 2:73721d9e0056 | 282 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 283 | int LCD::isBusy1(void) |
foxbrianr | 0:c428f1d60316 | 284 | { |
foxbrianr | 2:73721d9e0056 | 285 | volatile int input = 0; |
foxbrianr | 2:73721d9e0056 | 286 | volatile int hi = 0; |
foxbrianr | 2:73721d9e0056 | 287 | volatile int lo = 0; |
foxbrianr | 0:c428f1d60316 | 288 | int result = 0; |
foxbrianr | 0:c428f1d60316 | 289 | |
foxbrianr | 0:c428f1d60316 | 290 | LCD_RW = 1; |
foxbrianr | 2:73721d9e0056 | 291 | __nop(); |
foxbrianr | 0:c428f1d60316 | 292 | LCD_RS = 0; |
foxbrianr | 2:73721d9e0056 | 293 | |
foxbrianr | 0:c428f1d60316 | 294 | LCD_DATA.input(); // switch port back to output |
foxbrianr | 0:c428f1d60316 | 295 | |
foxbrianr | 0:c428f1d60316 | 296 | LCD_E1 = 1; |
foxbrianr | 0:c428f1d60316 | 297 | __nop(); |
foxbrianr | 0:c428f1d60316 | 298 | lo = LCD_DATA.read() ; // read low bit |
foxbrianr | 0:c428f1d60316 | 299 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 300 | wait_ms(1); |
foxbrianr | 0:c428f1d60316 | 301 | LCD_E1 = 1; |
foxbrianr | 0:c428f1d60316 | 302 | hi = LCD_DATA.read() ; // read high bit |
foxbrianr | 0:c428f1d60316 | 303 | __nop(); |
foxbrianr | 0:c428f1d60316 | 304 | LCD_E1 = 0; |
foxbrianr | 2:73721d9e0056 | 305 | |
foxbrianr | 0:c428f1d60316 | 306 | |
foxbrianr | 2:73721d9e0056 | 307 | if ((0x8 & lo)) // wait until display is ready |
foxbrianr | 0:c428f1d60316 | 308 | { |
foxbrianr | 0:c428f1d60316 | 309 | result = 1; |
foxbrianr | 0:c428f1d60316 | 310 | } |
foxbrianr | 0:c428f1d60316 | 311 | result =0; |
foxbrianr | 0:c428f1d60316 | 312 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 313 | LCD_DATA.output(); // switch port back to output |
foxbrianr | 2:73721d9e0056 | 314 | |
foxbrianr | 2:73721d9e0056 | 315 | //fprintf(stdout,"isBusy1? = 0x%02x 0x%02x \n\r", lo,hi ); |
foxbrianr | 2:73721d9e0056 | 316 | |
foxbrianr | 0:c428f1d60316 | 317 | return result; |
foxbrianr | 0:c428f1d60316 | 318 | } |
foxbrianr | 0:c428f1d60316 | 319 | |
foxbrianr | 2:73721d9e0056 | 320 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 321 | int LCD::isBusy2(void) |
foxbrianr | 0:c428f1d60316 | 322 | { |
foxbrianr | 0:c428f1d60316 | 323 | |
foxbrianr | 2:73721d9e0056 | 324 | volatile int input = 0; |
foxbrianr | 2:73721d9e0056 | 325 | volatile int hi = 0; |
foxbrianr | 2:73721d9e0056 | 326 | volatile int lo = 0; |
foxbrianr | 0:c428f1d60316 | 327 | int result = 0; |
foxbrianr | 0:c428f1d60316 | 328 | |
foxbrianr | 0:c428f1d60316 | 329 | LCD_RW = 1; |
foxbrianr | 2:73721d9e0056 | 330 | __nop(); |
foxbrianr | 0:c428f1d60316 | 331 | LCD_RS = 0; |
foxbrianr | 0:c428f1d60316 | 332 | |
foxbrianr | 2:73721d9e0056 | 333 | LCD_DATA.input(); // switch port back to output |
foxbrianr | 0:c428f1d60316 | 334 | LCD_E2 = 1; |
foxbrianr | 0:c428f1d60316 | 335 | __nop(); |
foxbrianr | 2:73721d9e0056 | 336 | lo = LCD_DATA.read() >> 0; // read low bit |
foxbrianr | 0:c428f1d60316 | 337 | LCD_E2 = 0; |
foxbrianr | 0:c428f1d60316 | 338 | __nop(); |
foxbrianr | 0:c428f1d60316 | 339 | LCD_E2 = 1; |
foxbrianr | 2:73721d9e0056 | 340 | hi = LCD_DATA.read() >> 4; // read high bit |
foxbrianr | 0:c428f1d60316 | 341 | __nop(); |
foxbrianr | 0:c428f1d60316 | 342 | LCD_E2 = 0; |
foxbrianr | 0:c428f1d60316 | 343 | |
foxbrianr | 0:c428f1d60316 | 344 | |
foxbrianr | 2:73721d9e0056 | 345 | if ((0x8 & lo)) // wait until display is ready |
foxbrianr | 0:c428f1d60316 | 346 | { |
foxbrianr | 0:c428f1d60316 | 347 | result = 1; |
foxbrianr | 0:c428f1d60316 | 348 | } |
foxbrianr | 0:c428f1d60316 | 349 | |
foxbrianr | 0:c428f1d60316 | 350 | LCD_RW = 0; |
foxbrianr | 0:c428f1d60316 | 351 | LCD_DATA.output(); // switch port back to output |
foxbrianr | 0:c428f1d60316 | 352 | |
foxbrianr | 2:73721d9e0056 | 353 | //fprintf(stdout,"isBusy2? = 0x%02x 0x%02x \n\r", lo,hi ); |
foxbrianr | 0:c428f1d60316 | 354 | return result; |
foxbrianr | 0:c428f1d60316 | 355 | } |
foxbrianr | 0:c428f1d60316 | 356 | |
foxbrianr | 2:73721d9e0056 | 357 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 358 | int LCD::isBusy(int e1, int e2) |
foxbrianr | 0:c428f1d60316 | 359 | { |
foxbrianr | 0:c428f1d60316 | 360 | int input = 0; |
foxbrianr | 0:c428f1d60316 | 361 | int result = 0; |
foxbrianr | 0:c428f1d60316 | 362 | |
foxbrianr | 0:c428f1d60316 | 363 | if (e1) { |
foxbrianr | 2:73721d9e0056 | 364 | result=isBusy1(); |
foxbrianr | 2:73721d9e0056 | 365 | } |
foxbrianr | 0:c428f1d60316 | 366 | |
foxbrianr | 0:c428f1d60316 | 367 | if (e2 && result==0) { |
foxbrianr | 0:c428f1d60316 | 368 | |
foxbrianr | 2:73721d9e0056 | 369 | result=isBusy2(); |
foxbrianr | 0:c428f1d60316 | 370 | } |
foxbrianr | 0:c428f1d60316 | 371 | |
foxbrianr | 0:c428f1d60316 | 372 | return result; |
foxbrianr | 0:c428f1d60316 | 373 | } |
foxbrianr | 0:c428f1d60316 | 374 | |
foxbrianr | 2:73721d9e0056 | 375 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 376 | void LCD::waitBusy() |
foxbrianr | 0:c428f1d60316 | 377 | { |
foxbrianr | 0:c428f1d60316 | 378 | unsigned char statusBit; |
foxbrianr | 0:c428f1d60316 | 379 | statusBit = isBusy(1,1); |
foxbrianr | 0:c428f1d60316 | 380 | //int i=0; |
foxbrianr | 0:c428f1d60316 | 381 | while (statusBit) |
foxbrianr | 0:c428f1d60316 | 382 | { |
foxbrianr | 2:73721d9e0056 | 383 | fprintf(stdout,"!"); |
foxbrianr | 0:c428f1d60316 | 384 | statusBit = isBusy(1,1); |
foxbrianr | 2:73721d9e0056 | 385 | wait_us(1); |
foxbrianr | 0:c428f1d60316 | 386 | } |
foxbrianr | 0:c428f1d60316 | 387 | } |
foxbrianr | 0:c428f1d60316 | 388 | |
foxbrianr | 2:73721d9e0056 | 389 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 390 | void LCD::writeData(char value, int e1, int e2 ){ |
foxbrianr | 0:c428f1d60316 | 391 | |
foxbrianr | 0:c428f1d60316 | 392 | |
foxbrianr | 0:c428f1d60316 | 393 | int hi=( value & 0xF0 ) >> 4; |
foxbrianr | 0:c428f1d60316 | 394 | int lo=( value & 0x0F ) >> 0; |
foxbrianr | 0:c428f1d60316 | 395 | |
foxbrianr | 0:c428f1d60316 | 396 | LCD_DATA.output(); |
foxbrianr | 0:c428f1d60316 | 397 | |
foxbrianr | 0:c428f1d60316 | 398 | if(e1) { |
foxbrianr | 0:c428f1d60316 | 399 | |
foxbrianr | 0:c428f1d60316 | 400 | LCD_DATA = hi; |
foxbrianr | 0:c428f1d60316 | 401 | LCD_E1 = 1; |
foxbrianr | 2:73721d9e0056 | 402 | wait_us(WAIT_TIME); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 403 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 404 | |
foxbrianr | 2:73721d9e0056 | 405 | wait_us(WAIT_TIME); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 406 | |
foxbrianr | 0:c428f1d60316 | 407 | LCD_DATA = lo; |
foxbrianr | 0:c428f1d60316 | 408 | LCD_E1 = 1; |
foxbrianr | 2:73721d9e0056 | 409 | wait_us(WAIT_TIME); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 410 | LCD_E1 = 0; |
foxbrianr | 0:c428f1d60316 | 411 | } |
foxbrianr | 0:c428f1d60316 | 412 | |
foxbrianr | 0:c428f1d60316 | 413 | if(e2) |
foxbrianr | 0:c428f1d60316 | 414 | { |
foxbrianr | 0:c428f1d60316 | 415 | LCD_DATA = hi; |
foxbrianr | 0:c428f1d60316 | 416 | LCD_E2= 1; |
foxbrianr | 2:73721d9e0056 | 417 | wait_us(WAIT_TIME); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 418 | LCD_E2= 0; |
foxbrianr | 0:c428f1d60316 | 419 | |
foxbrianr | 2:73721d9e0056 | 420 | wait_us(WAIT_TIME); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 421 | |
foxbrianr | 0:c428f1d60316 | 422 | LCD_DATA = lo; |
foxbrianr | 0:c428f1d60316 | 423 | LCD_E2= 1; |
foxbrianr | 2:73721d9e0056 | 424 | wait_us(WAIT_TIME); // wait 40 us for most commands |
foxbrianr | 0:c428f1d60316 | 425 | LCD_E2= 0; |
foxbrianr | 0:c428f1d60316 | 426 | } |
foxbrianr | 0:c428f1d60316 | 427 | } |
foxbrianr | 0:c428f1d60316 | 428 | |
foxbrianr | 2:73721d9e0056 | 429 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 430 | void LCD::writeCommand(char value, int e1, int e2){ |
foxbrianr | 0:c428f1d60316 | 431 | |
foxbrianr | 2:73721d9e0056 | 432 | waitBusy(); |
foxbrianr | 0:c428f1d60316 | 433 | LCD_RS = 0; |
foxbrianr | 0:c428f1d60316 | 434 | writeData(value,e1,e2); |
foxbrianr | 0:c428f1d60316 | 435 | } |
foxbrianr | 0:c428f1d60316 | 436 | |
foxbrianr | 2:73721d9e0056 | 437 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 438 | void LCD::writeChar(char value, int e1, int e2){ |
foxbrianr | 2:73721d9e0056 | 439 | //waitBusy(); |
foxbrianr | 0:c428f1d60316 | 440 | LCD_RS = 1; |
foxbrianr | 0:c428f1d60316 | 441 | writeData(value,e1,e2); |
foxbrianr | 0:c428f1d60316 | 442 | } |
foxbrianr | 0:c428f1d60316 | 443 | |
foxbrianr | 0:c428f1d60316 | 444 | |
foxbrianr | 2:73721d9e0056 | 445 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 446 | void LCD::putc(const char c) |
foxbrianr | 0:c428f1d60316 | 447 | { |
foxbrianr | 0:c428f1d60316 | 448 | character(_row, _column, c); |
foxbrianr | 0:c428f1d60316 | 449 | } |
foxbrianr | 0:c428f1d60316 | 450 | |
foxbrianr | 2:73721d9e0056 | 451 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 452 | void LCD::printf(const char *message, ...) |
foxbrianr | 0:c428f1d60316 | 453 | { |
foxbrianr | 0:c428f1d60316 | 454 | char buffer[128]; |
foxbrianr | 0:c428f1d60316 | 455 | va_list argptr; |
foxbrianr | 0:c428f1d60316 | 456 | va_start(argptr, message); |
foxbrianr | 1:0f1dffc6103a | 457 | vsprintf( buffer, message, argptr); |
foxbrianr | 1:0f1dffc6103a | 458 | write (buffer); |
foxbrianr | 1:0f1dffc6103a | 459 | va_end(argptr); |
foxbrianr | 0:c428f1d60316 | 460 | } |
foxbrianr | 0:c428f1d60316 | 461 | |
foxbrianr | 2:73721d9e0056 | 462 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 463 | void LCD::write(const char* text) { |
foxbrianr | 0:c428f1d60316 | 464 | //_row = 0; |
foxbrianr | 0:c428f1d60316 | 465 | //_column = 0; |
foxbrianr | 0:c428f1d60316 | 466 | int characterAmount =0; |
foxbrianr | 0:c428f1d60316 | 467 | |
foxbrianr | 1:0f1dffc6103a | 468 | for(int i = 0; text[i] != '\0'; i++) { |
foxbrianr | 2:73721d9e0056 | 469 | if (!isprint(text[i])) { |
foxbrianr | 2:73721d9e0056 | 470 | fprintf(stdout,"^%02x : %s ", text[i],text); |
foxbrianr | 2:73721d9e0056 | 471 | } |
foxbrianr | 0:c428f1d60316 | 472 | characterAmount++; |
foxbrianr | 1:0f1dffc6103a | 473 | } |
foxbrianr | 1:0f1dffc6103a | 474 | |
foxbrianr | 1:0f1dffc6103a | 475 | if (characterAmount > 40 - _column ) { |
foxbrianr | 1:0f1dffc6103a | 476 | fprintf(stdout,"OVERFLOW+(%d+%d) %d: [%s] \n\r",_row, _column, characterAmount, text); |
foxbrianr | 1:0f1dffc6103a | 477 | characterAmount = 40 - _column ; |
foxbrianr | 1:0f1dffc6103a | 478 | } |
foxbrianr | 0:c428f1d60316 | 479 | |
foxbrianr | 0:c428f1d60316 | 480 | for (int i = 0; i < characterAmount && i < rows() * columns(); i++){ |
foxbrianr | 1:0f1dffc6103a | 481 | if (isprint(text[i])) |
foxbrianr | 1:0f1dffc6103a | 482 | character(_row, _column, text[i]); |
foxbrianr | 1:0f1dffc6103a | 483 | |
foxbrianr | 1:0f1dffc6103a | 484 | wait_us(1); |
foxbrianr | 0:c428f1d60316 | 485 | } |
foxbrianr | 0:c428f1d60316 | 486 | } |
foxbrianr | 0:c428f1d60316 | 487 | |
foxbrianr | 2:73721d9e0056 | 488 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 489 | void LCD::writeLine(int line, const char* text ) { |
foxbrianr | 0:c428f1d60316 | 490 | |
foxbrianr | 0:c428f1d60316 | 491 | _row = line; |
foxbrianr | 0:c428f1d60316 | 492 | _column = 1; |
foxbrianr | 0:c428f1d60316 | 493 | |
foxbrianr | 0:c428f1d60316 | 494 | int characterAmount =strlen(text); |
foxbrianr | 0:c428f1d60316 | 495 | |
foxbrianr | 0:c428f1d60316 | 496 | int i=0; |
foxbrianr | 0:c428f1d60316 | 497 | locate(_row,_column); |
foxbrianr | 0:c428f1d60316 | 498 | |
foxbrianr | 0:c428f1d60316 | 499 | while(i < columns()-1) |
foxbrianr | 0:c428f1d60316 | 500 | { |
foxbrianr | 0:c428f1d60316 | 501 | if ( i < characterAmount ) |
foxbrianr | 0:c428f1d60316 | 502 | putc( text[i]); |
foxbrianr | 0:c428f1d60316 | 503 | else |
foxbrianr | 0:c428f1d60316 | 504 | putc ( ' '); |
foxbrianr | 0:c428f1d60316 | 505 | |
foxbrianr | 0:c428f1d60316 | 506 | i++; |
foxbrianr | 0:c428f1d60316 | 507 | } |
foxbrianr | 0:c428f1d60316 | 508 | } |
foxbrianr | 0:c428f1d60316 | 509 | |
foxbrianr | 2:73721d9e0056 | 510 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 511 | void LCD::writeCharacter(const char c, int row, int column) { |
foxbrianr | 0:c428f1d60316 | 512 | locate(row, column); |
foxbrianr | 0:c428f1d60316 | 513 | character(_row, _column, c); |
foxbrianr | 0:c428f1d60316 | 514 | } |
foxbrianr | 0:c428f1d60316 | 515 | |
foxbrianr | 2:73721d9e0056 | 516 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 517 | void LCD::writeCharacters(const char* text, int row, int column) { |
foxbrianr | 0:c428f1d60316 | 518 | locate(row, column); |
foxbrianr | 0:c428f1d60316 | 519 | |
foxbrianr | 0:c428f1d60316 | 520 | int characterAmount =0; |
foxbrianr | 0:c428f1d60316 | 521 | |
foxbrianr | 0:c428f1d60316 | 522 | for(int i = 0; text[i] != '\0'; i++) |
foxbrianr | 0:c428f1d60316 | 523 | characterAmount++; |
foxbrianr | 0:c428f1d60316 | 524 | |
foxbrianr | 0:c428f1d60316 | 525 | for (int i = 0; i < characterAmount && i < columns() - column; i++){ |
foxbrianr | 0:c428f1d60316 | 526 | character(_row, _column, text[i]); |
foxbrianr | 0:c428f1d60316 | 527 | } |
foxbrianr | 0:c428f1d60316 | 528 | } |
foxbrianr | 0:c428f1d60316 | 529 | |
foxbrianr | 2:73721d9e0056 | 530 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 531 | int LCD::address(int row, int column){ |
foxbrianr | 0:c428f1d60316 | 532 | |
foxbrianr | 0:c428f1d60316 | 533 | int a=0x80; |
foxbrianr | 0:c428f1d60316 | 534 | |
foxbrianr | 0:c428f1d60316 | 535 | if(row < rows() && column < columns()) |
foxbrianr | 0:c428f1d60316 | 536 | { |
foxbrianr | 0:c428f1d60316 | 537 | switch (row){ |
foxbrianr | 0:c428f1d60316 | 538 | case 0: |
foxbrianr | 0:c428f1d60316 | 539 | case 1: |
foxbrianr | 0:c428f1d60316 | 540 | a = 0x80 + (row * 0x40) + column; |
foxbrianr | 0:c428f1d60316 | 541 | break; |
foxbrianr | 0:c428f1d60316 | 542 | case 2: |
foxbrianr | 0:c428f1d60316 | 543 | case 3: |
foxbrianr | 0:c428f1d60316 | 544 | a = 0x80 + ((row-2) * 0x40) + column; |
foxbrianr | 0:c428f1d60316 | 545 | break; |
foxbrianr | 0:c428f1d60316 | 546 | default: |
foxbrianr | 0:c428f1d60316 | 547 | break; |
foxbrianr | 0:c428f1d60316 | 548 | } |
foxbrianr | 0:c428f1d60316 | 549 | } |
foxbrianr | 0:c428f1d60316 | 550 | |
foxbrianr | 0:c428f1d60316 | 551 | return a; |
foxbrianr | 0:c428f1d60316 | 552 | } |
foxbrianr | 0:c428f1d60316 | 553 | |
foxbrianr | 2:73721d9e0056 | 554 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 555 | void LCD::character(int row, int column, char c) { |
foxbrianr | 0:c428f1d60316 | 556 | uint8_t a = address(row, column); |
foxbrianr | 1:0f1dffc6103a | 557 | |
foxbrianr | 0:c428f1d60316 | 558 | if(row<2){ |
foxbrianr | 0:c428f1d60316 | 559 | writeCommand(a,1,0); |
foxbrianr | 0:c428f1d60316 | 560 | writeChar(c,1,0); |
foxbrianr | 0:c428f1d60316 | 561 | } |
foxbrianr | 0:c428f1d60316 | 562 | else |
foxbrianr | 0:c428f1d60316 | 563 | { |
foxbrianr | 0:c428f1d60316 | 564 | writeCommand(a,0,1); |
foxbrianr | 0:c428f1d60316 | 565 | writeChar(c,0,1); |
foxbrianr | 0:c428f1d60316 | 566 | } |
foxbrianr | 0:c428f1d60316 | 567 | |
foxbrianr | 0:c428f1d60316 | 568 | //Update position |
foxbrianr | 0:c428f1d60316 | 569 | if(_column < columns()) |
foxbrianr | 0:c428f1d60316 | 570 | _column++; |
foxbrianr | 0:c428f1d60316 | 571 | if (_column >= columns()){ |
foxbrianr | 2:73721d9e0056 | 572 | #if 1 |
foxbrianr | 0:c428f1d60316 | 573 | if (_row == 0){ |
foxbrianr | 0:c428f1d60316 | 574 | _column = 0; |
foxbrianr | 0:c428f1d60316 | 575 | _row++; |
foxbrianr | 0:c428f1d60316 | 576 | } |
foxbrianr | 0:c428f1d60316 | 577 | else{ |
foxbrianr | 0:c428f1d60316 | 578 | _row = 0; |
foxbrianr | 0:c428f1d60316 | 579 | _column = 0; |
foxbrianr | 0:c428f1d60316 | 580 | } |
foxbrianr | 0:c428f1d60316 | 581 | #endif |
foxbrianr | 0:c428f1d60316 | 582 | } |
foxbrianr | 0:c428f1d60316 | 583 | } |
foxbrianr | 0:c428f1d60316 | 584 | |
foxbrianr | 2:73721d9e0056 | 585 | /*****************************************************************************/ |
foxbrianr | 0:c428f1d60316 | 586 | void LCD::setCursorMode( int mode ) |
foxbrianr | 0:c428f1d60316 | 587 | { |
foxbrianr | 0:c428f1d60316 | 588 | if (mode) |
foxbrianr | 0:c428f1d60316 | 589 | { |
foxbrianr | 0:c428f1d60316 | 590 | if(_row < 2) |
foxbrianr | 0:c428f1d60316 | 591 | writeCommand(LCD_setDisplayBlink,1,0); |
foxbrianr | 0:c428f1d60316 | 592 | else |
foxbrianr | 0:c428f1d60316 | 593 | writeCommand(LCD_setDisplayBlink,0,1); |
foxbrianr | 0:c428f1d60316 | 594 | |
foxbrianr | 0:c428f1d60316 | 595 | } |
foxbrianr | 0:c428f1d60316 | 596 | else |
foxbrianr | 0:c428f1d60316 | 597 | { |
foxbrianr | 0:c428f1d60316 | 598 | writeCommand(LCD_setDisplayOn,1,1); |
foxbrianr | 0:c428f1d60316 | 599 | } |
foxbrianr | 0:c428f1d60316 | 600 | } |