Led74Hc595Driver.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System;
  2. using FunnyCommon.Remoting.Interfaces;
  3. using FunnyCommon.Shared;
  4. namespace FunnyLed595
  5. {
  6. public class Led74Hc595Driver : IDisposable
  7. {
  8. private readonly IRemoteGpoutManager _manager;
  9. private readonly byte _data;
  10. private readonly byte _cs;
  11. private readonly byte _clk;
  12. private IDisposable _bulk;
  13. public Led74Hc595Driver(byte data, byte clk, byte cs, IRemoteGpoutManager manager)
  14. {
  15. _manager = manager;
  16. _data = data;
  17. _clk = clk;
  18. _cs = cs;
  19. using (_manager.CreateBulk())
  20. {
  21. _manager.Allocate(_data);
  22. _manager.Allocate(_clk);
  23. _manager.Allocate(_cs);
  24. _manager.WritePin(_data, false);
  25. _manager.WritePin(_clk, false);
  26. _manager.WritePin(_cs, false);
  27. }
  28. _bulk = _manager.CreateBulk();
  29. }
  30. public void WriteBit(bool value)
  31. {
  32. _manager.WritePin(_data, value);
  33. _manager.Pulse(_clk);//每写一个位 一次时钟脉冲
  34. }
  35. public void WriteByte(byte b)
  36. {
  37. //从最高位开始写入
  38. for (var i = 8; i >= 1; i--)
  39. {
  40. WriteBit((b & 0x80) > 0);
  41. b <<= 1;
  42. }
  43. }
  44. public void Flush()
  45. {
  46. _manager.Pulse(_cs);
  47. _bulk.Dispose();
  48. _bulk = _manager.CreateBulk();
  49. }
  50. public void Dispose()
  51. {
  52. _manager.Dispose();
  53. }
  54. }
  55. }