-
-
Save busbuyukefe/4a17159627c3ea83b4994f346002f061 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef _CST820_H | |
#define _CST820_H | |
#include <Wire.h> | |
#define I2C_ADDR_CST820 0x15 | |
//手势 | |
enum GESTURE | |
{ | |
None = 0x00, //无手势 | |
SlideDown = 0x01, //向下滑动 | |
SlideUp = 0x02, //向上滑动 | |
SlideLeft = 0x03, //向左滑动 | |
SlideRight = 0x04, //向右滑动 | |
SingleTap = 0x05, //单击 | |
DoubleTap = 0x0B, //双击 | |
LongPress = 0x0C //长按 | |
}; | |
/**************************************************************************/ | |
/*! | |
@brief CST820 I2C CTP controller driver | |
*/ | |
/**************************************************************************/ | |
class CST820 | |
{ | |
public: | |
CST820(int8_t sda_pin = -1, int8_t scl_pin = -1, int8_t rst_pin = -1, int8_t int_pin = -1); | |
void begin(void); | |
bool getTouch(uint16_t *x, uint16_t *y, uint8_t *gesture); | |
private: | |
int8_t _sda, _scl, _rst, _int; | |
uint8_t i2c_read(uint8_t addr); | |
uint8_t i2c_read_continuous(uint8_t addr, uint8_t *data, uint32_t length); | |
void i2c_write(uint8_t addr, uint8_t data); | |
uint8_t i2c_write_continuous(uint8_t addr, const uint8_t *data, uint32_t length); | |
}; | |
CST820::CST820(int8_t sda_pin, int8_t scl_pin, int8_t rst_pin, int8_t int_pin) | |
{ | |
_sda = sda_pin; | |
_scl = scl_pin; | |
_rst = rst_pin; | |
_int = int_pin; | |
} | |
void CST820::begin(void) | |
{ | |
// Initialize I2C | |
if (_sda != -1 && _scl != -1) | |
{ | |
Wire.begin(_sda, _scl); | |
} | |
else | |
{ | |
Wire.begin(); | |
} | |
// Int Pin Configuration | |
if (_int != -1) | |
{ | |
pinMode(_int, OUTPUT); | |
digitalWrite(_int, HIGH); //高电平 | |
delay(1); | |
digitalWrite(_int, LOW); //低电平 | |
delay(1); | |
} | |
// Reset Pin Configuration | |
if (_rst != -1) | |
{ | |
pinMode(_rst, OUTPUT); | |
digitalWrite(_rst, LOW); | |
delay(10); | |
digitalWrite(_rst, HIGH); | |
delay(300); | |
} | |
// Initialize Touch | |
i2c_write(0xFE, 0XFF); //禁止自动进入低功耗模式。 | |
} | |
bool CST820::getTouch(uint16_t *x, uint16_t *y, uint8_t *gesture) | |
{ | |
bool FingerIndex = false; | |
FingerIndex = (bool)i2c_read(0x02); | |
*gesture = i2c_read(0x01); | |
if (!(*gesture == SlideUp || *gesture == SlideDown)) | |
{ | |
*gesture = None; | |
} | |
uint8_t data[4]; | |
i2c_read_continuous(0x03, data, 4); | |
*x = ((data[0] & 0x0f) << 8) | data[1]; | |
*y = ((data[2] & 0x0f) << 8) | data[3]; | |
return FingerIndex; | |
} | |
uint8_t CST820::i2c_read(uint8_t addr) | |
{ | |
uint8_t rdData; | |
uint8_t rdDataCount; | |
do | |
{ | |
Wire.beginTransmission(I2C_ADDR_CST820); | |
Wire.write(addr); | |
Wire.endTransmission(false); // Restart | |
rdDataCount = Wire.requestFrom(I2C_ADDR_CST820, 1); | |
} while (rdDataCount == 0); | |
while (Wire.available()) | |
{ | |
rdData = Wire.read(); | |
} | |
return rdData; | |
} | |
uint8_t CST820::i2c_read_continuous(uint8_t addr, uint8_t *data, uint32_t length) | |
{ | |
Wire.beginTransmission(I2C_ADDR_CST820); | |
Wire.write(addr); | |
if (Wire.endTransmission(true)) | |
return -1; | |
Wire.requestFrom(I2C_ADDR_CST820, length); | |
for (int i = 0; i < length; i++) | |
{ | |
*data++ = Wire.read(); | |
} | |
return 0; | |
} | |
void CST820::i2c_write(uint8_t addr, uint8_t data) | |
{ | |
Wire.beginTransmission(I2C_ADDR_CST820); | |
Wire.write(addr); | |
Wire.write(data); | |
Wire.endTransmission(); | |
} | |
uint8_t CST820::i2c_write_continuous(uint8_t addr, const uint8_t *data, uint32_t length) | |
{ | |
Wire.beginTransmission(I2C_ADDR_CST820); | |
Wire.write(addr); | |
for (int i = 0; i < length; i++) | |
{ | |
Wire.write(*data++); | |
} | |
if (Wire.endTransmission(true)) | |
return -1; | |
return 0; | |
} | |
#define I2C_SDA 33 | |
#define I2C_SCL 32 | |
#define TP_RST 25 | |
#define TP_INT 21 | |
CST820 touch(I2C_SDA, I2C_SCL, TP_RST, TP_INT); | |
void setup() | |
{ | |
Serial.begin(115200); | |
touch.begin(); | |
} | |
uint8_t gesture; | |
uint16_t touchX, touchY; | |
void loop() | |
{ | |
touch.getTouch(&touchX, &touchY, &gesture); | |
Serial.print(touchX); | |
Serial.print(" "); | |
Serial.println(touchY); | |
delay(100); | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment