http://mbed.org/users/shintamainjp/notebook/textlcd_sr4_en/

Dependents:   TextLCD_SR4_TestProgram ServoInterfaceBoardExample1

Committer:
shintamainjp
Date:
Mon Oct 25 22:41:56 2010 +0000
Revision:
2:e768257aba09
Parent:
0:580f94424a91

        

Who changed what in which revision?

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