Connect HD44780 LCD display to mbed (4-Bit mode). Changes to make PCF2116 work.

Dependents:   tuner Base_Hybrid_V3 Base_Hybrid_V2 base_rekam_darurat_v1 ... more

Committer:
erik_kedo
Date:
Mon Mar 28 09:09:21 2011 +0000
Revision:
1:fb402d95983d
Parent:
0:9bdcc985b306
0.91

Who changed what in which revision?

UserRevisionLine numberNew contents of line
erik_kedo 0:9bdcc985b306 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
erik_kedo 0:9bdcc985b306 2 * Copyright (c) 2007-2010, sford, http://mbed.org
erik_kedo 0:9bdcc985b306 3 * Changes by Erik Kerger
erik_kedo 0:9bdcc985b306 4 *
erik_kedo 0:9bdcc985b306 5 *
erik_kedo 0:9bdcc985b306 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
erik_kedo 0:9bdcc985b306 7 * of this software and associated documentation files (the "Software"), to deal
erik_kedo 0:9bdcc985b306 8 * in the Software without restriction, including without limitation the rights
erik_kedo 0:9bdcc985b306 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
erik_kedo 0:9bdcc985b306 10 * copies of the Software, and to permit persons to whom the Software is
erik_kedo 0:9bdcc985b306 11 * furnished to do so, subject to the following conditions:
erik_kedo 0:9bdcc985b306 12 *
erik_kedo 0:9bdcc985b306 13 * The above copyright notice and this permission notice shall be included in
erik_kedo 0:9bdcc985b306 14 * all copies or substantial portions of the Software.
erik_kedo 0:9bdcc985b306 15 *
erik_kedo 0:9bdcc985b306 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
erik_kedo 0:9bdcc985b306 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
erik_kedo 0:9bdcc985b306 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
erik_kedo 0:9bdcc985b306 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
erik_kedo 0:9bdcc985b306 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
erik_kedo 0:9bdcc985b306 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
erik_kedo 0:9bdcc985b306 22 * THE SOFTWARE.
erik_kedo 0:9bdcc985b306 23 */
erik_kedo 0:9bdcc985b306 24
erik_kedo 0:9bdcc985b306 25 #include "NewTextLCD.h"
erik_kedo 0:9bdcc985b306 26 #include "mbed.h"
erik_kedo 0:9bdcc985b306 27
erik_kedo 0:9bdcc985b306 28 TextLCD::TextLCD(PinName rs,PinName e, PinName d4, PinName d5,
erik_kedo 0:9bdcc985b306 29 PinName d6, PinName d7, LCDType type) : _rs(rs), _e(e),
erik_kedo 0:9bdcc985b306 30 _d(d4, d5, d6, d7), _type(type) {
erik_kedo 0:9bdcc985b306 31 _rs = 0; // command mode
erik_kedo 0:9bdcc985b306 32 _e = 0; // 0 --> inactive (most important change to original TextLCD)
erik_kedo 0:9bdcc985b306 33
erik_kedo 0:9bdcc985b306 34 if (_type != LCDuser)
erik_kedo 0:9bdcc985b306 35 setLCDparam(_type); // otherwise rows, colums, comdelay, adresses must be set before
erik_kedo 0:9bdcc985b306 36
erik_kedo 0:9bdcc985b306 37 wait(0.050f); // Wait 50ms to ensure powered up
erik_kedo 0:9bdcc985b306 38
erik_kedo 0:9bdcc985b306 39 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
erik_kedo 0:9bdcc985b306 40 // this sets controler into 8 bit mode, so we have a defined state
erik_kedo 0:9bdcc985b306 41 for (int i=0; i<3; i++) {
erik_kedo 0:9bdcc985b306 42 _e = 1;
erik_kedo 0:9bdcc985b306 43 __nop();
erik_kedo 1:fb402d95983d 44 __nop();
erik_kedo 0:9bdcc985b306 45 _d = 0x3;
erik_kedo 0:9bdcc985b306 46 __nop(); // data setup time at least 60 ns
erik_kedo 0:9bdcc985b306 47 _e = 0;
erik_kedo 0:9bdcc985b306 48 wait(0.005f); // 5ms
erik_kedo 0:9bdcc985b306 49 }
erik_kedo 0:9bdcc985b306 50 _e = 1;
erik_kedo 0:9bdcc985b306 51 __nop();
erik_kedo 1:fb402d95983d 52 __nop();
erik_kedo 0:9bdcc985b306 53 _d = 0x2; // 4 Bit mode (after this command, we have to send 2 nibbles)
erik_kedo 0:9bdcc985b306 54 __nop();
erik_kedo 0:9bdcc985b306 55 _e = 0;
erik_kedo 0:9bdcc985b306 56 wait_us(LCDparam.delay);
erik_kedo 0:9bdcc985b306 57
erik_kedo 0:9bdcc985b306 58 writeCommand(0x28); // Function set 4 Bit, 2Line, 5*7
erik_kedo 0:9bdcc985b306 59 writeCommand(0x08); // Display off
erik_kedo 0:9bdcc985b306 60 cls(); // clear display, reset _column and _row
erik_kedo 0:9bdcc985b306 61 writeCommand(0x04); // cursor right, Display is not shifted
erik_kedo 0:9bdcc985b306 62 writeCommand(0x0C); // Display on , Cursor off
erik_kedo 0:9bdcc985b306 63 }
erik_kedo 0:9bdcc985b306 64
erik_kedo 0:9bdcc985b306 65 void TextLCD::character(int column, int row, int c) {
erik_kedo 0:9bdcc985b306 66 int a = 0x80 | (LCDparam.adresses[row & 3] + column);
erik_kedo 0:9bdcc985b306 67 writeCommand(a); // set cursor address
erik_kedo 0:9bdcc985b306 68 writeData(c); // write char
erik_kedo 0:9bdcc985b306 69 }
erik_kedo 0:9bdcc985b306 70
erik_kedo 0:9bdcc985b306 71 void TextLCD::cls() {
erik_kedo 0:9bdcc985b306 72 writeCommand(0x01); // cls, and set cursor to 0
erik_kedo 0:9bdcc985b306 73 locate(0, 0); // set internal position
erik_kedo 0:9bdcc985b306 74 wait_us(45 * LCDparam.delay); // CLS need much time
erik_kedo 0:9bdcc985b306 75 }
erik_kedo 0:9bdcc985b306 76
erik_kedo 0:9bdcc985b306 77 void TextLCD::locate(int column, int row) {
erik_kedo 0:9bdcc985b306 78 _column = column; // set position for next char
erik_kedo 0:9bdcc985b306 79 _row = row; // note: cursor is not set yet
erik_kedo 0:9bdcc985b306 80 }
erik_kedo 0:9bdcc985b306 81
erik_kedo 0:9bdcc985b306 82
erik_kedo 0:9bdcc985b306 83
erik_kedo 0:9bdcc985b306 84 int TextLCD::_putc(int value) {
erik_kedo 0:9bdcc985b306 85 if (value == '\n') {
erik_kedo 0:9bdcc985b306 86 _column = 0;
erik_kedo 0:9bdcc985b306 87 _row++;
erik_kedo 0:9bdcc985b306 88 if (_row >= LCDparam.rows) {
erik_kedo 0:9bdcc985b306 89 _row = 0;
erik_kedo 0:9bdcc985b306 90 }
erik_kedo 0:9bdcc985b306 91 } else {
erik_kedo 0:9bdcc985b306 92 character(_column, _row, value);
erik_kedo 0:9bdcc985b306 93 _column++;
erik_kedo 0:9bdcc985b306 94 if (_column >= LCDparam.columns) {
erik_kedo 0:9bdcc985b306 95 _column = 0;
erik_kedo 0:9bdcc985b306 96 _row++;
erik_kedo 0:9bdcc985b306 97 if (_row >= LCDparam.rows) {
erik_kedo 0:9bdcc985b306 98 _row = 0;
erik_kedo 0:9bdcc985b306 99 }
erik_kedo 0:9bdcc985b306 100 }
erik_kedo 0:9bdcc985b306 101 }
erik_kedo 0:9bdcc985b306 102 return value;
erik_kedo 0:9bdcc985b306 103 }
erik_kedo 0:9bdcc985b306 104
erik_kedo 0:9bdcc985b306 105 // Dummy function - read not supported
erik_kedo 0:9bdcc985b306 106 int TextLCD::_getc() {
erik_kedo 0:9bdcc985b306 107 return -1;
erik_kedo 0:9bdcc985b306 108 }
erik_kedo 0:9bdcc985b306 109
erik_kedo 0:9bdcc985b306 110 void TextLCD::writeByte(int value) {
erik_kedo 0:9bdcc985b306 111 _e = 1;
erik_kedo 0:9bdcc985b306 112 __nop();
erik_kedo 0:9bdcc985b306 113 _d = value >> 4; // higher nibble first
erik_kedo 0:9bdcc985b306 114 __nop();
erik_kedo 0:9bdcc985b306 115 _e = 0;
erik_kedo 0:9bdcc985b306 116 __nop();
erik_kedo 1:fb402d95983d 117 __nop();
erik_kedo 0:9bdcc985b306 118 _e = 1;
erik_kedo 0:9bdcc985b306 119 __nop();
erik_kedo 0:9bdcc985b306 120 _d = value >> 0; // then lower
erik_kedo 0:9bdcc985b306 121 __nop();
erik_kedo 0:9bdcc985b306 122 _e = 0;
erik_kedo 0:9bdcc985b306 123 }
erik_kedo 0:9bdcc985b306 124
erik_kedo 0:9bdcc985b306 125 void TextLCD::writeCommand(int command) {
erik_kedo 0:9bdcc985b306 126 _rs = 0;
erik_kedo 0:9bdcc985b306 127 writeByte(command);
erik_kedo 0:9bdcc985b306 128 wait_us(LCDparam.delay);
erik_kedo 0:9bdcc985b306 129 }
erik_kedo 0:9bdcc985b306 130
erik_kedo 0:9bdcc985b306 131
erik_kedo 0:9bdcc985b306 132 void TextLCD::writeData(int data) {
erik_kedo 0:9bdcc985b306 133 _rs = 1;
erik_kedo 0:9bdcc985b306 134 writeByte(data);
erik_kedo 0:9bdcc985b306 135 wait_us(LCDparam.delay);
erik_kedo 0:9bdcc985b306 136 }
erik_kedo 0:9bdcc985b306 137
erik_kedo 0:9bdcc985b306 138
erik_kedo 0:9bdcc985b306 139 // set user defined char
erik_kedo 0:9bdcc985b306 140 void TextLCD::writeCGRAM(int address, int pattern[8]){
erik_kedo 0:9bdcc985b306 141 int i;
erik_kedo 0:9bdcc985b306 142 address = address & 7; //max 8 char
erik_kedo 0:9bdcc985b306 143 for(i=0;i<8;i++){
erik_kedo 0:9bdcc985b306 144 writeCommand(0x40 | (address * 8) + i);
erik_kedo 0:9bdcc985b306 145 writeData(pattern[i]);
erik_kedo 0:9bdcc985b306 146 }
erik_kedo 0:9bdcc985b306 147 }
erik_kedo 0:9bdcc985b306 148
erik_kedo 0:9bdcc985b306 149 void TextLCD::setLCDparam(LCDType _type){
erik_kedo 0:9bdcc985b306 150 switch (_type) {
erik_kedo 0:9bdcc985b306 151
erik_kedo 0:9bdcc985b306 152 case LCD16x2:
erik_kedo 0:9bdcc985b306 153 case LCD16x2B:
erik_kedo 0:9bdcc985b306 154 LCDparam.columns = 16;
erik_kedo 0:9bdcc985b306 155 break;
erik_kedo 0:9bdcc985b306 156 case LCD20x2:
erik_kedo 0:9bdcc985b306 157 case LCD20x4:
erik_kedo 0:9bdcc985b306 158 LCDparam.columns = 20;
erik_kedo 0:9bdcc985b306 159 break;
erik_kedo 0:9bdcc985b306 160 case LCD24x2:
erik_kedo 0:9bdcc985b306 161 LCDparam.columns = 24;
erik_kedo 0:9bdcc985b306 162 break;
erik_kedo 0:9bdcc985b306 163 }
erik_kedo 0:9bdcc985b306 164 if (_type == LCD20x4)
erik_kedo 0:9bdcc985b306 165 LCDparam.rows = 4;
erik_kedo 0:9bdcc985b306 166 else
erik_kedo 0:9bdcc985b306 167 LCDparam.rows = 2;
erik_kedo 0:9bdcc985b306 168
erik_kedo 0:9bdcc985b306 169 LCDparam.adresses[0] = 0;
erik_kedo 0:9bdcc985b306 170
erik_kedo 0:9bdcc985b306 171 if (_type == LCD16x2B)
erik_kedo 0:9bdcc985b306 172 LCDparam.adresses[1] = 40;
erik_kedo 0:9bdcc985b306 173 else
erik_kedo 0:9bdcc985b306 174 LCDparam.adresses[1] = 0x40;
erik_kedo 0:9bdcc985b306 175
erik_kedo 0:9bdcc985b306 176 if (_type == LCD20x4) {
erik_kedo 0:9bdcc985b306 177 LCDparam.adresses[2] = 0x14;
erik_kedo 0:9bdcc985b306 178 LCDparam.adresses[3] = 0x54;}
erik_kedo 0:9bdcc985b306 179 else {
erik_kedo 0:9bdcc985b306 180 LCDparam.adresses[2] = 0;
erik_kedo 0:9bdcc985b306 181 LCDparam.adresses[3] = 0;}
erik_kedo 0:9bdcc985b306 182
erik_kedo 0:9bdcc985b306 183 LCDparam.delay = 50; // 50 us delays as default
erik_kedo 0:9bdcc985b306 184 }
erik_kedo 0:9bdcc985b306 185