lc-gpio4bit.lua 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. local gpio, bit = gpio, bit --luacheck: read globals gpio bit
  2. return function(bus_args)
  3. local rs = bus_args.rs or 0
  4. local rw = bus_args.rw
  5. local en = bus_args.en or 1
  6. local bl = bus_args.backlight
  7. local d4 = bus_args.d4 or 2
  8. local d5 = bus_args.d5 or 3
  9. local d6 = bus_args.d6 or 4
  10. local d7 = bus_args.d7 or 5
  11. for _, d in pairs({rs,rw,en,bl}) do
  12. if d then
  13. gpio.mode(d, gpio.OUTPUT)
  14. end
  15. end
  16. local function setGPIO(mode)
  17. for _, d in pairs({d4, d5, d6, d7}) do
  18. gpio.mode(d, mode)
  19. end
  20. end
  21. setGPIO(gpio.OUTPUT)
  22. local function send4bitGPIO(value, rs_en, rw_en, read)
  23. local function exchange(data)
  24. local rv = 0
  25. if rs then gpio.write(rs, rs_en and gpio.HIGH or gpio.LOW) end
  26. if rw then gpio.write(rw, rw_en and gpio.HIGH or gpio.LOW) end
  27. gpio.write(en, gpio.HIGH)
  28. for i, d in ipairs({d4, d5, d6, d7}) do
  29. if read and rw then
  30. if gpio.read(d) == 1 then rv = bit.set(rv, i-1) end
  31. else
  32. gpio.write(d, bit.isset(data, i-1) and gpio.HIGH or gpio.LOW)
  33. end
  34. end
  35. gpio.write(en, gpio.LOW)
  36. return rv
  37. end
  38. local hi = bit.rshift(bit.band(value, 0xf0), 4)
  39. local lo = bit.band(value, 0xf)
  40. if read then setGPIO(gpio.INPUT) end
  41. hi = exchange(hi)
  42. lo = exchange(lo)
  43. if read then setGPIO(gpio.OUTPUT) end
  44. return bit.bor(bit.lshift(hi, 4), lo)
  45. end
  46. -- init sequence from datasheet
  47. send4bitGPIO(0x33, false, false, false)
  48. send4bitGPIO(0x32, false, false, false)
  49. -- Return backend object
  50. return {
  51. fourbits = true,
  52. command = function (_, cmd)
  53. return send4bitGPIO(cmd, false, false, false)
  54. end,
  55. busy = function(_)
  56. if rw == nil then return false end
  57. return bit.isset(send4bitGPIO(0xff, false, true, true), 7)
  58. end,
  59. position = function(_)
  60. if rw == nil then return 0 end
  61. return bit.clear(send4bitGPIO(0xff, false, true, true), 7)
  62. end,
  63. write = function(_, value)
  64. return send4bitGPIO(value, true, false, false)
  65. end,
  66. read = function(_)
  67. if rw == nil then return nil end
  68. return send4bitGPIO(0xff, true, true, true)
  69. end,
  70. backlight = function(_, on)
  71. if (bl) then gpio.write(bl, on and gpio.HIGH or gpio.LOW) end
  72. return on
  73. end,
  74. }
  75. end