FT5206 capacitive Touch Panel driver for 7 inch BuyDisplay LCD, with 5-point touch.

Committer:
JackB
Date:
Thu Jun 18 21:14:06 2015 +0000
Revision:
0:19406ff51058
Child:
2:5ebf8736e4b2
FT5206 Capacitive Touch Panel driver for 7" BuyDisplay LCD.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:19406ff51058 1 #include "FT5206.h"
JackB 0:19406ff51058 2
JackB 0:19406ff51058 3 FT5206::FT5206(PinName sda, PinName scl, PinName interrupt) : m_i2c(sda, scl), m_interrupt(interrupt) {
JackB 0:19406ff51058 4 m_addr = (FT5206_I2C_ADDRESS << 1);
JackB 0:19406ff51058 5 m_i2c.frequency(FT5206_I2C_FREQUENCY);
JackB 0:19406ff51058 6
JackB 0:19406ff51058 7 // Interrupt
JackB 0:19406ff51058 8 m_interrupt.mode(PullUp);
JackB 0:19406ff51058 9 m_interrupt.enable_irq();
JackB 0:19406ff51058 10 m_interrupt.fall(this, &FT5206::intPanelTouched);
JackB 0:19406ff51058 11
JackB 0:19406ff51058 12 init();
JackB 0:19406ff51058 13 }
JackB 0:19406ff51058 14
JackB 0:19406ff51058 15 bool FT5206::init(void) {
JackB 0:19406ff51058 16 panelTouched = false;
JackB 0:19406ff51058 17
JackB 0:19406ff51058 18 if(DEBUG_OUTPUT_ENABLED) {
JackB 0:19406ff51058 19 printf("Trying to initialize FT5206 by I2C\r\n");
JackB 0:19406ff51058 20 }
JackB 0:19406ff51058 21
JackB 0:19406ff51058 22 writeRegister8(FT5206_DEVICE_MODE, 0);
JackB 0:19406ff51058 23
JackB 0:19406ff51058 24 for (int i = 0; i < 5; i++) {
JackB 0:19406ff51058 25 touchCoordinatesX[0] = -1;
JackB 0:19406ff51058 26 touchCoordinatesY[0] = -1;
JackB 0:19406ff51058 27 }
JackB 0:19406ff51058 28
JackB 0:19406ff51058 29 if(DEBUG_OUTPUT_ENABLED) {
JackB 0:19406ff51058 30 printf("Setup done.\r\n");
JackB 0:19406ff51058 31 }
JackB 0:19406ff51058 32 }
JackB 0:19406ff51058 33
JackB 0:19406ff51058 34 uint8_t FT5206::getTouchPositions(void) {
JackB 0:19406ff51058 35 numberOfTouchPoints = readRegister8(FT5206_TD_STATUS) & 0xF;
JackB 0:19406ff51058 36 gestureID = readRegister8(FT5206_GEST_ID);
JackB 0:19406ff51058 37 status = readRegister8(FT5206_TD_STATUS);
JackB 0:19406ff51058 38
JackB 0:19406ff51058 39 for (int i = 0; i < 5; i++) {
JackB 0:19406ff51058 40 touchCoordinatesX[0] = -1;
JackB 0:19406ff51058 41 touchCoordinatesY[0] = -1;
JackB 0:19406ff51058 42 }
JackB 0:19406ff51058 43 if (numberOfTouchPoints > 0) {
JackB 0:19406ff51058 44 touchCoordinatesX[0] = (readRegister8(FT5206_TOUCH1_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_XL);
JackB 0:19406ff51058 45 touchCoordinatesY[0] = (readRegister8(FT5206_TOUCH1_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_YL);
JackB 0:19406ff51058 46 }
JackB 0:19406ff51058 47 if (numberOfTouchPoints > 1) {
JackB 0:19406ff51058 48 touchCoordinatesX[1] = (readRegister8(FT5206_TOUCH2_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_XL);
JackB 0:19406ff51058 49 touchCoordinatesY[1] = (readRegister8(FT5206_TOUCH2_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_YL);
JackB 0:19406ff51058 50 }
JackB 0:19406ff51058 51 if (numberOfTouchPoints > 2) {
JackB 0:19406ff51058 52 touchCoordinatesX[2] = (readRegister8(FT5206_TOUCH3_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_XL);
JackB 0:19406ff51058 53 touchCoordinatesY[2] = (readRegister8(FT5206_TOUCH3_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_YL);
JackB 0:19406ff51058 54 }
JackB 0:19406ff51058 55 if (numberOfTouchPoints > 3) {
JackB 0:19406ff51058 56 touchCoordinatesX[3] = (readRegister8(FT5206_TOUCH4_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_XL);
JackB 0:19406ff51058 57 touchCoordinatesY[3] = (readRegister8(FT5206_TOUCH4_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_YL);
JackB 0:19406ff51058 58 }
JackB 0:19406ff51058 59 if (numberOfTouchPoints > 4) {
JackB 0:19406ff51058 60 touchCoordinatesX[4] = (readRegister8(FT5206_TOUCH5_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_XL);
JackB 0:19406ff51058 61 touchCoordinatesY[4] = (readRegister8(FT5206_TOUCH5_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_YL);
JackB 0:19406ff51058 62 }
JackB 0:19406ff51058 63 return numberOfTouchPoints;
JackB 0:19406ff51058 64 }
JackB 0:19406ff51058 65
JackB 0:19406ff51058 66
JackB 0:19406ff51058 67 // Interrupt for touch detection
JackB 0:19406ff51058 68 void FT5206::intPanelTouched(void) {
JackB 0:19406ff51058 69 // getTouchPositions();
JackB 0:19406ff51058 70 panelTouched = true;
JackB 0:19406ff51058 71 }
JackB 0:19406ff51058 72
JackB 0:19406ff51058 73 bool FT5206::getPanelTouched(void) {
JackB 0:19406ff51058 74 if (panelTouched == true) {
JackB 0:19406ff51058 75 panelTouched = false;
JackB 0:19406ff51058 76 return true;
JackB 0:19406ff51058 77 } else {
JackB 0:19406ff51058 78 return false;
JackB 0:19406ff51058 79 }
JackB 0:19406ff51058 80 }
JackB 0:19406ff51058 81
JackB 0:19406ff51058 82 char FT5206::readRegister8(char reg) {
JackB 0:19406ff51058 83 char val;
JackB 0:19406ff51058 84 m_i2c.write(m_addr, &reg, 1);
JackB 0:19406ff51058 85 m_i2c.read(m_addr, &val, 1);
JackB 0:19406ff51058 86 return val;
JackB 0:19406ff51058 87 }
JackB 0:19406ff51058 88
JackB 0:19406ff51058 89 void FT5206::writeRegister8(char reg, char val) {
JackB 0:19406ff51058 90 char data[2];
JackB 0:19406ff51058 91 data[0] = reg;
JackB 0:19406ff51058 92 data[1] = val;
JackB 0:19406ff51058 93 m_i2c.write((int)FT5206_I2C_ADDRESS, data, 2);
JackB 0:19406ff51058 94 }