Skip to content

Instantly share code, notes, and snippets.

@busbuyukefe
Created September 23, 2023 19:30
Show Gist options
  • Save busbuyukefe/4a17159627c3ea83b4994f346002f061 to your computer and use it in GitHub Desktop.
Save busbuyukefe/4a17159627c3ea83b4994f346002f061 to your computer and use it in GitHub Desktop.
#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