您尚未登录。

楼主 # 2022-06-24 23:10:00

memory
会员
注册时间: 2021-08-11
已发帖子: 607
积分: 579

LVGL8 steup by step

百问网视频教程: https://www.bilibili.com/video/BV1Ya411r7K2

视频提及的 codeblocks-20.03mingw-setup 下载地址: https://www.codeblocks.org/downloads/binaries/

离线

楼主 #5 2025-05-09 16:32:23

memory
会员
注册时间: 2021-08-11
已发帖子: 607
积分: 579

Re: LVGL8 steup by step

添加触摸声音:

lvgl/src/core/lv_obj.c

static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e)
{
    LV_UNUSED(class_p);

    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_current_target(e);
    if(code == LV_EVENT_PRESSED) {
        lv_obj_add_state(obj, LV_STATE_PRESSED);
        //这里添加触摸声音输出
    }
    else if(code == LV_EVENT_RELEASED) 
...

离线

楼主 #6 2025-05-09 17:48:17

memory
会员
注册时间: 2021-08-11
已发帖子: 607
积分: 579

Re: LVGL8 steup by step

linux 终端列出目录下所有.mp4文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h> // POSIX 目录遍历库


// 存储文件名的结构体
typedef struct {
    char *filename;
} FileEntry;

// 全局文件列表
FileEntry *file_list = NULL;
int file_count = 0;

// 扩展名匹配
int is_media_file(const char *filename) {
    const char *ext = strrchr(filename, '.');
    if (!ext) return 0;
    return (strcmp(ext, ".mp3") == 0 || strcmp(ext, ".mp4") == 0);
}

// 递归查找媒体文件
void find_media_files(const char *path) {
    DIR *dir = opendir(path);
    if (!dir) {
        fprintf(stderr, "无法打开目录: %s\n", path);
        return;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 跳过当前目录和父目录
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
            continue;

        // 构造完整路径
        char full_path[256];
        snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name);

        // 如果是目录,则递归处理
        if (entry->d_type == DT_DIR) {
            find_media_files(full_path);
        } else if (is_media_file(entry->d_name)) {
            // 分配内存并保存文件名
            file_list = realloc(file_list, (file_count + 1) * sizeof(FileEntry));
            file_list[file_count].filename = strdup(entry->d_name);
            file_count++;
        }
    }

    closedir(dir);
}

void display_file_list() {
    for (int i = 0; i < file_count; i++) {
		printf("%s\n", file_list[i].filename);
    }
}

int main() {
    // 查找文件
    find_media_files("/mnt/hgfs/D/1122/"); // 注意使用正斜杠路径

    // 显示文件列表
    display_file_list();

    // 清理资源
    for (int i = 0; i < file_count; i++) {
        free(file_list[i].filename);
    }
    free(file_list);

    return 0;
}

离线

楼主 #7 2025-05-12 22:43:07

memory
会员
注册时间: 2021-08-11
已发帖子: 607
积分: 579

Re: LVGL8 steup by step

单片机注册IO类型的按键输入设备Demo:

将Wakeup作为LEFT键,Tamper作为RIGHT键,USER作为ENTER键。

7.1 初始化

static void keypad_init(void)
{
    /*Your code comes here*/
    gpio_mode_set(IO_KEY_WAKEUP, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ((uint32_t)1 << PIN_KEY_WAKEUP)); 
    gpio_mode_set(IO_KEY_TAMPER, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ((uint32_t)1 << PIN_KEY_TAMPER));
    gpio_mode_set(IO_KEY_USER, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ((uint32_t)1 << PIN_KEY_USER));
}

初始化按键对应IO为输入。

7.2 读入键值

static uint32_t keypad_get_key(void)
{
    /*Your code comes here*/
    if(RESET == gpio_input_bit_get(IO_KEY_WAKEUP, (uint32_t)1 << PIN_KEY_WAKEUP))
    {
        return 1;
    }
    else if(RESET == gpio_input_bit_get(IO_KEY_TAMPER, (uint32_t)1 << PIN_KEY_TAMPER))
    {
        return 2;
    }
    else if(RESET == gpio_input_bit_get(IO_KEY_USER, (uint32_t)1 << PIN_KEY_USER))
    {
        return 3;
    }
    return 0;
}

7.3 读键处理

static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint32_t last_key = 0;
    /*Get whether the a key is pressed and save the pressed key*/
    uint32_t act_key = keypad_get_key();
    if(act_key != 0) {
        data->state = LV_INDEV_STATE_PR;
 
        /*Translate the keys to LVGL control characters according to your key definitions*/
        switch(act_key) {
            case 1:
                act_key = LV_KEY_PREV;
                break;
            case 2:
                act_key = LV_KEY_NEXT;
                break;
            case 3:
                act_key = LV_KEY_ENTER;
                break;
        }
        last_key = act_key;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }
    data->key = last_key;
}

这里键值1,2对应按键PREV和NEXT,不是LEFT和RIGHT。这样才能左右选择Group的对象。

https://blog.csdn.net/pq113_6/article/details/125276494

30c3783b7055bd7994fcfafa116bef41.png

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn