LiquidCrystal Module¶
| Since | Origin / Contributor | Maintainer | Source |
|---|---|---|---|
| 2019-12-01 | Matsievskiy Sergey | Matsievskiy Sergey | liquidcrystal.lua i2c4bit.lua gpio4bit.lua gpio8bit.lua |
This Lua module provides access to Hitachi HD44780 based LCDs. It supports 4 bit and 8 bit GPIO interface, 4 bit PCF8574 based I²C interface.
Note
This module requires bit C module built into firmware. Depending on the interface, gpio or i2c module is also required.
Program example¶
In this example LED screen is connected using I²C GPIO expander. Program defines five custom characters and prints text.
backend_meta = require "lc-i2c4bit"
lc_meta = require "liquidcrystal"
-- create display object
lc = lc_meta(backend_meta{sda=1, scl=2}, false, true, 20)
backend_meta = nil
lc_meta = nil
-- define custom characters
lc:customChar(0, {0,14,31,31,4,4,5,2})
lc:customChar(1, {4,6,5,5,4,12,28,8})
lc:customChar(2, {14,31,17,17,17,17,17,31})
lc:customChar(3, {14,31,17,17,17,17,31,31})
lc:customChar(4, {14,31,17,17,31,31,31,31})
lc:customChar(5, {14,31,31,31,31,31,31,31})
lc:clear() -- clear display
lc:blink(true) -- enable cursor blinking
lc:home() -- reset cursor position
lc:write("hello", " ", "world") -- write string
lc:cursorMove(1, 2) -- move cursor to second line
lc:write("umbrella", 0, 32, "note", 1) -- mix text strings and characters
lc:cursorMove(1, 3)
lc:write("Battery level ", 2, 3, 4, 5)
lc:home()
lc:blink(false)
for i=1,20 do print(lc:read()) end -- read back first line
lc:home()
for _, d in ipairs(lc:readCustom(0)) do print(d) end -- read back umbrella char
for _, d in ipairs(lc:readCustom(1)) do print(d) end -- read back note char
Require¶
i2c4bit_meta = require("lc-i2c4bit")
gpio4bit_meta = require("lc-gpio4bit")
gpio8bit_meta = require("lc-gpio8bit")
lc_meta = require("liquidcrystal")
Release¶
package.loaded["lc-i2c4bit"] = nil
package.loaded["lc-gpio4bit"] = nil
package.loaded["lc-gpio8bit"] = nil
package.loaded["liquidcrystal"] = nil
Initialization¶
Liquidcrystal module is initialized using closure, which takes backend object as an argument.
I²C backend¶
Loading I²C backend module returns initialization closure. It configures I²C backend and returns backend object.
Syntax¶
function({[sda=sda_pin] [, scl=scl_pin] [, busid=id] [, busad=address] [, speed = spd] [, rs = rs_pos] [, rw = rw_pos] [, en = en_pos] [, bl = bl_pos] [, d4 = d4_pos] [, d5 = d5_pos] [, d6 = d6_pos] [, d7 = d7_pos]})
Note
In most cases only sda and scl parameters are required
Parameters¶
sda: I²C data pin. If set tonil, I²C bus initialization step viai2c.setupwill be skippedscl: I²C clock pin. If set tonil, I²C bus initialization step viai2c.setupwill be skippedbusid: I²C bus ID. Defaults to0busad: chip I²C address. Defaults to0x27(default PCF8574 address)speed: I²C speed. Defaults toi2c.SLOWrs: bit position assigned toRSpin in I²C word. Defaults to 0rw: bit position assigned toRWpin in I²C word. Defaults to 1en: bit position assigned toENpin in I²C word. Defaults to 2bl: bit position assigned to backlight pin in I²C word. Defaults to 3d4: bit position assigned toD4pin in I²C word. Defaults to 4d5: bit position assigned toD5pin in I²C word. Defaults to 5d6: bit position assigned toD6pin in I²C word. Defaults to 6d7: bit position assigned toD7pin in I²C word. Defaults to 7
Returns¶
- backend object
Example¶
backend_meta = require "lc-i2c4bit"
backend = backend_meta{sda=1, scl=2 ,speed=i2c.FAST}
GPIO 4 bit backend¶
Loading GPIO 4 bit backend module returns initialization closure. It configures GPIO 4 bit backend and returns backend object.
Syntax¶
function({[, rs = rs_pos] [, rw = rw_pos] [, en = en_pos] [, bl = bl_pos] [, d4 = d4_pos] [, d5 = d5_pos] [, d6 = d6_pos] [, d7 = d7_pos]})
Parameters¶
rs: GPIO pin connected toRSpin. Defaults to 0rw: GPIO pin connected toRWpin. If set tonilthenbusy,positionandreadCharfunctions will not be available. Note thatRWpin must be pulled to the ground if not connected to GPIOen: GPIO pin connected toENpin. Defaults to 1bl: GPIO pin controlling backlight. It is assumed, that high level turns backlight on, low level turns backlight off. If set tonilthen backlight function will not be availabled4: GPIO pin connected toD4pin. Defaults to 2d5: GPIO pin connected toD5pin. Defaults to 3d6: GPIO pin connected toD6pin. Defaults to 4d7: GPIO pin connected toD7pin. Defaults to 5
Returns¶
- backend object
Example¶
backend_meta = require "lc-gpio4bit"
backend = backend_meta{rs=0, rw=1, en=4, d4=5, d5=6, d6=7, d7=8}
GPIO 8 bit backend¶
Loading GPIO 8 bit backend module returns initialization closure. It configures GPIO 8 bit backend and returns backend object.
Syntax¶
function({[, rs = rs_pos] [, rw = rw_pos] [, en = en_pos] [, bl = bl_pos] [, d0 = d0_pos] [, d1 = d1_pos] [, d2 = d2_pos] [, d3 = d3_pos] [, d4 = d4_pos] [, d5 = d5_pos] [, d6 = d6_pos] [, d7 = d7_pos]})
Parameters¶
rs: GPIO pin connected toRSpin. Defaults to 0rw: GPIO pin connected toRWpin. If set tonilthenbusy,positionandreadCharfunctions will not be available. Note thatRWpin must be pulled to the ground if not connected to GPIOen: GPIO pin connected toENpin. Defaults to 1bl: GPIO pin controlling backlight. It is assumed, that high level turns backlight on, low level turns backlight off. If set tonilthen backlight function will not be availabled0: GPIO pin connected toD0pin. Defaults to 2d1: GPIO pin connected toD1pin. Defaults to 3d2: GPIO pin connected toD2pin. Defaults to 4d3: GPIO pin connected toD3pin. Defaults to 5d4: GPIO pin connected toD4pin. Defaults to 6d5: GPIO pin connected toD5pin. Defaults to 7d6: GPIO pin connected toD6pin. Defaults to 8d7: GPIO pin connected toD7pin. Defaults to 9
Returns¶
- backend object
Example¶
backend_meta = require "lc-gpio8bit"
backend = backend_meta{rs=15, rw=2, en=5, d0=23, d1=13, d2=33, d3=32, d4=18, d5=19, d6=21, d7=22}
Liquidcrystal initialization¶
Loading Liquidcrystal module returns initialization closure. It requires backend object and returns LCD object.
Syntax¶
function(backend, onelinemode, eightdotsmode, column_width)
Parameters¶
backend: backend objectonelinemode:trueto use one line mode,falseto use two line modeeightdotsmode:trueto use 5x8 dot font,falseto use 5x10 dot fontcolumn_width: number of characters in column. Used for offset calculations in functioncursorMove. If set tonil, functionality ofcursorMovewill be limited. For most displays column width is20characters
Returns¶
screen object
Example¶
lc_meta = require "liquidcrystal"
lc = lc_meta(backend, true, true, 20)
liquidcrystal.autoscroll¶
Autoscroll text when printing. When turned off, cursor moves and text stays still, when turned on, vice versa.
Syntax¶
liquidcrystal.autoscroll(self, on)
Parameters¶
self:liquidcrystalinstanceon:trueto turn on,falseto turn off
Returns¶
- sent data
Example¶
liquidcrystal:autoscroll(true)
liquidcrystal.backlight¶
Control LCDs backlight. When using GPIO backend without bl argument specification function does nothing.
Syntax¶
liquidcrystal.backlight(self, on)
Parameters¶
self:liquidcrystalinstanceon:trueto turn on,falseto turn off
Returns¶
- backlight status
Example¶
liquidcrystal:backlight(true)
liquidcrystal.blink¶
Control cursors blink mode.
Syntax¶
liquidcrystal.blink(self, on)
Parameters¶
self:liquidcrystalinstanceon:trueto turn on,falseto turn off
Returns¶
- sent data
Example¶
liquidcrystal:blink(true)
liquidcrystal.busy¶
Get busy status of the LCD. When using GPIO backend without rw argument specification function does nothing.
Note
At least some HD44780s and/or interfaces have been observed to count polling the busy flag as grounds for incrementing their position in memory. This is mysterious, but software should restore the position after observing that the busy flag is clear.
Syntax¶
liquidcrystal.busy(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
trueif device is busy,falseif device is ready to receive commands
Example¶
while liquidcrystal:busy() do end
liquidcrystal.clear¶
Clear LCD screen.
Syntax¶
liquidcrystal.clear(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:clear()
liquidcrystal.cursorLeft¶
Move cursor one character to the left.
Syntax¶
liquidcrystal.cursorLeft(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:cursorLeft()
liquidcrystal.cursorMove¶
Move cursor to position. If row not specified, move cursor to address col.
Note
Note that column and row indexes start with 1. However, when omitting row parameter, cursor addresses start with 0.
Syntax¶
liquidcrystal.cursorMove(self, col, row)
Parameters¶
self:liquidcrystalinstancecol: new cursor position column. Ifrownot specified, new cursor position addressrow: new cursor position row ornil
Returns¶
- sent data
Example¶
liquidcrystal:cursorMove(5, 1)
liquidcrystal:cursorMove(10, 4)
liquidcrystal:cursorMove(21)
liquidcrystal.cursor¶
Control cursors highlight mode.
Syntax¶
liquidcrystal.cursor(self, on)
Parameters¶
self:liquidcrystalinstanceon:trueto turn on,falseto turn off
Returns¶
- sent data
Example¶
liquidcrystal:cursor(true)
liquidcrystal.cursorRight¶
Move cursor one character to the right.
Syntax¶
liquidcrystal.cursorRight(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:cursorRight()
liquidcrystal.customChar¶
Define new custom char. Up to 8 custom characters with indexes 0 to 7 may be defined in eight dot mode.
They are accessed via write function by index.
In ten dot mode only 4 custom characters may be used.
They are numbered from 0 to 7 with half of them being aliases to each other (0 to 1, 2 to 3 etc).
Note
Upon redefinition of a custom character all its instances will be updated automatically.
This function resets cursor position to home if liquidcrystal.position function is not available.
There are web services (1, 2) and desktop applications that help create custom characters.
Syntax¶
liquidcrystal.customChar(self, index, bytes)
Parameters¶
self:liquidcrystalinstanceindex: custom char index in range from 0 to 7bytes: array of 8 bytes in eight bit mode or 11 bytes in ten bit mode (eleventh line is a cursor line that can also be used) that defines new char bitmap line by line
Returns¶
nil
Example¶
liquidcrystal:customChar(5, {14,31,31,31,31,31,31,31})
liquidcrystal:write(5)
liquidcrystal.display¶
Turn display on and off. Does not affect display backlight. Does not clear the display.
Syntax¶
liquidcrystal.display(self, on)
Parameters¶
self:liquidcrystalinstanceon:trueto turn on,falseto turn off
Returns¶
- sent data
Example¶
liquidcrystal:display(true)
liquidcrystal.home¶
Reset cursor and screen position.
Syntax¶
liquidcrystal.home(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:home()
liquidcrystal.leftToRight¶
Print text left to right (default).
Syntax¶
liquidcrystal.leftToRight(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:leftToRight()
liquidcrystal.position¶
Get current position of the cursor. Position is 0 indexed. When using GPIO backend without rw argument specification function does nothing.
Note
At least some HD44780s and/or interfaces have been observed to count reading the position as grounds for incrementing their position in memory. This is mysterious, but software likely intends to restore the position anyway.
Syntax¶
liquidcrystal.position(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- 0 indexed position of the cursor
Example¶
local pos = liquidcrystal:position() -- save position
-- some code
liquidcrystal:cursorMove(pos) -- restore position
liquidcrystal.read¶
Return current character numerical representation.
When using GPIO backend without rw argument specification function does nothing.
Syntax¶
liquidcrystal.read(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- numerical representation of the current character
Example¶
liquidcrystal:home() -- goto home
local ch = liquidcrystal:read() -- read char
liquidcrystal:cursorMove(1, 2) -- move to the second line
for i=ch,ch+5 do lc:write(i) end -- print 6 chars starting with ch
liquidcrystal.readCustom¶
Return custom char byte array.
When using GPIO backend without rw argument specification function returns zeros.
Syntax¶
liquidcrystal.readCustom(self, index)
Parameters¶
self:liquidcrystalinstanceindex: custom char index in range from 0 to 7
Returns¶
- table of size 8 in eight dot mode or 11 in ten dot mode. Each 8 bit number represents a character dot line
Example¶
lc:customChar(0, {0,14,31,31,4,4,5,2}) -- define custom character
for _, d in ipairs(lc:readCustom(0)) do print(d) end -- read it back
liquidcrystal.rightToLeft¶
Print text right to left.
Syntax¶
liquidcrystal.rightToLeft(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:rightToLeft()
liquidcrystal.scrollLeft¶
Move text to the left.
Syntax¶
liquidcrystal.scrollLeft(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:scrollLeft()
liquidcrystal.scrollRight¶
Move text to the right.
Syntax¶
liquidcrystal.scrollRight(self)
Parameters¶
self:liquidcrystalinstance
Returns¶
- sent data
Example¶
liquidcrystal:scrollRight()
liquidcrystal.write¶
Print text.
Syntax¶
liquidcrystal.write(self, ...)
Parameters¶
self:liquidcrystalinstance...: strings or char codes. For the list of available characters refer to HD44780 datasheet
Returns¶
nil
Example¶
liquidcrystal:write("hello world")
liquidcrystal:write("hello yourself", "!!!", 243, 244)