ilcd
Version:
Driver for LCD ( with i2c ) [1602] , [2004] .is Tested in Raspberry Pi and BeagleBone.
157 lines (129 loc) • 4.22 kB
JavaScript
function iLCD() {
require('coffee-script/register');
var i2c = require('i2c');
var is_rpi_available = true;
var address = 0x27;
// commands
var LCD_CLEARDISPLAY = 0x01;
var LCD_RETURNHOME = 0x02;
var LCD_ENTRYMODESET = 0x04;
var LCD_DISPLAYCONTROL = 0x08;
var LCD_CURSORSHIFT = 0x10;
var LCD_FUNCTIONSET = 0x20;
var LCD_SETCGRAMADDR = 0x40;
var LCD_SETDDRAMADDR = 0x80;
//flags for display entry mode
var LCD_ENTRYRIGHT = 0x00;
var LCD_ENTRYLEFT = 0x02;
var LCD_ENTRYSHIFTINCREMENT = 0x01;
var LCD_ENTRYSHIFTDECREMENT = 0x00;
//flags for display on/off control
var LCD_DISPLAYON = 0x04;
var LCD_DISPLAYOFF = 0x00;
var LCD_CURSORON = 0x02;
var LCD_CURSOROFF = 0x00;
var LCD_BLINKON = 0x01;
var LCD_BLINKOFF = 0x00;
// flags for display/cursor shift
var LCD_DISPLAYMOVE = 0x08;
var LCD_CURSORMOVE = 0x00;
var LCD_MOVERIGHT = 0x04;
var LCD_MOVELEFT = 0x00;
//flags for function set
var LCD_8BITMODE = 0x10;
var LCD_4BITMODE = 0x00;
var LCD_2LINE = 0x08;
var LCD_1LINE = 0x00;
var LCD_5x10DOTS = 0x04;
var LCD_5x8DOTS = 0x00;
// flags for backlight control
var LCD_BACKLIGHT = 0x08;
var LCD_NOBACKLIGHT = 0x00;
var En = 0x4;//0b00000100 // Enable bit
var Rw = 0x2;//0b00000010 // Read/Write bit
var Rs = 0x1;//0b00000001 // Register select bit
var self = this;
this.lcd_device = undefined;
//----------- Constractor------------
self.lcd_device = new i2c(address, {device: '/dev/i2c-1'});
var WritRaw = function (RawData) {
self.lcd_device.write(RawData, function (err) {
});
};
//clocks EN to latch command
function lcdStrobe(data) {
WritRaw([(data | En | LCD_BACKLIGHT)]);
// sleep(.0005)
WritRaw(((data & ~En) | LCD_BACKLIGHT));
// sleep(.0001)
};
function lcdWrite4(data) {
WritRaw(Buffer([(data | LCD_BACKLIGHT)]));
WritRaw(Buffer([(data | LCD_DISPLAYON | LCD_BACKLIGHT)]));
WritRaw(Buffer([((data & ~LCD_DISPLAYON) | LCD_BACKLIGHT)]));
// lcdStrobe(data);
}
function lcdWrite(data, mode) {
lcdWrite4(mode | (data & 0xF0));
lcdWrite4(mode | ((data << 4) & 0xF0));
}
function LCDINIT() {
if (is_rpi_available) {
lcdWrite(0x03, 0);
lcdWrite(0x03, 0);
lcdWrite(0x03, 0);
lcdWrite(0x02, 0);
lcdWrite(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE, 0);
lcdWrite(LCD_DISPLAYCONTROL | LCD_DISPLAYON, 0);
lcdWrite(LCD_CLEARDISPLAY, 0);
lcdWrite(LCD_ENTRYMODESET | LCD_ENTRYLEFT, 0);
}
}
/*
* Write a string to the specified LCD line.
*/
this.lineOut = function (str, addr) {
if (addr == 1)
lcdWrite(0x80, 0);
if (addr == 2)
lcdWrite(0xC0, 0);
if (addr == 3)
lcdWrite(0x94, 0);
if (addr == 4)
lcdWrite(0xD4, 0);
str.split('').forEach(function (c) {
lcdWrite(c.charCodeAt(0), 1);
});
};
this.ClearLine = function (line) {
var str = "";
for (ii = 1; ii <= 16; ii++) {
str += " ";
}
self.lineOut(str, line);
};
this.ClearDisplay = function () {
lcdWrite(LCD_CLEARDISPLAY, 0);
};
this.SetAddress = function (adr) {
address = adr;
};
/** Turn display off */
this.DisplayOff = function () {
WritRaw(LCD_DISPLAYCONTROL | LCD_DISPLAYOFF);
};
/** Turn display on */
this.DisplayOn = function () {
LCDINIT();
lcdWrite(LCD_DISPLAYCONTROL | LCD_DISPLAYON, 0);
};
this.BackLightOn = function () {
lcdWrite(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_BACKLIGHT, 0);
};
this.BackLightOff = function () {
WritRaw(LCD_DISPLAYCONTROL | LCD_NOBACKLIGHT);
};
LCDINIT();
// lcdWrite(LCD_CLEARDISPLAY, 0);
}
module.exports.iLCD = new iLCD();