Orignal AVR Tiny USI Based I2C slave LCD Driver.

Dependents:   MyLCD_OSARU MyLCD_printf

Committer:
bant62
Date:
Thu Dec 12 00:31:44 2013 +0000
Revision:
1:794acd9a0b9c
Parent:
0:2ba6a6510880
Fixed the software description;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bant62 0:2ba6a6510880 1 /**
bant62 0:2ba6a6510880 2 *****************************************************************************
bant62 0:2ba6a6510880 3 * File Name : MyLCD.cpp
bant62 0:2ba6a6510880 4 *
bant62 0:2ba6a6510880 5 * Title : ORGINAL I2C LCD Display Claass Source File
bant62 0:2ba6a6510880 6 * Revision : 0.1
bant62 0:2ba6a6510880 7 * Notes :
bant62 0:2ba6a6510880 8 * Target Board : mbed NXP LPC1768, mbed LPC1114FN28 etc
bant62 0:2ba6a6510880 9 * Tool Chain : ????
bant62 0:2ba6a6510880 10 *
bant62 0:2ba6a6510880 11 * Revision History:
bant62 0:2ba6a6510880 12 * When Who Description of change
bant62 0:2ba6a6510880 13 * ----------- ----------- -----------------------
bant62 1:794acd9a0b9c 14 * 2013/12/11 Hiroshi M init
bant62 0:2ba6a6510880 15 *****************************************************************************
bant62 0:2ba6a6510880 16 *
bant62 0:2ba6a6510880 17 * Copyright (C) 2013 Hiroshi M, MIT License
bant62 0:2ba6a6510880 18 *
bant62 0:2ba6a6510880 19 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
bant62 0:2ba6a6510880 20 * and associated documentation files (the "Software"), to deal in the Software without restriction,
bant62 0:2ba6a6510880 21 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
bant62 0:2ba6a6510880 22 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
bant62 0:2ba6a6510880 23 * furnished to do so, subject to the following conditions:
bant62 0:2ba6a6510880 24 *
bant62 0:2ba6a6510880 25 * The above copyright notice and this permission notice shall be included in all copies or
bant62 0:2ba6a6510880 26 * substantial portions of the Software.
bant62 0:2ba6a6510880 27 *
bant62 0:2ba6a6510880 28 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
bant62 0:2ba6a6510880 29 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
bant62 0:2ba6a6510880 30 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
bant62 0:2ba6a6510880 31 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
bant62 0:2ba6a6510880 32 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
bant62 0:2ba6a6510880 33 *
bant62 0:2ba6a6510880 34 **/
bant62 0:2ba6a6510880 35
bant62 0:2ba6a6510880 36 /* Includes ----------------------------------------------------------------- */
bant62 0:2ba6a6510880 37 #include "mbed.h"
bant62 0:2ba6a6510880 38 #include "MyLCD.h"
bant62 0:2ba6a6510880 39 #include <string.h>
bant62 0:2ba6a6510880 40
bant62 0:2ba6a6510880 41 /* Private typedef ---------------------------------------------------------- */
bant62 0:2ba6a6510880 42 /* Private define ----------------------------------------------------------- */
bant62 0:2ba6a6510880 43 /* Private macro ------------------------------------------------------------ */
bant62 0:2ba6a6510880 44 /* Private variables -------------------------------------------------------- */
bant62 0:2ba6a6510880 45
bant62 0:2ba6a6510880 46 /* member fanctions --------------------------------------------------------- */
bant62 0:2ba6a6510880 47
bant62 0:2ba6a6510880 48
bant62 0:2ba6a6510880 49 // Constractor
bant62 0:2ba6a6510880 50 MyLCD::MyLCD(I2C *i2c): _i2c(i2c)
bant62 0:2ba6a6510880 51 {
bant62 0:2ba6a6510880 52 _column = 0;
bant62 0:2ba6a6510880 53 _row = 0;
bant62 0:2ba6a6510880 54 }
bant62 0:2ba6a6510880 55
bant62 0:2ba6a6510880 56 int MyLCD::writeBytes(const char *data, int length, bool repeated)
bant62 0:2ba6a6510880 57 {
bant62 0:2ba6a6510880 58 wait_us(i2c_bit_wait_us);
bant62 0:2ba6a6510880 59 _i2c->start();
bant62 0:2ba6a6510880 60
bant62 0:2ba6a6510880 61 wait_us(i2c_bit_wait_us);
bant62 0:2ba6a6510880 62 if (_i2c->write(i2c_addr) != 1)
bant62 0:2ba6a6510880 63 {
bant62 0:2ba6a6510880 64 wait_us(i2c_bit_wait_us);
bant62 0:2ba6a6510880 65 _i2c->stop();
bant62 0:2ba6a6510880 66 return _i2cFAILURE;
bant62 0:2ba6a6510880 67 }
bant62 0:2ba6a6510880 68
bant62 0:2ba6a6510880 69 for (int i = 0; i < length; i++)
bant62 0:2ba6a6510880 70 {
bant62 0:2ba6a6510880 71 wait_us(i2c_bit_wait_us);
bant62 0:2ba6a6510880 72 if (_i2c->write(data[i]) != 1)
bant62 0:2ba6a6510880 73 {
bant62 0:2ba6a6510880 74 wait_us(i2c_bit_wait_us);
bant62 0:2ba6a6510880 75 _i2c->stop();
bant62 0:2ba6a6510880 76 return _i2cFAILURE;
bant62 0:2ba6a6510880 77 }
bant62 0:2ba6a6510880 78 }
bant62 0:2ba6a6510880 79 if (!repeated)
bant62 0:2ba6a6510880 80 {
bant62 0:2ba6a6510880 81 wait_us(i2c_bit_wait_us);
bant62 0:2ba6a6510880 82 _i2c->stop();
bant62 0:2ba6a6510880 83 }
bant62 0:2ba6a6510880 84 return _i2cSUCCESS;
bant62 0:2ba6a6510880 85 }
bant62 0:2ba6a6510880 86
bant62 0:2ba6a6510880 87 int MyLCD::gotoCursor( int x, int y )
bant62 0:2ba6a6510880 88 {
bant62 0:2ba6a6510880 89 char buff[4] = { ESC, 'L', x, y };
bant62 0:2ba6a6510880 90
bant62 0:2ba6a6510880 91 _column = x;
bant62 0:2ba6a6510880 92 _row = y;
bant62 0:2ba6a6510880 93
bant62 0:2ba6a6510880 94 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 95 }
bant62 0:2ba6a6510880 96
bant62 0:2ba6a6510880 97
bant62 0:2ba6a6510880 98 int MyLCD::home(void)
bant62 0:2ba6a6510880 99 {
bant62 0:2ba6a6510880 100 char buff[2] = { ESC, 'H' };
bant62 0:2ba6a6510880 101
bant62 0:2ba6a6510880 102 _column = 0;
bant62 0:2ba6a6510880 103 _row = 0;
bant62 0:2ba6a6510880 104
bant62 0:2ba6a6510880 105 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 106 }
bant62 0:2ba6a6510880 107
bant62 0:2ba6a6510880 108 int MyLCD::clear(void)
bant62 0:2ba6a6510880 109 {
bant62 0:2ba6a6510880 110 char buff[2] = { ESC, 'C' };
bant62 0:2ba6a6510880 111
bant62 0:2ba6a6510880 112 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 113 }
bant62 0:2ba6a6510880 114
bant62 0:2ba6a6510880 115 int MyLCD::saveCustomCharacter(int romCharNum, char lcdCharData[])
bant62 0:2ba6a6510880 116 {
bant62 0:2ba6a6510880 117 int ret;
bant62 0:2ba6a6510880 118
bant62 0:2ba6a6510880 119 char buff[3] = { ESC, 'S', romCharNum };
bant62 0:2ba6a6510880 120
bant62 0:2ba6a6510880 121 ret = writeBytes(buff, sizeof(buff), true);
bant62 0:2ba6a6510880 122
bant62 0:2ba6a6510880 123 if (ret == _i2cSUCCESS)
bant62 0:2ba6a6510880 124 {
bant62 0:2ba6a6510880 125 ret = writeBytes(lcdCharData, 8, false);
bant62 0:2ba6a6510880 126 }
bant62 0:2ba6a6510880 127 wait_ms(100);
bant62 0:2ba6a6510880 128
bant62 0:2ba6a6510880 129 return ret;
bant62 0:2ba6a6510880 130 }
bant62 0:2ba6a6510880 131
bant62 0:2ba6a6510880 132 int MyLCD::mapCustomCharacter(int romCharNum, int lcdCharNum)
bant62 0:2ba6a6510880 133 {
bant62 0:2ba6a6510880 134 char buff[4] = { ESC, 'M', romCharNum, lcdCharNum };
bant62 0:2ba6a6510880 135
bant62 0:2ba6a6510880 136 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 137 }
bant62 0:2ba6a6510880 138
bant62 0:2ba6a6510880 139
bant62 0:2ba6a6510880 140 int MyLCD::offDisplay(void)
bant62 0:2ba6a6510880 141 {
bant62 0:2ba6a6510880 142 char buff[2] = { ESC, 'X' };
bant62 0:2ba6a6510880 143
bant62 0:2ba6a6510880 144 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 145 }
bant62 0:2ba6a6510880 146
bant62 0:2ba6a6510880 147 int MyLCD::onDisplay(void)
bant62 0:2ba6a6510880 148 {
bant62 0:2ba6a6510880 149 char buff[2] = { ESC, 'N' };
bant62 0:2ba6a6510880 150
bant62 0:2ba6a6510880 151 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 152 }
bant62 0:2ba6a6510880 153
bant62 0:2ba6a6510880 154 int MyLCD::blinkCharacter(void)
bant62 0:2ba6a6510880 155 {
bant62 0:2ba6a6510880 156 char buff[2] = { ESC, 'B' };
bant62 0:2ba6a6510880 157
bant62 0:2ba6a6510880 158 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 159 }
bant62 0:2ba6a6510880 160
bant62 0:2ba6a6510880 161 int MyLCD::dispCursor(void)
bant62 0:2ba6a6510880 162 {
bant62 0:2ba6a6510880 163 char buff[2] = { ESC, 'D' };
bant62 0:2ba6a6510880 164
bant62 0:2ba6a6510880 165 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 166 }
bant62 0:2ba6a6510880 167
bant62 0:2ba6a6510880 168 int MyLCD::blinkCursor(void)
bant62 0:2ba6a6510880 169 {
bant62 0:2ba6a6510880 170 char buff[2] = { ESC, 'E' };
bant62 0:2ba6a6510880 171
bant62 0:2ba6a6510880 172 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 173 }
bant62 0:2ba6a6510880 174
bant62 0:2ba6a6510880 175 int MyLCD::hideCursor(void)
bant62 0:2ba6a6510880 176 {
bant62 0:2ba6a6510880 177 char buff[2] = { ESC, 'H' };
bant62 0:2ba6a6510880 178
bant62 0:2ba6a6510880 179 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 180 }
bant62 0:2ba6a6510880 181
bant62 0:2ba6a6510880 182 int MyLCD::moveLeftCursor(void)
bant62 0:2ba6a6510880 183 {
bant62 0:2ba6a6510880 184 char buff[2] = { ESC, '-' };
bant62 0:2ba6a6510880 185
bant62 0:2ba6a6510880 186 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 187 }
bant62 0:2ba6a6510880 188
bant62 0:2ba6a6510880 189 int MyLCD::moveRightCursor(void)
bant62 0:2ba6a6510880 190 {
bant62 0:2ba6a6510880 191 char buff[2] = { ESC, '+' };
bant62 0:2ba6a6510880 192
bant62 0:2ba6a6510880 193 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 194 }
bant62 0:2ba6a6510880 195
bant62 0:2ba6a6510880 196 int MyLCD::moveLeftDisplay(void)
bant62 0:2ba6a6510880 197 {
bant62 0:2ba6a6510880 198 char buff[2] = { ESC, '<' };
bant62 0:2ba6a6510880 199
bant62 0:2ba6a6510880 200 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 201 }
bant62 0:2ba6a6510880 202
bant62 0:2ba6a6510880 203 int MyLCD::moveRightDisplay(void)
bant62 0:2ba6a6510880 204 {
bant62 0:2ba6a6510880 205 char buff[2] = { ESC, '>' };
bant62 0:2ba6a6510880 206
bant62 0:2ba6a6510880 207 return writeBytes(buff, sizeof(buff));
bant62 0:2ba6a6510880 208 }
bant62 0:2ba6a6510880 209
bant62 0:2ba6a6510880 210 // 一文字表示
bant62 0:2ba6a6510880 211 int MyLCD::printChar(char chr)
bant62 0:2ba6a6510880 212 {
bant62 0:2ba6a6510880 213 return writeBytes(&chr, 1);
bant62 0:2ba6a6510880 214 }
bant62 0:2ba6a6510880 215
bant62 0:2ba6a6510880 216 int MyLCD::printStr(const char *s)
bant62 0:2ba6a6510880 217 {
bant62 0:2ba6a6510880 218 return writeBytes(s, strlen(s));
bant62 0:2ba6a6510880 219 }
bant62 0:2ba6a6510880 220
bant62 0:2ba6a6510880 221
bant62 0:2ba6a6510880 222 int MyLCD::_putc(int value)
bant62 0:2ba6a6510880 223 {
bant62 0:2ba6a6510880 224 if (value == '\n')
bant62 0:2ba6a6510880 225 {
bant62 0:2ba6a6510880 226 _column = 0;
bant62 0:2ba6a6510880 227 _row++;
bant62 0:2ba6a6510880 228 if (_row >= rows())
bant62 0:2ba6a6510880 229 {
bant62 0:2ba6a6510880 230 _row = 0;
bant62 0:2ba6a6510880 231 }
bant62 0:2ba6a6510880 232 }
bant62 0:2ba6a6510880 233 else
bant62 0:2ba6a6510880 234 {
bant62 0:2ba6a6510880 235 character(_column, _row, value);
bant62 0:2ba6a6510880 236 _column++;
bant62 0:2ba6a6510880 237 if (_column >= columns())
bant62 0:2ba6a6510880 238 {
bant62 0:2ba6a6510880 239 _column = 0;
bant62 0:2ba6a6510880 240 _row++;
bant62 0:2ba6a6510880 241 if (_row >= rows())
bant62 0:2ba6a6510880 242 {
bant62 0:2ba6a6510880 243 _row = 0;
bant62 0:2ba6a6510880 244 }
bant62 0:2ba6a6510880 245 }
bant62 0:2ba6a6510880 246 }
bant62 0:2ba6a6510880 247 return value;
bant62 0:2ba6a6510880 248 }
bant62 0:2ba6a6510880 249
bant62 0:2ba6a6510880 250 int MyLCD::_getc()
bant62 0:2ba6a6510880 251 {
bant62 0:2ba6a6510880 252 return -1;
bant62 0:2ba6a6510880 253 }
bant62 0:2ba6a6510880 254
bant62 0:2ba6a6510880 255 void MyLCD::character(int column, int row, int c)
bant62 0:2ba6a6510880 256 {
bant62 0:2ba6a6510880 257 gotoCursor(_column, row );
bant62 0:2ba6a6510880 258 printChar(c);
bant62 0:2ba6a6510880 259 }
bant62 0:2ba6a6510880 260
bant62 0:2ba6a6510880 261 int MyLCD::columns()
bant62 0:2ba6a6510880 262 {
bant62 0:2ba6a6510880 263 return display_columns;
bant62 0:2ba6a6510880 264 }
bant62 0:2ba6a6510880 265
bant62 0:2ba6a6510880 266 int MyLCD::rows()
bant62 0:2ba6a6510880 267 {
bant62 0:2ba6a6510880 268 return display_rows;
bant62 0:2ba6a6510880 269 }