dmitrij999

i2c.lua

Feb 18th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. local moduleName = ...
  2.  
  3. local M = {}
  4. _G[moduleName] = M
  5.  
  6.  
  7. local backlight = 0
  8. local PCF_ADDRESS = 0x20
  9.  
  10. local LSRS = 0 --regselect
  11. local LSRW = 1 --readwrite
  12. local LSE = 2 --enable
  13. local LSLED= 3 --led backlight
  14. local LSDAT= 4 --data
  15.  
  16. function write(data)
  17. i2c.start(0)
  18. i2c.address(0,PCF_ADDRESS,i2c.TRANSMITTER)
  19. i2c.write(0,data)
  20. i2c.stop(0)
  21. end
  22.  
  23. local function sendLcdToI2C(rs, e, data)
  24. local value = bit.lshift(rs, LSRS)
  25. value = value + bit.lshift(e, LSE)
  26. value = value + bit.lshift(data, LSDAT)
  27. value = value + backlight
  28. write(value)
  29. end
  30.  
  31. local function sendLcdRaw(rs, data)
  32. sendLcdToI2C(rs, 1, data)
  33. sendLcdToI2C(rs, 0, data)
  34. end
  35.  
  36. local function sendLcd(rs, data)
  37. local hignib = bit.rshift(bit.band(data, 0xF0),4)
  38. local lownib = bit.band(data, 0x0F)
  39. sendLcdRaw(rs, hignib)
  40. sendLcdRaw(rs, lownib)
  41. end
  42.  
  43. function M.begin(pinSDA,pinSCL)
  44. i2c.setup(0,pinSDA,pinSCL,i2c.SLOW)
  45.  
  46. --setup done, reset
  47. sendLcdRaw(0, 0x03)
  48. tmr.delay(4500)
  49. sendLcdRaw(0, 0x03)
  50. tmr.delay(4500)
  51. sendLcdRaw(0, 0x03)
  52. tmr.delay(4500)
  53. --4bit
  54. sendLcdRaw(0, 0x02)
  55. tmr.delay(150)
  56. --5x8 and 2line
  57. sendLcd(0, 0x28)
  58. tmr.delay(70)
  59. --dispoff
  60. sendLcdRaw(0, 0x08)
  61. tmr.delay(70)
  62. --entryset
  63. sendLcdRaw(0, 0x06)
  64. tmr.delay(70)
  65. --clear
  66. sendLcd(0, 0x01)
  67. tmr.delay(70)
  68. --dispon
  69. sendLcd(0, 0x0C)
  70. tmr.delay(70)
  71. end
  72.  
  73. function M.write(ch)
  74. sendLcd(1, string.byte(ch, 1))
  75. end
  76.  
  77. function M.print(s)
  78. for i = 1, #s do
  79. sendLcd(1, string.byte(s, i))
  80. end
  81. end
  82.  
  83. M.ROW_OFFSETS = {0, 0x40, 0x14, 0x54}
  84.  
  85. function M.setCursor(col, row)
  86. local val = bit.bor(0x80, col, M.ROW_OFFSETS[row + 1])
  87. sendLcd(0, val)
  88. end
  89.  
  90. function M.setBacklight(b)
  91. backlight = bit.lshift(b, LSLED)
  92. write(backlight)
  93. end
  94.  
  95. return M
Add Comment
Please, Sign In to add comment