asdasdasd

Dependencies:   mbed

Fork of FINAL_PROJECT_4180 by Gedeon Nyengele

Committer:
xemnas214
Date:
Wed Nov 23 01:07:10 2016 +0000
Revision:
14:ca57ad53761b
Parent:
12:5cb9ffad1ad7
iotlockkkk;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyengele 12:5cb9ffad1ad7 1 /**
nyengele 12:5cb9ffad1ad7 2 * Driver for LCD devices based on the HD44780 controller
nyengele 12:5cb9ffad1ad7 3 */
nyengele 12:5cb9ffad1ad7 4
nyengele 12:5cb9ffad1ad7 5 /* Description
nyengele 12:5cb9ffad1ad7 6
nyengele 12:5cb9ffad1ad7 7 LCD SIZES SUPPORTED:
nyengele 12:5cb9ffad1ad7 8 1-line displays: 8x1, 16x1, 20x1, 24x1, 32x1, 40x1
nyengele 12:5cb9ffad1ad7 9 2-line displays: 16x2, 20x2, 24x2, 32x2, 40x2
nyengele 12:5cb9ffad1ad7 10 4-line displays: 16x4, 20x4, 40x4
nyengele 12:5cb9ffad1ad7 11
nyengele 12:5cb9ffad1ad7 12 SUPPORTED PLATFORM: mbed
nyengele 12:5cb9ffad1ad7 13 */
nyengele 12:5cb9ffad1ad7 14
nyengele 12:5cb9ffad1ad7 15
nyengele 12:5cb9ffad1ad7 16 #include "cryst_lcd.h"
nyengele 12:5cb9ffad1ad7 17
nyengele 12:5cb9ffad1ad7 18 Cryst_LCD::Cryst_LCD(PinName rs, PinName en, PinName db4, PinName db5,
nyengele 12:5cb9ffad1ad7 19 PinName db6, PinName db7, LCDSize size)
nyengele 12:5cb9ffad1ad7 20 : _rs(rs), _en(en), _data(db4, db5, db6, db7)
nyengele 12:5cb9ffad1ad7 21 {
nyengele 12:5cb9ffad1ad7 22 _size = size;
nyengele 12:5cb9ffad1ad7 23 _row = 0;
nyengele 12:5cb9ffad1ad7 24 _col = 0;
nyengele 12:5cb9ffad1ad7 25 _displayStatus = 0x0C;
nyengele 12:5cb9ffad1ad7 26 init();
nyengele 12:5cb9ffad1ad7 27 }
nyengele 12:5cb9ffad1ad7 28
nyengele 12:5cb9ffad1ad7 29
nyengele 12:5cb9ffad1ad7 30 void Cryst_LCD::cls()
nyengele 12:5cb9ffad1ad7 31 {
nyengele 12:5cb9ffad1ad7 32 writeCommand(0x01, false);
nyengele 12:5cb9ffad1ad7 33 wait_ms(2);
nyengele 12:5cb9ffad1ad7 34 locate(0, 0);
nyengele 12:5cb9ffad1ad7 35 }
nyengele 12:5cb9ffad1ad7 36
nyengele 12:5cb9ffad1ad7 37 void Cryst_LCD::locate(int row, int col)
nyengele 12:5cb9ffad1ad7 38 {
nyengele 12:5cb9ffad1ad7 39 _row = 0;
nyengele 12:5cb9ffad1ad7 40 _col = col;
nyengele 12:5cb9ffad1ad7 41
nyengele 12:5cb9ffad1ad7 42 if (row < getMaxRows()) {
nyengele 12:5cb9ffad1ad7 43 _row = row;
nyengele 12:5cb9ffad1ad7 44 }
nyengele 12:5cb9ffad1ad7 45
nyengele 12:5cb9ffad1ad7 46 if (_col >= getMaxCols()) {
nyengele 12:5cb9ffad1ad7 47 _col = 0;
nyengele 12:5cb9ffad1ad7 48 if (_row < getMaxRows() - 1)
nyengele 12:5cb9ffad1ad7 49 _row++;
nyengele 12:5cb9ffad1ad7 50 else _row = 0;
nyengele 12:5cb9ffad1ad7 51 }
nyengele 12:5cb9ffad1ad7 52
nyengele 12:5cb9ffad1ad7 53 int addr = getAddress(_row, _col);
nyengele 12:5cb9ffad1ad7 54 addr |= 0x80;
nyengele 12:5cb9ffad1ad7 55 writeCommand(addr);
nyengele 12:5cb9ffad1ad7 56 }
nyengele 12:5cb9ffad1ad7 57
nyengele 12:5cb9ffad1ad7 58 void Cryst_LCD::display_off() {
nyengele 12:5cb9ffad1ad7 59 _displayStatus &= 0x0B;
nyengele 12:5cb9ffad1ad7 60 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 61 }
nyengele 12:5cb9ffad1ad7 62
nyengele 12:5cb9ffad1ad7 63 void Cryst_LCD::display_on() {
nyengele 12:5cb9ffad1ad7 64 _displayStatus |= 0x04;
nyengele 12:5cb9ffad1ad7 65 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 66 }
nyengele 12:5cb9ffad1ad7 67
nyengele 12:5cb9ffad1ad7 68 void Cryst_LCD::cursor_on() {
nyengele 12:5cb9ffad1ad7 69 _displayStatus |= 0x02;
nyengele 12:5cb9ffad1ad7 70 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 71 }
nyengele 12:5cb9ffad1ad7 72
nyengele 12:5cb9ffad1ad7 73 void Cryst_LCD::cursor_off() {
nyengele 12:5cb9ffad1ad7 74 _displayStatus &= 0x0D;
nyengele 12:5cb9ffad1ad7 75 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 76 }
nyengele 12:5cb9ffad1ad7 77
nyengele 12:5cb9ffad1ad7 78 void Cryst_LCD::cursor_blink() {
nyengele 12:5cb9ffad1ad7 79 _displayStatus |= 0x01;
nyengele 12:5cb9ffad1ad7 80 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 81 }
nyengele 12:5cb9ffad1ad7 82
nyengele 12:5cb9ffad1ad7 83 void Cryst_LCD::cursor_no_blink() {
nyengele 12:5cb9ffad1ad7 84 _displayStatus &= 0x0E;
nyengele 12:5cb9ffad1ad7 85 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 86 }
nyengele 12:5cb9ffad1ad7 87
nyengele 12:5cb9ffad1ad7 88 void Cryst_LCD::clear_line() {
nyengele 12:5cb9ffad1ad7 89 int lineWidth = getMaxCols();
nyengele 12:5cb9ffad1ad7 90
nyengele 12:5cb9ffad1ad7 91 for (int i = 0; i < lineWidth - 1; i++) {
nyengele 12:5cb9ffad1ad7 92 locate(_row, i);
nyengele 12:5cb9ffad1ad7 93 printf(" ");
nyengele 12:5cb9ffad1ad7 94 }
nyengele 12:5cb9ffad1ad7 95
nyengele 12:5cb9ffad1ad7 96 locate(_row, 0);
nyengele 12:5cb9ffad1ad7 97 }
nyengele 12:5cb9ffad1ad7 98
nyengele 12:5cb9ffad1ad7 99 void Cryst_LCD::reset()
nyengele 12:5cb9ffad1ad7 100 {
nyengele 12:5cb9ffad1ad7 101 _rs = 0;
nyengele 12:5cb9ffad1ad7 102 wait_ms(15); // wait approximately 15 ms
nyengele 12:5cb9ffad1ad7 103 writeNibble(0x3); // write config data
nyengele 12:5cb9ffad1ad7 104 wait_ms(5); // wait approximately 4.1 ms
nyengele 12:5cb9ffad1ad7 105 writeNibble(0x3); // write config data again
nyengele 12:5cb9ffad1ad7 106 wait_us(100); // wait approximately 100 us
nyengele 12:5cb9ffad1ad7 107 }
nyengele 12:5cb9ffad1ad7 108
nyengele 12:5cb9ffad1ad7 109 void Cryst_LCD::init()
nyengele 12:5cb9ffad1ad7 110 {
nyengele 12:5cb9ffad1ad7 111 reset();
nyengele 12:5cb9ffad1ad7 112
nyengele 12:5cb9ffad1ad7 113 // Function set
nyengele 12:5cb9ffad1ad7 114 if (getMaxRows() <= 1) { // 1-line display
nyengele 12:5cb9ffad1ad7 115 // (DF = 0, N = 0, F = 0)
nyengele 12:5cb9ffad1ad7 116 // 4-bit mode, 1-line display, 5x8 font size
nyengele 12:5cb9ffad1ad7 117 writeCommand(0x20);
nyengele 12:5cb9ffad1ad7 118 } else { // Multi-line display
nyengele 12:5cb9ffad1ad7 119 // (DF = 0, N = 1, F = 0)
nyengele 12:5cb9ffad1ad7 120 // 4-bit mode, 2-line display, 5x8 font size
nyengele 12:5cb9ffad1ad7 121 writeCommand(0x28);
nyengele 12:5cb9ffad1ad7 122 }
nyengele 12:5cb9ffad1ad7 123
nyengele 12:5cb9ffad1ad7 124 // Entry Mode
nyengele 12:5cb9ffad1ad7 125 // (I/D = 1, S = 0)
nyengele 12:5cb9ffad1ad7 126 // DDRAM autoincrement, No display shifts
nyengele 12:5cb9ffad1ad7 127 writeCommand(0x06);
nyengele 12:5cb9ffad1ad7 128
nyengele 12:5cb9ffad1ad7 129 // Display Control
nyengele 12:5cb9ffad1ad7 130 // (D = 1, C = 0, B = 0)
nyengele 12:5cb9ffad1ad7 131 // Display ON, cursor OFF, No cursor blinking
nyengele 12:5cb9ffad1ad7 132 writeCommand(_displayStatus);
nyengele 12:5cb9ffad1ad7 133
nyengele 12:5cb9ffad1ad7 134 // Clear Display
nyengele 12:5cb9ffad1ad7 135 cls();
nyengele 12:5cb9ffad1ad7 136 }
nyengele 12:5cb9ffad1ad7 137
nyengele 12:5cb9ffad1ad7 138 int Cryst_LCD::getAddress(int row, int col)
nyengele 12:5cb9ffad1ad7 139 {
nyengele 12:5cb9ffad1ad7 140 int rowStartAddr[4] = {0x00, 0x40, 0x14, 0x54};
nyengele 12:5cb9ffad1ad7 141 int tempRow = 0, tempCol = 0;
nyengele 12:5cb9ffad1ad7 142 if (row < getMaxRows()) tempRow = row;
nyengele 12:5cb9ffad1ad7 143 if (col < getMaxCols()) tempCol = col;
nyengele 12:5cb9ffad1ad7 144 return rowStartAddr[tempRow] + tempCol;
nyengele 12:5cb9ffad1ad7 145 }
nyengele 12:5cb9ffad1ad7 146
nyengele 12:5cb9ffad1ad7 147 // Default wait time is 40 us
nyengele 12:5cb9ffad1ad7 148 void Cryst_LCD::writeData(int ch, bool use_default_timing)
nyengele 12:5cb9ffad1ad7 149 {
nyengele 12:5cb9ffad1ad7 150 _rs = 1;
nyengele 12:5cb9ffad1ad7 151 writeNibble((ch >> 4) & 0x0F);
nyengele 12:5cb9ffad1ad7 152 writeNibble(ch & 0x0F);
nyengele 12:5cb9ffad1ad7 153
nyengele 12:5cb9ffad1ad7 154 if (use_default_timing)
nyengele 12:5cb9ffad1ad7 155 wait_us(40);
nyengele 12:5cb9ffad1ad7 156 }
nyengele 12:5cb9ffad1ad7 157
nyengele 12:5cb9ffad1ad7 158 // Default wait time is 40 us
nyengele 12:5cb9ffad1ad7 159 void Cryst_LCD::writeCommand(int cmd, bool use_default_timing)
nyengele 12:5cb9ffad1ad7 160 {
nyengele 12:5cb9ffad1ad7 161 _rs = 0;
nyengele 12:5cb9ffad1ad7 162 writeNibble((cmd >> 4) & 0x0F);
nyengele 12:5cb9ffad1ad7 163 writeNibble(cmd & 0x0F);
nyengele 12:5cb9ffad1ad7 164
nyengele 12:5cb9ffad1ad7 165 if (use_default_timing)
nyengele 12:5cb9ffad1ad7 166 wait_us(40);
nyengele 12:5cb9ffad1ad7 167 }
nyengele 12:5cb9ffad1ad7 168
nyengele 12:5cb9ffad1ad7 169 void Cryst_LCD::writeNibble(int nib)
nyengele 12:5cb9ffad1ad7 170 {
nyengele 12:5cb9ffad1ad7 171 _data = nib & 0xF;
nyengele 12:5cb9ffad1ad7 172 wait_us(1);
nyengele 12:5cb9ffad1ad7 173 _en = 1;
nyengele 12:5cb9ffad1ad7 174 wait_us(1);
nyengele 12:5cb9ffad1ad7 175 _en = 0;
nyengele 12:5cb9ffad1ad7 176 wait_us(1);
nyengele 12:5cb9ffad1ad7 177 }
nyengele 12:5cb9ffad1ad7 178
nyengele 12:5cb9ffad1ad7 179 void Cryst_LCD::getMaxDimensions(int* rowCount, int* colCount) {
nyengele 12:5cb9ffad1ad7 180 switch(_size) {
nyengele 12:5cb9ffad1ad7 181 // 1-line displays
nyengele 12:5cb9ffad1ad7 182 case LCD8x1: *rowCount = 1; *colCount = 8; break;
nyengele 12:5cb9ffad1ad7 183 case LCD16x1: *rowCount = 1; *colCount = 16; break;
nyengele 12:5cb9ffad1ad7 184 case LCD20x1: *rowCount = 1; *colCount = 20; break;
nyengele 12:5cb9ffad1ad7 185 case LCD24x1: *rowCount = 1; *colCount = 24; break;
nyengele 12:5cb9ffad1ad7 186 case LCD32x1: *rowCount = 1; *colCount = 32; break;
nyengele 12:5cb9ffad1ad7 187 case LCD40x1: *rowCount = 1; *colCount = 40; break;
nyengele 12:5cb9ffad1ad7 188
nyengele 12:5cb9ffad1ad7 189 // 2-line displays
nyengele 12:5cb9ffad1ad7 190 case LCD16x2: *rowCount = 2; *colCount = 16; break;
nyengele 12:5cb9ffad1ad7 191 case LCD20x2: *rowCount = 2; *colCount = 20; break;
nyengele 12:5cb9ffad1ad7 192 case LCD24x2: *rowCount = 2; *colCount = 24; break;
nyengele 12:5cb9ffad1ad7 193 case LCD32x2: *rowCount = 2; *colCount = 32; break;
nyengele 12:5cb9ffad1ad7 194 case LCD40x2: *rowCount = 2; *colCount = 40; break;
nyengele 12:5cb9ffad1ad7 195
nyengele 12:5cb9ffad1ad7 196 // 4-line displays
nyengele 12:5cb9ffad1ad7 197 case LCD16x4: *rowCount = 4; *colCount = 16; break;
nyengele 12:5cb9ffad1ad7 198 case LCD20x4: *rowCount = 4; *colCount = 20; break;
nyengele 12:5cb9ffad1ad7 199 case LCD40x4: *rowCount = 4; *colCount = 40; break;
nyengele 12:5cb9ffad1ad7 200
nyengele 12:5cb9ffad1ad7 201 default: *rowCount = 0; *colCount = 0; break;
nyengele 12:5cb9ffad1ad7 202 }
nyengele 12:5cb9ffad1ad7 203 }
nyengele 12:5cb9ffad1ad7 204
nyengele 12:5cb9ffad1ad7 205 int Cryst_LCD::getMaxRows()
nyengele 12:5cb9ffad1ad7 206 {
nyengele 12:5cb9ffad1ad7 207 int rowCount = 0;
nyengele 12:5cb9ffad1ad7 208 int colCount = 0;
nyengele 12:5cb9ffad1ad7 209 getMaxDimensions(&rowCount, &colCount);
nyengele 12:5cb9ffad1ad7 210 return rowCount;
nyengele 12:5cb9ffad1ad7 211 }
nyengele 12:5cb9ffad1ad7 212
nyengele 12:5cb9ffad1ad7 213 int Cryst_LCD::getMaxCols()
nyengele 12:5cb9ffad1ad7 214 {
nyengele 12:5cb9ffad1ad7 215 int rowCount = 0;
nyengele 12:5cb9ffad1ad7 216 int colCount = 0;
nyengele 12:5cb9ffad1ad7 217 getMaxDimensions(&rowCount, &colCount);
nyengele 12:5cb9ffad1ad7 218 return colCount;
nyengele 12:5cb9ffad1ad7 219 }
nyengele 12:5cb9ffad1ad7 220
nyengele 12:5cb9ffad1ad7 221 int Cryst_LCD::_putc(int ch)
nyengele 12:5cb9ffad1ad7 222 {
nyengele 12:5cb9ffad1ad7 223 if (ch == '\n') {
nyengele 12:5cb9ffad1ad7 224 locate(_row + 1, 0);
nyengele 12:5cb9ffad1ad7 225 }
nyengele 12:5cb9ffad1ad7 226
nyengele 12:5cb9ffad1ad7 227 else if (ch == '\t') {
nyengele 12:5cb9ffad1ad7 228 locate(_row, _col + 3);
nyengele 12:5cb9ffad1ad7 229 }
nyengele 12:5cb9ffad1ad7 230
nyengele 12:5cb9ffad1ad7 231 else if (ch == '\r') {
nyengele 12:5cb9ffad1ad7 232 locate(_row, 0);
nyengele 12:5cb9ffad1ad7 233 }
nyengele 12:5cb9ffad1ad7 234
nyengele 12:5cb9ffad1ad7 235 else {
nyengele 12:5cb9ffad1ad7 236 locate(_row, _col);
nyengele 12:5cb9ffad1ad7 237 writeData(ch);
nyengele 12:5cb9ffad1ad7 238 locate(_row, _col + 1);
nyengele 12:5cb9ffad1ad7 239 }
nyengele 12:5cb9ffad1ad7 240
nyengele 12:5cb9ffad1ad7 241 return ch;
nyengele 12:5cb9ffad1ad7 242 }
nyengele 12:5cb9ffad1ad7 243
nyengele 12:5cb9ffad1ad7 244 int Cryst_LCD::_getc()
nyengele 12:5cb9ffad1ad7 245 {
nyengele 12:5cb9ffad1ad7 246 return -5;
nyengele 12:5cb9ffad1ad7 247 }