Dependents:   FBRDash1 FBRDash-tom FBRDash

Committer:
intrinseca
Date:
Wed Mar 21 23:55:03 2012 +0000
Revision:
0:006bcd28cc39

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
intrinseca 0:006bcd28cc39 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
intrinseca 0:006bcd28cc39 2 * Copyright (c) 2007-2010, sford, http://mbed.org
intrinseca 0:006bcd28cc39 3 *
intrinseca 0:006bcd28cc39 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
intrinseca 0:006bcd28cc39 5 * of this software and associated documentation files (the "Software"), to deal
intrinseca 0:006bcd28cc39 6 * in the Software without restriction, including without limitation the rights
intrinseca 0:006bcd28cc39 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
intrinseca 0:006bcd28cc39 8 * copies of the Software, and to permit persons to whom the Software is
intrinseca 0:006bcd28cc39 9 * furnished to do so, subject to the following conditions:
intrinseca 0:006bcd28cc39 10 *
intrinseca 0:006bcd28cc39 11 * The above copyright notice and this permission notice shall be included in
intrinseca 0:006bcd28cc39 12 * all copies or substantial portions of the Software.
intrinseca 0:006bcd28cc39 13 *
intrinseca 0:006bcd28cc39 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
intrinseca 0:006bcd28cc39 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
intrinseca 0:006bcd28cc39 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
intrinseca 0:006bcd28cc39 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
intrinseca 0:006bcd28cc39 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
intrinseca 0:006bcd28cc39 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
intrinseca 0:006bcd28cc39 20 * THE SOFTWARE.
intrinseca 0:006bcd28cc39 21 */
intrinseca 0:006bcd28cc39 22
intrinseca 0:006bcd28cc39 23 #include "TextLCD.h"
intrinseca 0:006bcd28cc39 24 #include "mbed.h"
intrinseca 0:006bcd28cc39 25
intrinseca 0:006bcd28cc39 26 TextLCD::TextLCD(PinName rs, PinName rw, PinName e, PinName d0, PinName d1,
intrinseca 0:006bcd28cc39 27 PinName d2, PinName d3, LCDType type) : _rs(rs), _rw(rw),
intrinseca 0:006bcd28cc39 28 _e(e), _d(d0, d1, d2, d3), _type(type) {
intrinseca 0:006bcd28cc39 29 _rs = 0; // command mode
intrinseca 0:006bcd28cc39 30 _rw = 0;
intrinseca 0:006bcd28cc39 31 _e = 0;
intrinseca 0:006bcd28cc39 32 _d.output(); // data out
intrinseca 0:006bcd28cc39 33
intrinseca 0:006bcd28cc39 34 wait(0.05); // Wait 50ms to ensure powered up
intrinseca 0:006bcd28cc39 35
intrinseca 0:006bcd28cc39 36 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
intrinseca 0:006bcd28cc39 37 for (int i=0; i<3; i++) {
intrinseca 0:006bcd28cc39 38 _e = 1;
intrinseca 0:006bcd28cc39 39 __nop();
intrinseca 0:006bcd28cc39 40 _d = 0x3;
intrinseca 0:006bcd28cc39 41 __nop();
intrinseca 0:006bcd28cc39 42 _e = 0;
intrinseca 0:006bcd28cc39 43 wait(0.004f); // 4ms
intrinseca 0:006bcd28cc39 44 }
intrinseca 0:006bcd28cc39 45 _e = 1;
intrinseca 0:006bcd28cc39 46 __nop();
intrinseca 0:006bcd28cc39 47 _d = 0x2; // 4 Bit mode
intrinseca 0:006bcd28cc39 48 __nop();
intrinseca 0:006bcd28cc39 49 _e = 0;
intrinseca 0:006bcd28cc39 50
intrinseca 0:006bcd28cc39 51 writeCommand(0x28); // Function set 4 Bit, 2Line, 5*7
intrinseca 0:006bcd28cc39 52 writeCommand(0x08); // Display off
intrinseca 0:006bcd28cc39 53 writeCommand(0x01); // clear Display
intrinseca 0:006bcd28cc39 54 writeCommand(0x04); // cursor right, Display is not shifted
intrinseca 0:006bcd28cc39 55 writeCommand(0x0C); // Display on , Cursor off
intrinseca 0:006bcd28cc39 56 }
intrinseca 0:006bcd28cc39 57
intrinseca 0:006bcd28cc39 58 void TextLCD::character(int column, int row, int c) {
intrinseca 0:006bcd28cc39 59 int a = address(column, row);
intrinseca 0:006bcd28cc39 60 writeCommand(a);
intrinseca 0:006bcd28cc39 61 writeData(c);
intrinseca 0:006bcd28cc39 62 }
intrinseca 0:006bcd28cc39 63
intrinseca 0:006bcd28cc39 64 void TextLCD::cls() {
intrinseca 0:006bcd28cc39 65 writeCommand(0x01); // cls, and set cursor to 0
intrinseca 0:006bcd28cc39 66 locate(0, 0);
intrinseca 0:006bcd28cc39 67 }
intrinseca 0:006bcd28cc39 68
intrinseca 0:006bcd28cc39 69 void TextLCD::locate(int column, int row) {
intrinseca 0:006bcd28cc39 70 _column = column;
intrinseca 0:006bcd28cc39 71 _row = row;
intrinseca 0:006bcd28cc39 72 }
intrinseca 0:006bcd28cc39 73
intrinseca 0:006bcd28cc39 74
intrinseca 0:006bcd28cc39 75
intrinseca 0:006bcd28cc39 76 int TextLCD::_putc(int value) {
intrinseca 0:006bcd28cc39 77 if (value == '\n') {
intrinseca 0:006bcd28cc39 78 _column = 0;
intrinseca 0:006bcd28cc39 79 _row++;
intrinseca 0:006bcd28cc39 80 if (_row >= rows()) {
intrinseca 0:006bcd28cc39 81 _row = 0;
intrinseca 0:006bcd28cc39 82 }
intrinseca 0:006bcd28cc39 83 } else {
intrinseca 0:006bcd28cc39 84 character(_column, _row, value);
intrinseca 0:006bcd28cc39 85 _column++;
intrinseca 0:006bcd28cc39 86 if (_column >= columns()) {
intrinseca 0:006bcd28cc39 87 _column = 0;
intrinseca 0:006bcd28cc39 88 _row++;
intrinseca 0:006bcd28cc39 89 if (_row >= rows()) {
intrinseca 0:006bcd28cc39 90 _row = 0;
intrinseca 0:006bcd28cc39 91 }
intrinseca 0:006bcd28cc39 92 }
intrinseca 0:006bcd28cc39 93 }
intrinseca 0:006bcd28cc39 94 return value;
intrinseca 0:006bcd28cc39 95 }
intrinseca 0:006bcd28cc39 96
intrinseca 0:006bcd28cc39 97 int TextLCD::_getc() {
intrinseca 0:006bcd28cc39 98 int a = address(_column, _row);
intrinseca 0:006bcd28cc39 99 writeCommand(a);
intrinseca 0:006bcd28cc39 100 return (readData());
intrinseca 0:006bcd28cc39 101 }
intrinseca 0:006bcd28cc39 102
intrinseca 0:006bcd28cc39 103 void TextLCD::writeByte(int value) {
intrinseca 0:006bcd28cc39 104 _e = 1;
intrinseca 0:006bcd28cc39 105 __nop();
intrinseca 0:006bcd28cc39 106 _d = value >> 4;
intrinseca 0:006bcd28cc39 107 __nop();
intrinseca 0:006bcd28cc39 108 _e = 0;
intrinseca 0:006bcd28cc39 109 __nop();
intrinseca 0:006bcd28cc39 110 _e = 1;
intrinseca 0:006bcd28cc39 111 __nop();
intrinseca 0:006bcd28cc39 112 _d = value >> 0;
intrinseca 0:006bcd28cc39 113 __nop();
intrinseca 0:006bcd28cc39 114 _e = 0;
intrinseca 0:006bcd28cc39 115 }
intrinseca 0:006bcd28cc39 116
intrinseca 0:006bcd28cc39 117 void TextLCD::writeCommand(int command) {
intrinseca 0:006bcd28cc39 118 waitBusy(); // check if display is ready
intrinseca 0:006bcd28cc39 119 _rs = 0;
intrinseca 0:006bcd28cc39 120 writeByte(command);
intrinseca 0:006bcd28cc39 121 }
intrinseca 0:006bcd28cc39 122
intrinseca 0:006bcd28cc39 123 int TextLCD::readData(){
intrinseca 0:006bcd28cc39 124 int input;
intrinseca 0:006bcd28cc39 125 waitBusy();
intrinseca 0:006bcd28cc39 126 _rw = 1;
intrinseca 0:006bcd28cc39 127 _rs = 1;
intrinseca 0:006bcd28cc39 128 __nop();
intrinseca 0:006bcd28cc39 129 _d.input(); // switch Data port to input
intrinseca 0:006bcd28cc39 130 _e = 1;
intrinseca 0:006bcd28cc39 131 __nop();
intrinseca 0:006bcd28cc39 132 input = _d.read() << 4; // high nibble
intrinseca 0:006bcd28cc39 133 _e = 0;
intrinseca 0:006bcd28cc39 134 __nop();
intrinseca 0:006bcd28cc39 135 _e = 1;
intrinseca 0:006bcd28cc39 136 __nop();
intrinseca 0:006bcd28cc39 137 input = input | _d.read(); // low nibble
intrinseca 0:006bcd28cc39 138 _e = 0;
intrinseca 0:006bcd28cc39 139 return (input);
intrinseca 0:006bcd28cc39 140 }
intrinseca 0:006bcd28cc39 141
intrinseca 0:006bcd28cc39 142 void TextLCD::waitBusy(){
intrinseca 0:006bcd28cc39 143 int input;
intrinseca 0:006bcd28cc39 144 _rw = 1;
intrinseca 0:006bcd28cc39 145 _rs = 0;
intrinseca 0:006bcd28cc39 146 __nop();
intrinseca 0:006bcd28cc39 147 _d.input(); // switch Data port to input
intrinseca 0:006bcd28cc39 148 do{
intrinseca 0:006bcd28cc39 149 _e = 1;
intrinseca 0:006bcd28cc39 150 __nop();
intrinseca 0:006bcd28cc39 151 input = _d.read();
intrinseca 0:006bcd28cc39 152 _e = 0;
intrinseca 0:006bcd28cc39 153 __nop();
intrinseca 0:006bcd28cc39 154 _e = 1;
intrinseca 0:006bcd28cc39 155 __nop();
intrinseca 0:006bcd28cc39 156 _e = 0;
intrinseca 0:006bcd28cc39 157 }while((0x8 & input) == 0x8); // wait until display is ready
intrinseca 0:006bcd28cc39 158 _rw = 0;
intrinseca 0:006bcd28cc39 159 _d.output(); // switch port back to output
intrinseca 0:006bcd28cc39 160 }
intrinseca 0:006bcd28cc39 161
intrinseca 0:006bcd28cc39 162 void TextLCD::writeData(int data) {
intrinseca 0:006bcd28cc39 163 waitBusy();
intrinseca 0:006bcd28cc39 164 _rs = 1;
intrinseca 0:006bcd28cc39 165 writeByte(data);
intrinseca 0:006bcd28cc39 166 }
intrinseca 0:006bcd28cc39 167
intrinseca 0:006bcd28cc39 168
intrinseca 0:006bcd28cc39 169 // set user defined char
intrinseca 0:006bcd28cc39 170 void TextLCD::writeCGRAM(int address, int pattern[8]){
intrinseca 0:006bcd28cc39 171 int i;
intrinseca 0:006bcd28cc39 172 address = address & 0x07; //max 8 char
intrinseca 0:006bcd28cc39 173 for(i=0;i<8;i++){
intrinseca 0:006bcd28cc39 174 waitBusy(); // check if display is ready
intrinseca 0:006bcd28cc39 175 _rs = 0;
intrinseca 0:006bcd28cc39 176 writeByte(0x40 + address * 8 + i);
intrinseca 0:006bcd28cc39 177 writeData(pattern[i]);
intrinseca 0:006bcd28cc39 178 }
intrinseca 0:006bcd28cc39 179 }
intrinseca 0:006bcd28cc39 180
intrinseca 0:006bcd28cc39 181
intrinseca 0:006bcd28cc39 182 int TextLCD::address(int column, int row) {
intrinseca 0:006bcd28cc39 183 switch (_type) {
intrinseca 0:006bcd28cc39 184 case LCD20x4:
intrinseca 0:006bcd28cc39 185 switch (row) {
intrinseca 0:006bcd28cc39 186 case 0:
intrinseca 0:006bcd28cc39 187 return 0x80 + column;
intrinseca 0:006bcd28cc39 188 case 1:
intrinseca 0:006bcd28cc39 189 return 0xc0 + column;
intrinseca 0:006bcd28cc39 190 case 2:
intrinseca 0:006bcd28cc39 191 return 0x94 + column;
intrinseca 0:006bcd28cc39 192 case 3:
intrinseca 0:006bcd28cc39 193 return 0xd4 + column;
intrinseca 0:006bcd28cc39 194 }
intrinseca 0:006bcd28cc39 195 case LCD16x2B:
intrinseca 0:006bcd28cc39 196 return 0x80 + (row * 40) + column;
intrinseca 0:006bcd28cc39 197 case LCD16x2:
intrinseca 0:006bcd28cc39 198 case LCD20x2:
intrinseca 0:006bcd28cc39 199 default:
intrinseca 0:006bcd28cc39 200 return 0x80 + (row * 0x40) + column;
intrinseca 0:006bcd28cc39 201 }
intrinseca 0:006bcd28cc39 202 }
intrinseca 0:006bcd28cc39 203
intrinseca 0:006bcd28cc39 204 int TextLCD::columns() {
intrinseca 0:006bcd28cc39 205 switch (_type) {
intrinseca 0:006bcd28cc39 206 case LCD20x4:
intrinseca 0:006bcd28cc39 207 case LCD20x2:
intrinseca 0:006bcd28cc39 208 return 20;
intrinseca 0:006bcd28cc39 209 case LCD16x2:
intrinseca 0:006bcd28cc39 210 case LCD16x2B:
intrinseca 0:006bcd28cc39 211 default:
intrinseca 0:006bcd28cc39 212 return 16;
intrinseca 0:006bcd28cc39 213 }
intrinseca 0:006bcd28cc39 214 }
intrinseca 0:006bcd28cc39 215
intrinseca 0:006bcd28cc39 216 int TextLCD::rows() {
intrinseca 0:006bcd28cc39 217 switch (_type) {
intrinseca 0:006bcd28cc39 218 case LCD20x4:
intrinseca 0:006bcd28cc39 219 return 4;
intrinseca 0:006bcd28cc39 220 case LCD16x2:
intrinseca 0:006bcd28cc39 221 case LCD16x2B:
intrinseca 0:006bcd28cc39 222 case LCD20x2:
intrinseca 0:006bcd28cc39 223 default:
intrinseca 0:006bcd28cc39 224 return 2;
intrinseca 0:006bcd28cc39 225 }
intrinseca 0:006bcd28cc39 226 }