Baseline for testing

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?

UserRevisionLine numberNew 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 }