前两日购买了一块TFTLCD,它包括了一块SPI驱动的LCD屏幕,驱动IC是ST7789,电容触摸检测IC,驱动IC是CTS816。
如图蓝色的这块IC就是电容触摸IC,我们查看它的FPC排线组。
其中的1~12为驱动LCD所需要的引脚,13~18为触摸检测需要的IC,前者为SPI驱动,后者使用I2C驱动。因此我们需要分别找到ST7789的驱动和CTS816的驱动。
在GitHub中找到上传的开源代码。
首先是直接找到的这份ST7789的驱动,但是作者给出的三种屏幕大小分别是:240240,170320,135240.
而我们的屏幕大小是240280,因此我们需要在源代码驱动上添加我们适合我们屏幕的参数。
#ifdef USING_240X280
#define ST7789_WIDTH 240 #define ST7789_HEIGHT 280
#if ST7789_ROTATION == 0 #define X_SHIFT 0 #define Y_SHIFT 20 #elif ST7789_ROTATION == 1 #define X_SHIFT 20 #define Y_SHIFT 0 #elif ST7789_ROTATION == 2 #define X_SHIFT 0 #define Y_SHIFT 20 #elif ST7789_ROTATION == 3 #define X_SHIFT 20 #define Y_SHIFT 0 #endif
#endif
我们在原来的基础上定义我们的屏幕参数的宏定义,主要包括屏幕的大小,以及XY轴的偏移量,这就是深度封装的好处,可以不用大刀阔斧的修改代码,只需要修改相应的宏定义即可。
当然这个XY的偏移量是试出来的,偏移量不对的话会有部分的地方呈现雪花状。
关于CST816的STM32比较少,在Github上找到一份可以用的驱动,不过它的默认源代码是软件I2C,而我比较喜欢硬件I2C,于是把他原来的软件I2C驱动修改为硬件I2C
HAL_StatusTypeDef CST816_Init(I2C_HandleTypeDef *hi2c);HAL_StatusTypeDef CST816_ReadData(I2C_HandleTypeDef *hi2c, CST816_Data *data);void cst816_Set_Sleep_Time(I2C_HandleTypeDef *hi2c, uint8_t sec);void cst816_Clear_pos_and_ges(void);
如果大家需要这两份修改后的驱动可以在主页找到我的联系方式。 之后在主函数中添加屏幕和触摸屏的代码。
if (CST816_Init(&hi2c2) != HAL_OK) { // printf("CST816 initialization failed!n"); HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10); HAL_Delay(500); } while (1) { CST816_Data touch_data; if (CST816_ReadData(&hi2c2, &touch_data) == HAL_OK) { if (touch_data.finger_num > 0) { //printf("检测到触摸,坐标: (%d, %d)n", touch_data.x, touch_data.y); // 在触摸点画一个小圆 ST7789_DrawFilledCircle(touch_data.x, touch_data.y, 5, RED); switch(touch_data.gesture) { case GESTURE_SWIPE_UP: //printf("向上滑动n"); break; case GESTURE_SWIPE_DOWN: //printf("向下滑动n"); break; // ... 其他手势处理 ... } } } HAL_Delay(10); }
后续可能用该屏幕直接画到一块H5或者H7的板子上,做一些测试。