shift595.lua 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. --[[
  2. @module shift595
  3. @summary shift595 74HC595芯片
  4. @version 1.0
  5. @date 2023.08.30
  6. @author lulipro
  7. @usage
  8. --注意:
  9. --1、初始化时必须提供sclk移位时钟引脚和dat数据引脚,rclk根据应用需求可选
  10. --2、AIR101官方核心板,底层为LuatOS-SoC_V0017_AIR101.soc,经测试此脚本库的串行时钟频率为18KHz
  11. --用法实例:
  12. --硬件模块:双595驱动的共阳极4位数码管
  13. local shift595 = require("shift595")
  14. sys.taskInit(function()
  15. shift595.init(pin.PB08,pin.PB09,pin.PB10) -- sclk,dat,rclk
  16. while 1 do
  17. local wei = 1
  18. for i = 0, 3, 1 do
  19. shift595.out(0x82,shift595.MSB)--发送段数据 ,然后是位选数据
  20. shift595.out(wei,shift595.MSB)--发送段数据 ,然后是位选数据
  21. shift595.latch() --锁存
  22. wei = wei<<1
  23. sys.wait(500)
  24. end
  25. sys.wait(1000)
  26. end
  27. end
  28. )
  29. ]]
  30. local shift595 = {}
  31. local sys = require "sys"
  32. shift595.MSB=0 --字节串行输出时先发送最高位
  33. shift595.LSB=1 --字节串行输出时先发送最低位
  34. local SHIFT595_SCLK --串行移位时钟引脚
  35. local SHIFT595_DAT --串行数据引脚
  36. local SHIFT595_RCLK --锁存信号时钟引脚
  37. --[[
  38. 75hc595芯片初始化
  39. @api shift595.init(sclk,dat,rclk)
  40. @number sclk,定义驱动595串行时钟信号的引脚
  41. @number dat,定义驱动595串行数据的引脚
  42. @number rclk,定义驱动595锁存信号的引脚,可选
  43. @usage
  44. shift595.init(pin.PB08,pin.PB09,pin.PB10) -- sclk,dat,rclk
  45. ]]
  46. function shift595.init(sclk,dat,rclk)
  47. SHIFT595_SCLK = gpio.setup(sclk, 1)
  48. SHIFT595_DAT = gpio.setup(dat, 1)
  49. if rclk then
  50. SHIFT595_RCLK = gpio.setup(rclk, 1)
  51. else
  52. SHIFT595_RCLK = nil
  53. end
  54. end
  55. --[[
  56. 串行输出一个字节到74hc595芯片的移位寄存器中
  57. @api shift595.out(dat,endian)
  58. @number dat,发送的字节数据
  59. @number endian,指定发送字节数据时的大小端模式,有shift595.MSB和shift595.LSB两种参数可选。默认shift595.MSB
  60. @usage
  61. shift595.out(0x82,shift595.MSB)
  62. shift595.out(0x82) --默认shift595.MSB,与上面等价
  63. ]]
  64. function shift595.out(dat,endian)
  65. local mbit
  66. for i = 0, 7, 1 do
  67. SHIFT595_SCLK(0)
  68. if endian == shift595.LSB then
  69. mbit = ((dat>>i)&0x01~=0) and 1 or 0
  70. else
  71. mbit = ((dat<<i)&0x80~=0) and 1 or 0
  72. end
  73. SHIFT595_DAT(mbit)
  74. SHIFT595_SCLK(1)
  75. end
  76. end
  77. --[[
  78. 给74hc595芯片的RCLK线一个高脉冲,使得移位寄存器中的数据转移到锁存器中,当OE使能时,数据就输出到QA~QH引脚上。如果初始化时没用到rclk引脚则此函数调用无效。
  79. @api shift595.latch()
  80. @usage
  81. shift595.latch()
  82. ]]
  83. function shift595.latch()
  84. if SHIFT595_RCLK then
  85. SHIFT595_RCLK(0)
  86. SHIFT595_RCLK(1)
  87. end
  88. end
  89. return shift595