PCA9554.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "PCA9554.h"
  2. PCA9554::PCA9554(byte SlaveAddress)
  3. {
  4. _SlaveAddress = SlaveAddress;
  5. }
  6. bool PCA9554::twiRead(byte &registerAddress)
  7. {
  8. Wire.beginTransmission(_SlaveAddress);
  9. Wire.write(registerAddress);
  10. if (Wire.endTransmission() == 0)
  11. {
  12. delay(15);
  13. Wire.requestFrom((uint8_t)_SlaveAddress, (uint8_t)1);
  14. while (Wire.available() < 1);
  15. registerAddress = Wire.read();
  16. return true;
  17. }
  18. return false;
  19. }
  20. bool PCA9554::twiWrite(byte registerAddress, byte dataWrite)
  21. {
  22. Wire.beginTransmission(_SlaveAddress);
  23. Wire.write(registerAddress);
  24. Wire.write(dataWrite);
  25. if (Wire.endTransmission() == 0)
  26. return true;
  27. return false;
  28. }
  29. bool PCA9554::pinMode0(byte pinNumber, bool state)
  30. {
  31. byte oldValue = CONFIGPORT0;
  32. if (this->twiRead(oldValue) && (pinNumber <= 7))
  33. {
  34. if (!state)
  35. {
  36. oldValue |= (1 << pinNumber);
  37. if (this->portMode0(oldValue))
  38. return true;
  39. return false;
  40. }
  41. else if (state)
  42. {
  43. oldValue &= ~(1 << pinNumber);
  44. if (this->portMode0(oldValue))
  45. return true;
  46. return false;
  47. }
  48. }
  49. return false;
  50. }
  51. /* bool PCA9554::pinMode1(byte pinNumber, bool state)
  52. {
  53. byte oldValue = CONFIGPORT1;
  54. if(this->twiRead(oldValue) && (pinNumber <= 7))
  55. {
  56. if(!state)
  57. {
  58. oldValue |= (1 << pinNumber);
  59. if(this->portMode1(oldValue))
  60. return true;
  61. return false;
  62. }
  63. else if(state)
  64. {
  65. oldValue &= ~(1 << pinNumber);
  66. if(this->portMode1(oldValue))
  67. return true;
  68. return false;
  69. }
  70. }
  71. return false;
  72. } */
  73. bool PCA9554::portMode0(byte value)
  74. {
  75. if (this->twiWrite(CONFIGPORT0, value))
  76. return true;
  77. return false;
  78. }
  79. /* bool PCA9554::portMode1(byte value)
  80. {
  81. if(this->twiWrite(CONFIGPORT1, value))
  82. return true;
  83. return false;
  84. } */
  85. bool PCA9554::digitalWrite0(byte pinNumber, bool state)
  86. {
  87. byte oldValue = OUTPUTPORT0;
  88. if (this->twiRead(oldValue) && pinNumber <= 7)
  89. {
  90. if (state)
  91. {
  92. oldValue |= (1 << pinNumber);
  93. if (this->digitalWritePort0(oldValue))
  94. return true;
  95. return false;
  96. }
  97. else if (!state)
  98. {
  99. oldValue &= ~(1 << pinNumber);
  100. if (this->digitalWritePort0(oldValue))
  101. return true;
  102. return false;
  103. }
  104. }
  105. return false;
  106. }
  107. /* bool PCA9554::digitalWrite1(byte pinNumber, bool state)
  108. {
  109. byte oldValue = OUTPUTPORT1;
  110. if(this->twiRead(oldValue) && pinNumber <= 7)
  111. {
  112. if(state)
  113. {
  114. oldValue |= (1 << pinNumber);
  115. if(this->digitalWritePort1(oldValue))
  116. return true;
  117. return false;
  118. }
  119. else if(!state)
  120. {
  121. oldValue &= ~(1 << pinNumber);
  122. if(this->digitalWritePort1(oldValue))
  123. return true;
  124. return false;
  125. }
  126. }
  127. return false;
  128. } */
  129. bool PCA9554::digitalWritePort0(byte value)
  130. {
  131. if (this->twiWrite(OUTPUTPORT0, value))
  132. return true;
  133. return false;
  134. }
  135. /* bool PCA9554::digitalWritePort1(byte value)
  136. {
  137. if(this->twiWrite(OUTPUTPORT1, value))
  138. return true;
  139. return false;
  140. } */
  141. bool PCA9554::digitalRead0(byte &pinNumber)
  142. {
  143. byte oldValue = INPUTPORT0;
  144. if (this->twiRead(oldValue) && (pinNumber <= 7))
  145. {
  146. oldValue &= (1 << pinNumber);
  147. if (oldValue > 0) pinNumber = 1;
  148. else pinNumber = 0;
  149. return true;
  150. }
  151. return false;
  152. }
  153. /* bool PCA9554::digitalRead1(byte &pinNumber)
  154. {
  155. byte oldValue = INPUTPORT1;
  156. if(this->twiRead(oldValue) && (pinNumber <= 7))
  157. {
  158. oldValue &= (1 << pinNumber);
  159. if(oldValue > 0) pinNumber = 1;
  160. else pinNumber = 0;
  161. return true;
  162. }
  163. return false;
  164. }
  165. */
  166. bool PCA9554::digitalReadPort0(byte &value)
  167. {
  168. value = INPUTPORT0;
  169. if (this->twiRead(value))
  170. return true;
  171. return false;
  172. }
  173. /* bool PCA9554::digitalReadPort1(byte &value)
  174. {
  175. value = INPUTPORT1;
  176. if(this->twiRead(value))
  177. return true;
  178. return false;
  179. }
  180. */