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