i2c_ssd1306_lcd.lua 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. --- 模块功能:SSD 1306驱动芯片 I2C屏幕显示测试
  2. -- @author openLuat
  3. -- @module ui.mono_i2c_ssd1306
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.07.03
  7. module(..., package.seeall)
  8. -- i2cid 1,2,3对应硬件的I2C1,I2C2,I2C3
  9. -- 之前的i2cid为0不再使用
  10. local i2cid = 2
  11. local i2cslaveaddr = 0x3c
  12. --注意:此处的i2cslaveaddr是7bit地址
  13. --如果i2c外设手册中给的是8bit地址,需要把8bit地址右移1位,赋值给i2cslaveaddr变量
  14. --如果i2c外设手册中给的是7bit地址,直接把7bit地址赋值给i2cslaveaddr变量即可
  15. --发起一次读写操作时,启动信号后的第一个字节是命令字节
  16. --命令字节的bit0表示读写位,0表示写,1表示读
  17. --命令字节的bit7-bit1,7个bit表示外设地址
  18. --i2c底层驱动在读操作时,用 (i2cslaveaddr << 1) | 0x01 生成命令字节
  19. --i2c底层驱动在写操作时,用 (i2cslaveaddr << 1) | 0x00 生成命令字节
  20. --向屏幕发送命令字
  21. local function lcd_write_cmd(val)
  22. --向从设备的寄存器地址0x00中写1字节的数据val
  23. i2c.write(i2cid,0x00,val)
  24. --该代码与下面的代码等价
  25. --向从设备i2cslaveaddr发送寄存器地址0x00与数据val
  26. --i2c.send(i2cid,i2cslaveaddr,{0x00,val})
  27. end
  28. --向屏幕发送数据
  29. local function lcd_write_data(val)
  30. --向从设备的寄存器地址0x40中写1字节的数据val
  31. i2c.write(i2cid,0x40,val)
  32. --该代码与下面的代码等价
  33. --向从设备i2cslaveaddr发送寄存器地址0x40与数据val
  34. --i2c.send(i2cid,i2cslaveaddr,{0x40,val})
  35. end
  36. --[[
  37. 函数名:i2cShow
  38. 功能 :打开i2c,并设置屏幕显示内容
  39. 参数 :无
  40. 返回值:无
  41. 说明 : 此函数演示setup、send和recv接口的使用方式
  42. ]]
  43. local function i2cShow()
  44. if i2c.setup(i2cid,i2c.SLOW,i2cslaveaddr) ~= i2c.SLOW then
  45. print("testI2c.init fail")
  46. return
  47. end
  48. local cmd = {0xAE, 0X00, 0x10, 0x40, 0x81, 0x7f, 0xA1, 0XA6, 0XA8, 63, 0XC8, 0XD3, 0X00, 0XD5, 0X80, 0XDA, 0X12, 0X8D, 0X14, 0X20, 0X01, 0XAF}
  49. local i
  50. lcd_write_cmd(0xAF)
  51. lcd_write_cmd(0xAF)
  52. lcd_write_cmd(0xAF)
  53. lcd_write_cmd(0xAF)
  54. log.info("zwb_Lua lcd_write_cmd cmd ", 0xAF)
  55. for i=1,#cmd do
  56. log.info("zwb_Lua lcd_write_cmd cmd1 ", lcd_write_cmd(cmd[i]))
  57. end
  58. local cmd2 = {0X21, 0X00, 0X7F}
  59. for i=1,3 do
  60. log.info("zwb_Lua lcd_write_cmd cmd2 ", lcd_write_cmd(cmd2[i]))
  61. end
  62. for i=1,128*4 do
  63. lcd_write_data(0)
  64. lcd_write_data(0)
  65. end
  66. lcd_write_cmd(0x22)
  67. lcd_write_cmd(2)
  68. lcd_write_cmd(3)
  69. lcd_write_cmd(0x21)
  70. lcd_write_cmd(43)
  71. lcd_write_cmd(63)
  72. local cmd_G = {0x0, 0x0,0xf0, 0x7,0xf8, 0xf,0x8, 0x8,0x98, 0xf,0x90, 0x7,0x0, 0x0}
  73. local cmd_O = {0x0, 0x0,0xf0, 0x7,0xf8, 0xf,0x8, 0x8,0xf8, 0xf,0xf0, 0x7,0x0, 0x0}
  74. local cmd_ = {0x0, 0x0,0x0, 0x0,0xf8, 0xd,0xf8, 0xd,0x0, 0x0,0x0, 0x0,0x0, 0x0}
  75. for i=1,#cmd_G do
  76. lcd_write_data(cmd_G[i])
  77. end
  78. for i=1,#cmd_O do
  79. lcd_write_data(cmd_O[i])
  80. end
  81. for i=1,#cmd_ do
  82. lcd_write_data(cmd_[i])
  83. end
  84. --从从设备的寄存器地址0x20中读1字节的数据,并且打印出来
  85. log.info("zwb_Lua 0x20 read",string.toHex(i2c.read(i2cid,0x20,1)))
  86. --该代码与下面的代码等价
  87. --向从设备i2cslaveaddr发送寄存器地址0x20
  88. i2c.send(i2cid,i2cslaveaddr,0x20)
  89. --读取从设备i2cslaveaddr寄存器内的1个字节的数据,并且打印出来
  90. log.info("zwb_Lua 0x20 recv",string.toHex(i2c.recv(i2cid,i2cslaveaddr,1)))
  91. i2c.close(i2cid)
  92. end
  93. --显示内容
  94. sys.timerLoopStart(function ()
  95. i2cShow()
  96. end, 3000)