继上次移植了GUI-Guider生成的GUI界面后,显示没什么问题了。但是只有显示,不能操作,看起来还是不完整。这次就分享如何移植输入设备,可以点击和移动操作。
输入设备移植文件主要是这个。如图,可以看到lvgl支持触摸指针设备,鼠标,键盘,encoder,button。
本次是通过串口方式发送数据模拟触摸指针设备。下面是主要修改步骤。
串口接收6个字节,定义结构体变量映射6个字节。代码如下。
主要是初始化,获取点击状态,获取x,y坐标这3个函数。
extern union Indev_uart_data
{
struct
{
uint8_t flag;
uint8_t press;
uint16_t x;
uint16_t y;
}touch;
uint8_t buff[6];
}g_input;
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad*/
static void touchpad_init(void)
{
/*Your code comes here*/
memset(g_input.buff, 0, sizeof(g_input.buff));
}
/* Will be called by the library to read the touchpad */
static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0;
/*Save the pressed coordinates and the state*/
if(touchpad_is_pressed()) {
touchpad_get_xy(&last_x, &last_y);
data->state = LV_INDEV_STATE_PR;
} else {
data->state = LV_INDEV_STATE_REL;
}
/*Set the last pressed coordinates*/
data->point.x = last_x;
data->point.y = last_y;
/*Return `false` because we are not buffering and no more data to read*/
return false;
}
/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
/*Your code comes here*/
if((g_input.touch.flag == 'T')&&(g_input.touch.press))
{
return true;
}
return false;
}
/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
/*Your code comes here*/
if(g_input.touch.flag == 'T')
{
(*x) = g_input.touch.x;
(*y) = g_input.touch.y;
}
}
然后就是主函数中调用输入设备初始化。
主循环通过串口接收数据,模拟触摸指针设备。注意串口接收使用非阻塞方式。
下面是通过串口助手发送数据效果,可以看到指针位置。
具体参考如下代码:lpc55s69_lcd.rar (7.49 MB, 点击下方附件下载)