pca9685.h 5.4 KB

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