前两日购买了一块TFTLCD,它包括了一块SPI驱动的LCD屏幕,驱动IC是ST7789,电容触摸检测IC,驱动IC是CTS816。
如图蓝色的这块IC就是电容触摸IC,我们查看它的FPC排线组。

其中的1~12为驱动LCD所需要的引脚,13~18为触摸检测需要的IC,前者为SPI驱动,后者使用I2C驱动。因此我们需要分别找到ST7789的驱动和CTS816的驱动。
在GitHub中找到上传的开源代码。
首先是直接找到的这份ST7789的驱动,但是作者给出的三种屏幕大小分别是:240*240,170*320,135*240.
而我们的屏幕大小是240*280,因此我们需要在源代码驱动上添加我们适合我们屏幕的参数。
#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);
}



登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!