TM1650.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. module(..., package.seeall)
  2. require "utils"
  3. require "i2c"
  4. require "log"
  5. require "misc"
  6. require "pack"
  7. --注意:此处的i2cslaveaddr是7bit地址
  8. --如果i2c外设手册中给的是8bit地址,需要把8bit地址右移1位,赋值给i2cslaveaddr变量
  9. --如果i2c外设手册中给的是7bit地址,直接把7bit地址赋值给i2cslaveaddr变量即可
  10. --发起一次读写操作时,启动信号后的第一个字节是命令字节
  11. --命令字节的bit0表示读写位,0表示写,1表示读
  12. --命令字节的bit7-bit1,7个bit表示外设地址
  13. --i2c底层驱动在读操作时,用 (i2cslaveaddr << 1) | 0x01 生成命令字节
  14. --i2c底层驱动在写操作时,用 (addr[1] << 1) | 0x00 生成命令字节
  15. local off =0x00--关闭显示
  16. local on =0x01--打开显示
  17. local seven =0x08--
  18. local eight =0x00
  19. local i2cid = 2
  20. local addr = {0x34, 0x35, 0x36, 0x37}--分别用于第一、第二、第三、第四个数 + 亮度设置,地址需右移一位
  21. -- local addr2 = {0x68, 0x6A, 0x6C, 0x6E, 0x48}--分别用于第一、第二、第三、第四个数 + 亮度设置
  22. --7段数码屏
  23. local NUM_7 = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}--数码管显示8段0~f对应的值
  24. --8段数码屏
  25. local NUM_8 = {0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87, 0xFF, 0xEF,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0x00}--数码管显示8段0~f对应的值
  26. local function i2c_open()
  27. if i2c.setup(i2cid, i2c.SLOW) ~= i2c.SLOW then
  28. log.error("TM1650", "I2C.init is: fail")
  29. i2c.close(i2cid)
  30. return
  31. else
  32. log.error("TM1650", "I2C.init is: succeed")
  33. end
  34. return i2c.SLOW
  35. end
  36. ---------------------------------------------数码管显示--------------------------------------
  37. ----------------------------------key demo test-----------------------------------------------------
  38. local key = {
  39. {11,12,13,14},
  40. {21,22,23,24},
  41. {31,32,33,34},
  42. {41,42,43,44},
  43. {51,52,53,54},
  44. {61,62,63,64},
  45. {71,72,73,74}
  46. }
  47. local value = {
  48. {0x44,0x45,0x46,0x47},
  49. {0x4C,0x4D,0x4E,0x4F},
  50. {0x54,0x55,0x56,0x57},
  51. {0x5C,0x5D,0x5E,0x5F},
  52. {0x64,0x65,0x66,0x67},
  53. {0x6C,0x6D,0x6E,0x6F},
  54. {0x74,0x75,0x76,0x77},
  55. }
  56. local i2cid=2
  57. --local revData,key_name
  58. function TM1650_Gate_KEY()
  59. i2c.send(i2cid, 0x24,0x01)--开显示
  60. local revData = i2c.recv(i2cid,0x24,1)--读按键数据
  61. --转成number
  62. local _,keyname=pack.unpack(revData, 'b1')
  63. if keyname ~= nil then
  64. -- log.info("********************",keyname,type(keyname))
  65. -- log.info("keypad test********************")
  66. for i=1,7 do
  67. for j=1,4 do
  68. if (keyname == value[i][j]) then
  69. local keyname = key[i][j]
  70. log.info("key_value--------------", keyname)
  71. return keyname
  72. end
  73. end
  74. end
  75. end
  76. end
  77. sys.taskInit(function()
  78. local slot,dspcnt=0,0
  79. sys.wait(3000)
  80. i2c_open()
  81. while true do
  82. sys.wait(100)
  83. slot = slot+1
  84. if slot %10 ==0 then
  85. dspcnt = dspcnt +1
  86. for k=1,#addr do
  87. i2c.send(i2cid, 0x24,0x01)
  88. i2c.send(i2cid, addr[k], 0x00)
  89. end
  90. for i=1,#addr do
  91. i2c.send(i2cid, 0x24,0x01)
  92. i2c.send(i2cid, addr[i],NUM_8[dspcnt%17 +1])
  93. end
  94. end
  95. --按键读取测试
  96. TM1650_Gate_KEY()
  97. end
  98. end)
  99. -- --数码显示
  100. -- sys.timerLoopStart(TM1650_Write, 2000)