Anurag Muglikar / Mbed OS pacemaker_new

Dependencies:   MQTT

Committer:
anuragmuglikar
Date:
Mon Dec 03 05:44:36 2018 +0000
Revision:
2:c115d926cd17
Pacemaker Model

Who changed what in which revision?

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