16 KiB
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.setup
will be skippedscl
: I²C clock pin. If set tonil
, I²C bus initialization step viai2c.setup
will be skippedbusid
: I²C bus ID. Defaults to0
busad
: chip I²C address. Defaults to0x27
(default PCF8574 address)speed
: I²C speed. Defaults toi2c.SLOW
rs
: bit position assigned toRS
pin in I²C word. Defaults to 0rw
: bit position assigned toRW
pin in I²C word. Defaults to 1en
: bit position assigned toEN
pin in I²C word. Defaults to 2bl
: bit position assigned to backlight pin in I²C word. Defaults to 3d4
: bit position assigned toD4
pin in I²C word. Defaults to 4d5
: bit position assigned toD5
pin in I²C word. Defaults to 5d6
: bit position assigned toD6
pin in I²C word. Defaults to 6d7
: bit position assigned toD7
pin 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 toRS
pin. Defaults to 0rw
: GPIO pin connected toRW
pin. If set tonil
thenbusy
,position
andreadChar
functions will not be available. Note thatRW
pin must be pulled to the ground if not connected to GPIOen
: GPIO pin connected toEN
pin. Defaults to 1bl
: GPIO pin controlling backlight. It is assumed, that high level turns backlight on, low level turns backlight off. If set tonil
then backlight function will not be availabled4
: GPIO pin connected toD4
pin. Defaults to 2d5
: GPIO pin connected toD5
pin. Defaults to 3d6
: GPIO pin connected toD6
pin. Defaults to 4d7
: GPIO pin connected toD7
pin. 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 toRS
pin. Defaults to 0rw
: GPIO pin connected toRW
pin. If set tonil
thenbusy
,position
andreadChar
functions will not be available. Note thatRW
pin must be pulled to the ground if not connected to GPIOen
: GPIO pin connected toEN
pin. Defaults to 1bl
: GPIO pin controlling backlight. It is assumed, that high level turns backlight on, low level turns backlight off. If set tonil
then backlight function will not be availabled0
: GPIO pin connected toD0
pin. Defaults to 2d1
: GPIO pin connected toD1
pin. Defaults to 3d2
: GPIO pin connected toD2
pin. Defaults to 4d3
: GPIO pin connected toD3
pin. Defaults to 5d4
: GPIO pin connected toD4
pin. Defaults to 6d5
: GPIO pin connected toD5
pin. Defaults to 7d6
: GPIO pin connected toD6
pin. Defaults to 8d7
: GPIO pin connected toD7
pin. 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
:true
to use one line mode,false
to use two line modeeightdotsmode
:true
to use 5x8 dot font,false
to use 5x10 dot fontcolumn_width
: number of characters in column. Used for offset calculations in functioncursorMove
. If set tonil
, functionality ofcursorMove
will be limited. For most displays column width is20
characters
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
:liquidcrystal
instanceon
:true
to turn on,false
to 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
:liquidcrystal
instanceon
:true
to turn on,false
to turn off
Returns
- backlight status
Example
liquidcrystal:backlight(true)
liquidcrystal.blink
Control cursors blink mode.
Syntax
liquidcrystal.blink(self, on)
Parameters
self
:liquidcrystal
instanceon
:true
to turn on,false
to 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
:liquidcrystal
instance
Returns
true
if device is busy,false
if device is ready to receive commands
Example
while liquidcrystal:busy() do end
liquidcrystal.clear
Clear LCD screen.
Syntax
liquidcrystal.clear(self)
Parameters
self
:liquidcrystal
instance
Returns
- sent data
Example
liquidcrystal:clear()
liquidcrystal.cursorLeft
Move cursor one character to the left.
Syntax
liquidcrystal.cursorLeft(self)
Parameters
self
:liquidcrystal
instance
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
:liquidcrystal
instancecol
: new cursor position column. Ifrow
not 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
:liquidcrystal
instanceon
:true
to turn on,false
to turn off
Returns
- sent data
Example
liquidcrystal:cursor(true)
liquidcrystal.cursorRight
Move cursor one character to the right.
Syntax
liquidcrystal.cursorRight(self)
Parameters
self
:liquidcrystal
instance
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](https://omerk.github.io/lcdchargen/), [2](https://www.quinapalus.com/hd44780udg.html)) and [desktop applications](https://pypi.org/project/lcdchargen/) that help create custom characters.
Syntax
liquidcrystal.customChar(self, index, bytes)
Parameters
self
:liquidcrystal
instanceindex
: 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
:liquidcrystal
instanceon
:true
to turn on,false
to turn off
Returns
- sent data
Example
liquidcrystal:display(true)
liquidcrystal.home
Reset cursor and screen position.
Syntax
liquidcrystal.home(self)
Parameters
self
:liquidcrystal
instance
Returns
- sent data
Example
liquidcrystal:home()
liquidcrystal.leftToRight
Print text left to right (default).
Syntax
liquidcrystal.leftToRight(self)
Parameters
self
:liquidcrystal
instance
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
:liquidcrystal
instance
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
:liquidcrystal
instance
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
:liquidcrystal
instanceindex
: 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
:liquidcrystal
instance
Returns
- sent data
Example
liquidcrystal:rightToLeft()
liquidcrystal.scrollLeft
Move text to the left.
Syntax
liquidcrystal.scrollLeft(self)
Parameters
self
:liquidcrystal
instance
Returns
- sent data
Example
liquidcrystal:scrollLeft()
liquidcrystal.scrollRight
Move text to the right.
Syntax
liquidcrystal.scrollRight(self)
Parameters
self
:liquidcrystal
instance
Returns
- sent data
Example
liquidcrystal:scrollRight()
liquidcrystal.write
Print text.
Syntax
liquidcrystal.write(self, ...)
Parameters
self
:liquidcrystal
instance...
: 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)