I2cLCD library that can display cursor.
Fork of I2cLCD by
I2cLCD.cpp
- Committer:
- togayan
- Date:
- 2014-02-17
- Revision:
- 2:4e32baaf019b
- Parent:
- 1:f973d1359998
File content as of revision 2:4e32baaf019b:
#include "I2cLCD.h" #include "mbed.h" #define I2CLCD_ADDR 0x7C #define RS_CMD 0x00 #define RS_DATA 0x40 #define FUNC_SET1 0x38 #define FUNC_SET2 0x39 #define INT_OSC 0x14 #define CNTR_DEF 0x25 unsigned char icon_data[]= { 0x00, 0x10, 0x02, 0x10, 0x04, 0x10, 0x06, 0x10, 0x07, 0x10, 0x07, 0x08, 0x09, 0x10, 0x0B, 0x10, 0x0D, 0x08, 0x0D, 0x04, 0x0D, 0x02, 0x0D, 0x10, 0x0F, 0x10, }; I2cLCD::I2cLCD(I2C& i2c, PinName rp) : _rs( rp ) , _i2c( i2c ) { contrast = CNTR_DEF; icon = 0; wait(0.015); // reset LOW->HIGH _rs = 0; wait(0.01); _rs = 1; wait(0.05); writeCommand(FUNC_SET1); writeCommand(FUNC_SET2); writeCommand(INT_OSC); writeCommand(0x70 | (contrast & 0xF)); writeCommand(0x5C | ((contrast >> 4) & 0x3)); writeCommand(0x6C); wait(0.3); writeCommand(0x38); // function set writeCommand(0x0C); // Display On cls(); // Clear Display } void I2cLCD::character(int column, int row, int c) { int a = address(column, row); writeCommand(a); writeData(c); } void I2cLCD::cls() { writeCommand(0x01); // cls, and set cursor to 0 wait(0.00164f); // This command takes 1.64 ms locate(0, 0); } void I2cLCD::locate(int column, int row) { _column = column; _row = row; } int I2cLCD::_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 I2cLCD::_getc() { return -1; } void I2cLCD::writeCommand( int cmd ) { char cmds[2]; cmds[0] = RS_CMD; cmds[1] = cmd; _i2c.write(I2CLCD_ADDR, cmds, 2); } void I2cLCD::writeData( int data ) { char cmd[2]; cmd[0] = RS_DATA; cmd[1] = data; _i2c.write(I2CLCD_ADDR, cmd, 2); } int I2cLCD::address(int column, int row) { return 0x80 + (row * 0x40) + column; } int I2cLCD::columns() { return 16; } int I2cLCD::rows() { return 2; } void I2cLCD::seticon(IconType type) { icon |= type; puticon( icon ); } void I2cLCD::clearicon(IconType type) { icon &= ~type; puticon( icon ); } void I2cLCD::puticon(int flg) { static unsigned char icon_buff[16]; unsigned char i; for(i=0; i<sizeof(icon_data)/2; i++) { if(flg & (0x1000>>i)) { icon_buff[icon_data[i*2]] |= icon_data[i*2+1]; } else { icon_buff[icon_data[i*2]] &= ~icon_data[i*2+1]; } } for(i=0; i<16; i++) { writeCommand(0x39); writeCommand(0x40+i); writeData(icon_buff[i]); } } void I2cLCD::cursor(bool isOn, int column, int row) { int a = address(column, row); writeCommand(a); writeCommand(isOn? 0x0F : 0x0C); }