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

Committer:
JackB
Date:
Fri Jun 19 08:39:50 2015 +0000
Revision:
2:5ebf8736e4b2
Parent:
0:19406ff51058
Minor update, get touch coordinates during interrupt

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 2:5ebf8736e4b2 15 void 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
JackB 0:19406ff51058 37 for (int i = 0; i < 5; i++) {
JackB 0:19406ff51058 38 touchCoordinatesX[0] = -1;
JackB 0:19406ff51058 39 touchCoordinatesY[0] = -1;
JackB 0:19406ff51058 40 }
JackB 0:19406ff51058 41 if (numberOfTouchPoints > 0) {
JackB 0:19406ff51058 42 touchCoordinatesX[0] = (readRegister8(FT5206_TOUCH1_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_XL);
JackB 0:19406ff51058 43 touchCoordinatesY[0] = (readRegister8(FT5206_TOUCH1_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH1_YL);
JackB 0:19406ff51058 44 }
JackB 0:19406ff51058 45 if (numberOfTouchPoints > 1) {
JackB 0:19406ff51058 46 touchCoordinatesX[1] = (readRegister8(FT5206_TOUCH2_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_XL);
JackB 0:19406ff51058 47 touchCoordinatesY[1] = (readRegister8(FT5206_TOUCH2_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH2_YL);
JackB 0:19406ff51058 48 }
JackB 0:19406ff51058 49 if (numberOfTouchPoints > 2) {
JackB 0:19406ff51058 50 touchCoordinatesX[2] = (readRegister8(FT5206_TOUCH3_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_XL);
JackB 0:19406ff51058 51 touchCoordinatesY[2] = (readRegister8(FT5206_TOUCH3_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH3_YL);
JackB 0:19406ff51058 52 }
JackB 0:19406ff51058 53 if (numberOfTouchPoints > 3) {
JackB 0:19406ff51058 54 touchCoordinatesX[3] = (readRegister8(FT5206_TOUCH4_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_XL);
JackB 0:19406ff51058 55 touchCoordinatesY[3] = (readRegister8(FT5206_TOUCH4_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH4_YL);
JackB 0:19406ff51058 56 }
JackB 0:19406ff51058 57 if (numberOfTouchPoints > 4) {
JackB 0:19406ff51058 58 touchCoordinatesX[4] = (readRegister8(FT5206_TOUCH5_XH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_XL);
JackB 0:19406ff51058 59 touchCoordinatesY[4] = (readRegister8(FT5206_TOUCH5_YH) & 0x0f)*256 + readRegister8(FT5206_TOUCH5_YL);
JackB 0:19406ff51058 60 }
JackB 0:19406ff51058 61 return numberOfTouchPoints;
JackB 0:19406ff51058 62 }
JackB 0:19406ff51058 63
JackB 0:19406ff51058 64
JackB 0:19406ff51058 65 // Interrupt for touch detection
JackB 0:19406ff51058 66 void FT5206::intPanelTouched(void) {
JackB 2:5ebf8736e4b2 67 getTouchPositions();
JackB 0:19406ff51058 68 panelTouched = true;
JackB 0:19406ff51058 69 }
JackB 0:19406ff51058 70
JackB 0:19406ff51058 71 bool FT5206::getPanelTouched(void) {
JackB 0:19406ff51058 72 if (panelTouched == true) {
JackB 0:19406ff51058 73 panelTouched = false;
JackB 0:19406ff51058 74 return true;
JackB 0:19406ff51058 75 } else {
JackB 0:19406ff51058 76 return false;
JackB 0:19406ff51058 77 }
JackB 0:19406ff51058 78 }
JackB 0:19406ff51058 79
JackB 0:19406ff51058 80 char FT5206::readRegister8(char reg) {
JackB 0:19406ff51058 81 char val;
JackB 0:19406ff51058 82 m_i2c.write(m_addr, &reg, 1);
JackB 0:19406ff51058 83 m_i2c.read(m_addr, &val, 1);
JackB 0:19406ff51058 84 return val;
JackB 0:19406ff51058 85 }
JackB 0:19406ff51058 86
JackB 0:19406ff51058 87 void FT5206::writeRegister8(char reg, char val) {
JackB 0:19406ff51058 88 char data[2];
JackB 0:19406ff51058 89 data[0] = reg;
JackB 0:19406ff51058 90 data[1] = val;
JackB 0:19406ff51058 91 m_i2c.write((int)FT5206_I2C_ADDRESS, data, 2);
JackB 0:19406ff51058 92 }