CST816D.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "CST816D.h"
  2. CST816D::CST816D(int8_t sda_pin, int8_t scl_pin, int8_t rst_pin, int8_t int_pin)
  3. {
  4. _sda = sda_pin;
  5. _scl = scl_pin;
  6. _rst = rst_pin;
  7. _int = int_pin;
  8. }
  9. void CST816D::begin(void)
  10. {
  11. // Initialize I2C
  12. if (_sda != -1 && _scl != -1)
  13. {
  14. Wire.begin(_sda, _scl);
  15. }
  16. else
  17. {
  18. Wire.begin();
  19. }
  20. // Int Pin Configuration
  21. if (_int != -1)
  22. {
  23. pinMode(_int, OUTPUT);
  24. digitalWrite(_int, HIGH); //高电平
  25. delay(1);
  26. digitalWrite(_int, LOW); //低电平
  27. delay(1);
  28. }
  29. // Reset Pin Configuration
  30. if (_rst != -1)
  31. {
  32. pinMode(_rst, OUTPUT);
  33. digitalWrite(_rst, LOW);
  34. delay(10);
  35. digitalWrite(_rst, HIGH);
  36. delay(300);
  37. }
  38. // Initialize Touch
  39. i2c_write(0xFE, 0XFF); //禁止自动进入低功耗模式。
  40. }
  41. bool CST816D::getTouch(uint16_t *x, uint16_t *y, uint8_t *gesture)
  42. {
  43. bool FingerIndex = false;
  44. FingerIndex = (bool)i2c_read(0x02);
  45. *gesture = i2c_read(0x01);
  46. if (!(*gesture == SlideUp || *gesture == SlideDown))
  47. {
  48. *gesture = None;
  49. }
  50. uint8_t data[4];
  51. i2c_read_continuous(0x03,data,4);
  52. *x = ((data[0] & 0x0f) << 8) | data[1];
  53. *y = ((data[2] & 0x0f) << 8) | data[3];
  54. // *x=240-*x;
  55. return FingerIndex;
  56. }
  57. uint8_t CST816D::i2c_read(uint8_t addr)
  58. {
  59. uint8_t rdData;
  60. uint8_t rdDataCount;
  61. do
  62. {
  63. Wire.beginTransmission(I2C_ADDR_CST816D);
  64. Wire.write(addr);
  65. Wire.endTransmission(false); // Restart
  66. rdDataCount = Wire.requestFrom(I2C_ADDR_CST816D, 1);
  67. } while (rdDataCount == 0);
  68. while (Wire.available())
  69. {
  70. rdData = Wire.read();
  71. }
  72. return rdData;
  73. }
  74. uint8_t CST816D::i2c_read_continuous(uint8_t addr, uint8_t *data, uint32_t length)
  75. {
  76. Wire.beginTransmission(I2C_ADDR_CST816D);
  77. Wire.write(addr);
  78. if ( Wire.endTransmission(true))return -1;
  79. Wire.requestFrom(I2C_ADDR_CST816D, length);
  80. for (int i = 0; i < length; i++) {
  81. *data++ = Wire.read();
  82. }
  83. return 0;
  84. }
  85. void CST816D::i2c_write(uint8_t addr, uint8_t data)
  86. {
  87. Wire.beginTransmission(I2C_ADDR_CST816D);
  88. Wire.write(addr);
  89. Wire.write(data);
  90. Wire.endTransmission();
  91. }
  92. uint8_t CST816D::i2c_write_continuous(uint8_t addr, const uint8_t *data, uint32_t length)
  93. {
  94. Wire.beginTransmission(I2C_ADDR_CST816D);
  95. Wire.write(addr);
  96. for (int i = 0; i < length; i++) {
  97. Wire.write(*data++);
  98. }
  99. if ( Wire.endTransmission(true))return -1;
  100. return 0;
  101. }