硬汉嵌入式论坛

 找回密码
 立即注册
查看: 557|回复: 4
收起左侧

[LVGL] 用按键模拟编码器,为啥不支持长按

[复制链接]

6

主题

31

回帖

49

积分

初级会员

积分
49
发表于 2023-8-8 17:38:50 | 显示全部楼层 |阅读模式
有哪位大佬使用过编码器作为LVGL的输入设备?我是用按键模拟的编码器,短按enter键可以从导航模式进入到编辑模式,但长按无法从编辑模式退出到导航模式。我看LVGL源码里面是有长按检测的,但不知道为什么无法触发。
输入设备的回调函数如下
///**
// * @brief       图形库的编码器读取回调函数
// * @param       indev_drv : 编码器设备
// *   @arg       data      : 输入设备数据结构体
// * @retval      无
// */
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
        static uint32_t last_key = 0;
            uint32_t act_key = key_scan(0);                  /* 得到键值 */
            if(act_key != 0) {
        data->state = LV_INDEV_STATE_PRESSED;

        /* 将键值转换成 LVGL 的控制字符 */
        switch(act_key) {
        case KEY0_PRES:
            act_key = LV_KEY_RIGHT;
            break;
        case KEY2_PRES:
            act_key = LV_KEY_LEFT;
            break;
        case KEY1_PRES:
            act_key = LV_KEY_ENTER;
            break;
        }

        last_key = act_key;
               
    } else {
        data->state = LV_INDEV_STATE_RELEASED;
    }

    data->key = last_key;
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-8-8 18:17:39 | 显示全部楼层
编码器玩法不对,编码器框架

[C] 纯文本查看 复制代码
/*------------------
 * Encoder
 * -----------------*/

/*Initialize your keypad*/
static void encoder_init(void)
{
    /*Your code comes here*/
}

/*Will be called by the library to read the encoder*/
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{

    data->enc_diff = encoder_diff;
    data->state = encoder_state;
}

/*Call this function in an interrupt to process encoder events (turn, press)*/
static void encoder_handler(void)
{
    /*Your code comes here*/

    encoder_diff += 0;
    encoder_state = LV_INDEV_STATE_REL;
}
回复

使用道具 举报

6

主题

31

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-8-9 11:39:59 | 显示全部楼层
感谢回复,问题已解决。 KEY_VAL = key_scan(0);          /* 得到键值 */   按键查询这个地方禁止连按,改为 KEY_VAL = key_scan(1);          /* 得到键值 */就可以了。不过左右按键也跟着连按了,后期再调整一下。另外贴上整理后的代码
[C] 纯文本查看 复制代码
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
	static bool but_flag = true;
	lv_indev_state_t encoder_act;
    int32_t encoder_diff=0;
	 KEY_VAL = key_scan(1); 	 /* 得到键值 */
    if(KEY_VAL==KEY1_PRES)	//编码器的按键
        encoder_act = LV_INDEV_STATE_PR;	//按下
    else
        encoder_act = LV_INDEV_STATE_REL;	//松开
    
    if((KEY_VAL==KEY0_PRES)&&but_flag)	//编码器左转
    {
   	 	encoder_diff--;
        but_flag = false;
    }
    else if((KEY_VAL==KEY2_PRES)&&but_flag)//编码器右转
    {
    	encoder_diff++;
        but_flag = false;
    }
    else {but_flag = true;}

    data->enc_diff = encoder_diff;
    data->state = encoder_act;

    encoder_diff = 0;
}
回复

使用道具 举报

6

主题

31

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-8-9 15:19:06 | 显示全部楼层
左右键连按的问题解决了。22行改为    if(!KEY_VAL) but_flag = true;   只有检测到按键松开才将互斥量设置为true。这样enter键支持连按,上下旋转只能单次触发,至此按键可以完美模拟编码器了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-9-26 15:42:32 | 显示全部楼层
请问可以发一下按键模拟编码的函数吗?你的按键扫描中是否仍然使用的延时消抖?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 15:54 , Processed in 0.267311 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表