前两日购买了一块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);
    }

#ifdefUSING_240X280#
#defineST7789_HEIGHT280#
#defineX_SHIFT0#
#defineX_SHIFT20#
#endif#
嘉立创PCB

还没有评论,抢个沙发!