pca9685.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #ifndef _PCA_9685_H_
  2. #define _PCA_9685_H_
  3. #define PCA9685_ADDR_1 0x41
  4. #define PCA9685_ADDR_2 0x42
  5. #define PCA9685_ADDR_3 0x43
  6. // Hardcoded addresses available on powerup
  7. #define PCA9685_All_Call 0x70 // Default enabled
  8. #define PCA9685_Sub_Call_1 0x71 // Default disabled
  9. #define PCA9685_Sub_Call_2 0x72 // Default disabled
  10. #define PCA9685_Sub_Call_3 0x73 // Default disabled
  11. #define PCA9685_Reset 0x03 // Default enabled?
  12. #define PCA9685_Max_Brightness 4096
  13. #define PCA9685_Min_Brightness 0
  14. typedef union {
  15. struct {
  16. char ALLCALL : 1;
  17. char SUB3 : 1;
  18. char SUB2 : 1;
  19. char SUB1 : 1;
  20. char SLEEP : 1;
  21. char AI : 1;
  22. char EXTCLK : 1;
  23. char RESTART : 1;
  24. };
  25. char AS_BYTE;
  26. } REG_MODE1;
  27. typedef union {
  28. struct {
  29. char OUTNE : 2;
  30. char OUTDRV : 1;
  31. char OCH : 1;
  32. char INVRT : 1;
  33. char : 3;
  34. };
  35. char AS_BYTE;
  36. } REG_MODE2;
  37. typedef union {
  38. struct {
  39. ushort ON : 12;
  40. ushort ON_FULL : 1;
  41. ushort : 3;
  42. ushort OFF : 12;
  43. ushort OFF_FULL : 1;
  44. ushort : 3;
  45. };
  46. char AS_BYTE[4];
  47. } LED_CTRL;
  48. typedef union {
  49. struct {
  50. ushort ON : 12;
  51. ushort ON_FULL : 1;
  52. ushort : 3;
  53. ushort OFF : 12;
  54. ushort OFF_FULL : 1;
  55. ushort : 3;
  56. };
  57. char AS_BYTE[4];
  58. } ALL_LED_CTRL;
  59. typedef union {
  60. struct {
  61. REG_MODE1 MODE1; // +0x00
  62. REG_MODE2 MODE2; // +0x01
  63. char SUBADR1; // +0x02
  64. char SUBADR2; // +0x03
  65. char SUBADR3; // +0x04
  66. char ALLCALLADR; // +0x05
  67. LED_CTRL LED0; // +0x06
  68. LED_CTRL LED1; // +0x0A
  69. LED_CTRL LED2; // +0x0E
  70. LED_CTRL LED3; // +0x12
  71. LED_CTRL LED4; // +0x16
  72. LED_CTRL LED5; // +0x1A
  73. LED_CTRL LED6; // +0x1E
  74. LED_CTRL LED7; // +0x22
  75. LED_CTRL LED8; // +0x26
  76. LED_CTRL LED9; // +0x2A
  77. LED_CTRL LED10; // +0x2E
  78. LED_CTRL LED11; // +0x32
  79. LED_CTRL LED12; // +0x36
  80. LED_CTRL LED13; // +0x3A
  81. LED_CTRL LED14; // +0x3E
  82. LED_CTRL LED15; // +0x42
  83. char RESERVED[180]; // +0x46
  84. ALL_LED_CTRL ALL_LED; // +0xFA
  85. char PRE_SCALE; // +0xFE
  86. char TestMode; // +0xFF
  87. };
  88. char AS_BYTE[0x100];
  89. } PCA9685_REGS;
  90. #define TUBE_DOT_ADDR PCA9685_ADDR_2
  91. #define TUBE_DOT_PIN LED15
  92. #define MAP_ADDR 0
  93. #define MAP_PIN 1
  94. const char Tube_Mapping[4][10][2] =
  95. { {
  96. { PCA9685_ADDR_1, 8 }, // Tube 0 Digit 0
  97. { PCA9685_ADDR_1, 9 }, // Tube 0 Digit 1
  98. { PCA9685_ADDR_1, 10 }, // Tube 0 Digit 2
  99. { PCA9685_ADDR_1, 12 }, // Tube 0 Digit 3
  100. { PCA9685_ADDR_1, 15 }, // Tube 0 Digit 4
  101. { PCA9685_ADDR_1, 14 }, // Tube 0 Digit 5
  102. { PCA9685_ADDR_1, 11 }, // Tube 0 Digit 6
  103. { PCA9685_ADDR_1, 0 }, // Tube 0 Digit 7
  104. { PCA9685_ADDR_1, 1 }, // Tube 0 Digit 8
  105. { PCA9685_ADDR_1, 13 }, // Tube 0 Digit 9
  106. },
  107. {
  108. { PCA9685_ADDR_1, 5 }, // Tube 1 Digit 0
  109. { PCA9685_ADDR_1, 6 }, // Tube 1 Digit 1
  110. { PCA9685_ADDR_1, 7 }, // Tube 1 Digit 2
  111. { PCA9685_ADDR_1, 2 }, // Tube 1 Digit 3
  112. { PCA9685_ADDR_2, 4 }, // Tube 1 Digit 4
  113. { PCA9685_ADDR_2, 1 }, // Tube 1 Digit 5
  114. { PCA9685_ADDR_1, 4 }, // Tube 1 Digit 6
  115. { PCA9685_ADDR_2, 2 }, // Tube 1 Digit 7
  116. { PCA9685_ADDR_2, 3 }, // Tube 1 Digit 8
  117. { PCA9685_ADDR_1, 3 }, // Tube 1 Digit 9
  118. },
  119. {
  120. { PCA9685_ADDR_3, 8 }, // Tube 2 Digit 0
  121. { PCA9685_ADDR_3, 9 }, // Tube 2 Digit 1
  122. { PCA9685_ADDR_3, 10 }, // Tube 2 Digit 2
  123. { PCA9685_ADDR_3, 12 }, // Tube 2 Digit 3
  124. { PCA9685_ADDR_2, 12 }, // Tube 2 Digit 4
  125. { PCA9685_ADDR_2, 13 }, // Tube 2 Digit 5
  126. { PCA9685_ADDR_3, 11 }, // Tube 2 Digit 6
  127. { PCA9685_ADDR_2, 14 }, // Tube 2 Digit 7
  128. { PCA9685_ADDR_2, 11 }, // Tube 2 Digit 8
  129. { PCA9685_ADDR_3, 13 }, // Tube 2 Digit 9
  130. },
  131. {
  132. { PCA9685_ADDR_3, 5 }, // Tube 3 Digit 0
  133. { PCA9685_ADDR_3, 6 }, // Tube 3 Digit 1
  134. { PCA9685_ADDR_3, 7 }, // Tube 3 Digit 2
  135. { PCA9685_ADDR_3, 2 }, // Tube 3 Digit 3
  136. { PCA9685_ADDR_3, 14 }, // Tube 3 Digit 4
  137. { PCA9685_ADDR_3, 15 }, // Tube 3 Digit 5
  138. { PCA9685_ADDR_3, 4 }, // Tube 3 Digit 6
  139. { PCA9685_ADDR_3, 1 }, // Tube 3 Digit 7
  140. { PCA9685_ADDR_3, 0 }, // Tube 3 Digit 8
  141. { PCA9685_ADDR_3, 3 }, // Tube 3 Digit 9
  142. } };
  143. void PCA9685_Init(void);
  144. void PCA9685_SetVoltage(float Percent);
  145. void PCA9685_SetDigit(int Tube, int Digit, int Brightness);
  146. void PCA9685_SetDigitPwm(int Tube, int Digit, int StartPwm, int EndPwm);
  147. void PCA9685_SetDot(int Brightness);
  148. void PCA9685_SetDotPwm(int StartPwm, int EndPwm);
  149. void PCA9685_EnableOutput(bool Enabled);
  150. #endif