Dependencies:   mbed

Committer:
Markus_Paar
Date:
Mon Sep 19 10:25:22 2011 +0000
Revision:
0:48870d877970

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Markus_Paar 0:48870d877970 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
Markus_Paar 0:48870d877970 2 * Copyright (c) 2007-2010, sford, http://mbed.org
Markus_Paar 0:48870d877970 3 *
Markus_Paar 0:48870d877970 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
Markus_Paar 0:48870d877970 5 * of this software and associated documentation files (the "Software"), to deal
Markus_Paar 0:48870d877970 6 * in the Software without restriction, including without limitation the rights
Markus_Paar 0:48870d877970 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Markus_Paar 0:48870d877970 8 * copies of the Software, and to permit persons to whom the Software is
Markus_Paar 0:48870d877970 9 * furnished to do so, subject to the following conditions:
Markus_Paar 0:48870d877970 10 *
Markus_Paar 0:48870d877970 11 * The above copyright notice and this permission notice shall be included in
Markus_Paar 0:48870d877970 12 * all copies or substantial portions of the Software.
Markus_Paar 0:48870d877970 13 *
Markus_Paar 0:48870d877970 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Markus_Paar 0:48870d877970 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Markus_Paar 0:48870d877970 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Markus_Paar 0:48870d877970 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Markus_Paar 0:48870d877970 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Markus_Paar 0:48870d877970 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Markus_Paar 0:48870d877970 20 * THE SOFTWARE.
Markus_Paar 0:48870d877970 21 */
Markus_Paar 0:48870d877970 22
Markus_Paar 0:48870d877970 23 #include "TextLCD.h"
Markus_Paar 0:48870d877970 24 #include "mbed.h"
Markus_Paar 0:48870d877970 25
Markus_Paar 0:48870d877970 26 TextLCD::TextLCD(PinName rs, PinName e, PinName d4, PinName d5,
Markus_Paar 0:48870d877970 27 PinName d6, PinName d7, LCDType type) : _rs(rs),
Markus_Paar 0:48870d877970 28 _e(e), _d(d4, d5, d6, d7),
Markus_Paar 0:48870d877970 29 _type(type) {
Markus_Paar 0:48870d877970 30
Markus_Paar 0:48870d877970 31 _e = 1;
Markus_Paar 0:48870d877970 32 _rs = 0; // command mode
Markus_Paar 0:48870d877970 33
Markus_Paar 0:48870d877970 34 wait(0.015); // Wait 15ms to ensure powered up
Markus_Paar 0:48870d877970 35
Markus_Paar 0:48870d877970 36 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
Markus_Paar 0:48870d877970 37 for (int i=0; i<3; i++) {
Markus_Paar 0:48870d877970 38 writeByte(0x3);
Markus_Paar 0:48870d877970 39 wait(0.00164); // this command takes 1.64ms, so wait for it
Markus_Paar 0:48870d877970 40 }
Markus_Paar 0:48870d877970 41 writeByte(0x2); // 4-bit mode
Markus_Paar 0:48870d877970 42 wait(0.000040f); // most instructions take 40us
Markus_Paar 0:48870d877970 43
Markus_Paar 0:48870d877970 44 writeCommand(0x28); // Function set 001 BW N F - -
Markus_Paar 0:48870d877970 45 writeCommand(0x0C);
Markus_Paar 0:48870d877970 46 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
Markus_Paar 0:48870d877970 47 cls();
Markus_Paar 0:48870d877970 48 }
Markus_Paar 0:48870d877970 49
Markus_Paar 0:48870d877970 50 void TextLCD::character(int column, int row, int c) {
Markus_Paar 0:48870d877970 51 int a = address(column, row);
Markus_Paar 0:48870d877970 52 writeCommand(a);
Markus_Paar 0:48870d877970 53 writeData(c);
Markus_Paar 0:48870d877970 54 }
Markus_Paar 0:48870d877970 55
Markus_Paar 0:48870d877970 56 void TextLCD::cls() {
Markus_Paar 0:48870d877970 57 writeCommand(0x01); // cls, and set cursor to 0
Markus_Paar 0:48870d877970 58 wait(0.00164f); // This command takes 1.64 ms
Markus_Paar 0:48870d877970 59 locate(0, 0);
Markus_Paar 0:48870d877970 60 }
Markus_Paar 0:48870d877970 61
Markus_Paar 0:48870d877970 62 void TextLCD::locate(int column, int row) {
Markus_Paar 0:48870d877970 63 _column = column;
Markus_Paar 0:48870d877970 64 _row = row;
Markus_Paar 0:48870d877970 65 }
Markus_Paar 0:48870d877970 66
Markus_Paar 0:48870d877970 67 int TextLCD::_putc(int value) {
Markus_Paar 0:48870d877970 68 if (value == '\n') {
Markus_Paar 0:48870d877970 69 _column = 0;
Markus_Paar 0:48870d877970 70 _row++;
Markus_Paar 0:48870d877970 71 if (_row >= rows()) {
Markus_Paar 0:48870d877970 72 _row = 0;
Markus_Paar 0:48870d877970 73 }
Markus_Paar 0:48870d877970 74 } else {
Markus_Paar 0:48870d877970 75 character(_column, _row, value);
Markus_Paar 0:48870d877970 76 _column++;
Markus_Paar 0:48870d877970 77 if (_column >= columns()) {
Markus_Paar 0:48870d877970 78 _column = 0;
Markus_Paar 0:48870d877970 79 _row++;
Markus_Paar 0:48870d877970 80 if (_row >= rows()) {
Markus_Paar 0:48870d877970 81 _row = 0;
Markus_Paar 0:48870d877970 82 }
Markus_Paar 0:48870d877970 83 }
Markus_Paar 0:48870d877970 84 }
Markus_Paar 0:48870d877970 85 return value;
Markus_Paar 0:48870d877970 86 }
Markus_Paar 0:48870d877970 87
Markus_Paar 0:48870d877970 88 int TextLCD::_getc() {
Markus_Paar 0:48870d877970 89 return -1;
Markus_Paar 0:48870d877970 90 }
Markus_Paar 0:48870d877970 91
Markus_Paar 0:48870d877970 92 void TextLCD::writeByte(int value) {
Markus_Paar 0:48870d877970 93 _d = value >> 4;
Markus_Paar 0:48870d877970 94 wait(0.000040f); // most instructions take 40us
Markus_Paar 0:48870d877970 95 _e = 0;
Markus_Paar 0:48870d877970 96 wait(0.000040f);
Markus_Paar 0:48870d877970 97 _e = 1;
Markus_Paar 0:48870d877970 98 _d = value >> 0;
Markus_Paar 0:48870d877970 99 wait(0.000040f);
Markus_Paar 0:48870d877970 100 _e = 0;
Markus_Paar 0:48870d877970 101 wait(0.000040f); // most instructions take 40us
Markus_Paar 0:48870d877970 102 _e = 1;
Markus_Paar 0:48870d877970 103 }
Markus_Paar 0:48870d877970 104
Markus_Paar 0:48870d877970 105 void TextLCD::writeCommand(int command) {
Markus_Paar 0:48870d877970 106 _rs = 0;
Markus_Paar 0:48870d877970 107 writeByte(command);
Markus_Paar 0:48870d877970 108 }
Markus_Paar 0:48870d877970 109
Markus_Paar 0:48870d877970 110 void TextLCD::writeData(int data) {
Markus_Paar 0:48870d877970 111 _rs = 1;
Markus_Paar 0:48870d877970 112 writeByte(data);
Markus_Paar 0:48870d877970 113 }
Markus_Paar 0:48870d877970 114
Markus_Paar 0:48870d877970 115 int TextLCD::address(int column, int row) {
Markus_Paar 0:48870d877970 116 switch (_type) {
Markus_Paar 0:48870d877970 117 case LCD20x4:
Markus_Paar 0:48870d877970 118 switch (row) {
Markus_Paar 0:48870d877970 119 case 0:
Markus_Paar 0:48870d877970 120 return 0x80 + column;
Markus_Paar 0:48870d877970 121 case 1:
Markus_Paar 0:48870d877970 122 return 0xc0 + column;
Markus_Paar 0:48870d877970 123 case 2:
Markus_Paar 0:48870d877970 124 return 0x94 + column;
Markus_Paar 0:48870d877970 125 case 3:
Markus_Paar 0:48870d877970 126 return 0xd4 + column;
Markus_Paar 0:48870d877970 127 }
Markus_Paar 0:48870d877970 128 case LCD16x2B:
Markus_Paar 0:48870d877970 129 return 0x80 + (row * 40) + column;
Markus_Paar 0:48870d877970 130 case LCD16x2:
Markus_Paar 0:48870d877970 131 case LCD20x2:
Markus_Paar 0:48870d877970 132 default:
Markus_Paar 0:48870d877970 133 return 0x80 + (row * 0x40) + column;
Markus_Paar 0:48870d877970 134 }
Markus_Paar 0:48870d877970 135 }
Markus_Paar 0:48870d877970 136
Markus_Paar 0:48870d877970 137 int TextLCD::columns() {
Markus_Paar 0:48870d877970 138 switch (_type) {
Markus_Paar 0:48870d877970 139 case LCD20x4:
Markus_Paar 0:48870d877970 140 case LCD20x2:
Markus_Paar 0:48870d877970 141 return 20;
Markus_Paar 0:48870d877970 142 case LCD16x2:
Markus_Paar 0:48870d877970 143 case LCD16x2B:
Markus_Paar 0:48870d877970 144 default:
Markus_Paar 0:48870d877970 145 return 16;
Markus_Paar 0:48870d877970 146 }
Markus_Paar 0:48870d877970 147 }
Markus_Paar 0:48870d877970 148
Markus_Paar 0:48870d877970 149 int TextLCD::rows() {
Markus_Paar 0:48870d877970 150 switch (_type) {
Markus_Paar 0:48870d877970 151 case LCD20x4:
Markus_Paar 0:48870d877970 152 return 4;
Markus_Paar 0:48870d877970 153 case LCD16x2:
Markus_Paar 0:48870d877970 154 case LCD16x2B:
Markus_Paar 0:48870d877970 155 case LCD20x2:
Markus_Paar 0:48870d877970 156 default:
Markus_Paar 0:48870d877970 157 return 2;
Markus_Paar 0:48870d877970 158 }
Markus_Paar 0:48870d877970 159 }