![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Wave-Player with TLV320
Dependencies: FatFileSystemCpp I2SSlave TLV320 mbed
Diff: LCD/LCD.cpp
- Revision:
- 0:3087f1924901
diff -r 000000000000 -r 3087f1924901 LCD/LCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD/LCD.cpp Wed Dec 09 20:58:55 2015 +0000 @@ -0,0 +1,186 @@ +/* mbed LCD Library, for a 4-bit LCD based on HD44780 + * Copyright (c) 2007-2012, hb9gaa + */ + +#include "LCD.h" +#include "mbed.h" + +TextLCD::TextLCD(PinName rs, PinName rw, PinName e, PinName d0, PinName d1, PinName d2, PinName d3, LCDType type) : _rs(rs), _rw(rw), _e(e), _d(d0, d1, d2, d3), _type(type) + { + _e = 1; + _rw = 0; + _rs = 0; // command mode + + wait(0.015); // Wait 15ms to ensure powered up + + // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) + for (int i=0; i<3; i++) + { + writeByte(0x3); + wait_ms(1.64); // this command takes 1.64ms, so wait for it + } + writeByte(0x2); // 4-bit mode + wait_ms(0.1); // most instructions take 100us + + writeCommand(0x28); // Function set 001 BW N F - - + writeCommand(0x0C); + writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes + cls(); + } + + +void TextLCD::character(int column, int row, int c) + { + int a = address(column, row); + writeCommand(a); + writeData(c); + } + + +void TextLCD::cls() + { + writeCommand(0x01); // cls, and set cursor to 0 + wait_ms(4.1); // This command takes 4.1 ms + locate(0, 0); + } + + +void TextLCD::locate(int column, int row) + { + _column = column; + _row = row; + } + + +int TextLCD::_putc(int value) + { + if (value == '\n') + { + _column = 0; + _row++; + if (_row >= rows()) + { + _row = 0; + } + } + else + { + character(_column, _row, value); + _column++; + if (_column >= columns()) + { + _column = 0; + _row++; + if (_row >= rows()) + { + _row = 0; + } + } + } + return value; + } + + +int TextLCD::_getc() + { + return -1; + } + + +void TextLCD::writeByte(int value) + { + _d = value >> 4; + wait(0.0001); // most instructions take 100us + _e = 0; + wait(0.0001); + _e = 1; + _d = value >> 0; + wait(0.0001); + _e = 0; + wait(0.0001); + _e = 1; + } + + +void TextLCD::writeCommand(int command) + { + _rs = 0; + writeByte(command); + } + + +void TextLCD::writeData(int data) + { + _rs = 1; + writeByte(data); + } + + +int TextLCD::address(int column, int row) + { + switch (_type) + { + case LCD20x4: + switch (row) + { + case 0: + return 0x80 + column; + case 1: + return 0xc0 + column; + case 2: + return 0x94 + column; + case 3: + return 0xd4 + column; + } + case LCD16x2B: + return 0x80 + (row * 40) + column; + case LCD16x2: + case LCD20x2: + default: + return 0x80 + (row * 0x40) + column; + } + } + + +int TextLCD::columns() + { + switch (_type) + { + case LCD20x4: + case LCD20x2: + return 20; + case LCD16x2: + case LCD16x2B: + default: + return 16; + } + } + + +int TextLCD::rows() + { + switch (_type) + { + case LCD20x4: + return 4; + case LCD16x2: + case LCD16x2B: + case LCD20x2: + default: + return 2; + } + } + + +void TextLCD::buildChar(unsigned char *p) + { + unsigned char i, j; + + for(j=0;j<8;j++) //CGRAM Adresse + { + writeCommand(0x40+(j*8)); //Write to CGRAM + for(i=0;i<8;i++) + writeData(p[i+(j*8)]); //Write the character pattern to CGRAM + } + writeCommand(0x80); //shift back to DDRAM location 0 + }