lc-gpio8bit.lua 2.3 KB

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