0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LCD触摸屏功能实现控制电机的设计

冬至子 来源:聆思科技AI芯片 作者:vesperW 2023-01-18 17:02 次阅读

LCD屏显示实现触摸功能

驱动320* 240 ST7789的SPI屏幕进行内容显示,显示文字和触控屏的基本使用;参考了:驱动模型中定义了可供上层应用调用的关键接口,如 读/写framebuffer 、开/关触控动作的操作画面 、获取屏幕设备信息 、 设置亮度/对比度/像素格式/方向等。

下图为触控屏的四个触控开/关四个电机的“按键”

图一 上电开机后显示.jpg

图一(上电开机后显示)

图二 1号电机工作.jpg

图二(1号电机工作)

图三 2号电机工作.jpg

图三(2号电机工作)

图四 3号电机工作.jpg

图四(3号电机工作)

图五 4号电机工作.jpg

图五(4号电机工作)

图六 等待操作的状态.jpg

图六(等待操作的状态)

显示触控屏的常用API接口

void display_get_capabilities(const struct device *dev, struct display_capabilities *capabilities)

参数说明

图七_屏的API接口参数说明.JPG

图七

显示屏设备树配置

&csk6002_9s_nano_pinctrl{
            ...
            /* 显示屏SPI接口配置 */
            pinctrl_spi0_sclk_default: spi0_sclk_default {
                    pinctrls = < &pinmuxa 15 6 >;
            };
            pinctrl_spi0_mosi_default: spi0_mosi_default {
                    pinctrls = < &pinmuxa 10 6 >;
            };
            pinctrl_spi0_miso_default: spi0_miso_default {
                    pinctrls = < &pinmuxa 17 6 >;
            };
            pinctrl_spi0_cs_default: spi0_cs_default {
                    pinctrls = < &pinmuxa 12 6 >;
            }; 
};

触摸屏设备树配置

用到引脚:i2c0_scl(pb2)、i2c0_sda(pb3)。

在 csk6011a_nano.overlay中完成外设接口的配置,具体实现如下:

在app/boards/目录下的csk6002_9s_nano.overlay文件并添加如下设备树配置:

图八_overlay设备树配置.JPG

图八

&csk6002_9s_nano_pinctrl{
   // ...
    /* 触摸屏I2C接口配置 */
    pinctrl_i2c0_scl_default: i2c0_scl_default{
            pinctrls = <&pinmuxb 2 8>;
    };
    
    pinctrl_i2c0_sda_default: i2c0_sda_default{
            pinctrls = <&pinmuxb 3 8>;
    }; 
};

&i2c0 {
        status = "okay";
        pinctrl-0 = <&pinctrl_i2c0_scl_default &pinctrl_i2c0_sda_default>; 
        pinctrl-names = "default";
        ft5336@0 {
                compatible = "focaltech,ft5336";
                reg = <0x38>;
                label = "FT5336";
                status = "okay";
                int-gpios = <&gpioa 3 0>;
        };
};

日志串口设备树配置

本示例中将SDK默认的日志串口(GPIOA_2、GPIOA_3)中的GPIOA_3复用为触控屏的int使能脚,因此将日志输出串口配置为GPIOb_10 、GPIOb_11,具体如下:

&csk6002_9s_nano_pinctrl{  
            /* 日志串口配置 */
            pinctrl_uart0_rx_default: uart0_rx_default{
                    pinctrls = <&pinmuxb 10 2>;
            };
            
            pinctrl_uart0_tx_default: uart0_tx_default{
                    pinctrls = <&pinmuxb 11 2>;
            };
            ...
};

触摸屏组件配置

在prj.conf文件中打开触摸屏功能配置:

触摸配置

CONFIG_KSCAN=y

I2C功能配置

CONFIG_I2C=y

触摸屏屏驱动配置

CONFIG_KSCAN_BL6XXX=y

显示屏组件配置

在prj.conf文件中打开显示屏功能配置:

CONFIG_HEAP_MEM_POOL_SIZE=16384
CONFIG_LOG=y

GPIO功能配置

CONFIG_GPIO=y

显示功能配置

CONFIG_DISPLAY=y

spi功能配置

CONFIG_SPI=y

ST7789V显示屏驱动配置

CONFIG_ST7789V=y

LCD屏显示实现

void main(void)
{
    size_t x;
    size_t y;
    size_t rect_w;
    size_t rect_h;
    size_t h_step;
    size_t scale;
    size_t grey_count;
    uint8_t *buf;
    int32_t grey_scale_sleep;
    const struct device *display_dev;
    struct display_capabilities capabilities;
    struct display_buffer_descriptor buf_desc;
    size_t buf_size = 0;
    fill_buffer fill_buffer_fnc = NULL;

    LOG_INF("Display sample for %s", DISPLAY_DEV_NAME);
    
    /* kscan初始化 */
    kscan_init();
    
    /* 获取display设备实例 */
    display_dev = device_get_binding(DISPLAY_DEV_NAME);

    if (display_dev == NULL) {
        LOG_ERR("Device %s not found. Aborting sample.",
            DISPLAY_DEV_NAME);
        RETURN_FROM_MAIN(1);
    }
    
    /* 获取显示功能 */
    display_get_capabilities(display_dev, &capabilities);

    if (capabilities.screen_info & SCREEN_INFO_MONO_VTILED) {
        rect_w = 32;
        rect_h = 10;
    } else {
        rect_w = 2;
        rect_h = 1;
    }

    h_step = rect_h;
    scale = (capabilities.x_resolution / 8) / rect_h;

    rect_w *= scale;
    rect_h *= scale;

    if (capabilities.screen_info & SCREEN_INFO_EPD) {
        grey_scale_sleep = 10000;
    } else {
        grey_scale_sleep = 100;
    }

    buf_size = rect_w * rect_h;

    if (buf_size < (capabilities.x_resolution * h_step)) {
        buf_size = capabilities.x_resolution * h_step;
    }
    
    /* 色块配置 */
    switch (capabilities.current_pixel_format) {
    case PIXEL_FORMAT_ARGB_8888:
        fill_buffer_fnc = fill_buffer_argb8888;
        buf_size *= 4;
        break;
    case PIXEL_FORMAT_RGB_888:
        fill_buffer_fnc = fill_buffer_rgb888;
        buf_size *= 3;
        break;
    case PIXEL_FORMAT_RGB_565:
        fill_buffer_fnc = fill_buffer_rgb565;
        buf_size *= 2;
        break;
    case PIXEL_FORMAT_BGR_565:
        fill_buffer_fnc = fill_buffer_bgr565;
        buf_size *= 2;
        break;
    case PIXEL_FORMAT_MONO01:
    case PIXEL_FORMAT_MONO10:
        fill_buffer_fnc = fill_buffer_mono;
        buf_size /= 8;
        break;
    default:
        LOG_ERR("Unsupported pixel format. Aborting sample.");
        RETURN_FROM_MAIN(1);
    }

    buf = k_malloc(buf_size);

    if (buf == NULL) {
        LOG_ERR("Could not allocate memory. Aborting sample.");
        RETURN_FROM_MAIN(1);
    }
    
    (void)memset(buf, 0xFFu, buf_size);

    buf_desc.buf_size = buf_size;
    buf_desc.pitch = capabilities.x_resolution;
    buf_desc.width = capabilities.x_resolution;
    buf_desc.height = h_step;

    /*整屏填充白色背景*/
    for (int idx = 0; idx < capabilities.y_resolution; idx += h_step) {
        display_write(display_dev, 0, idx, &buf_desc, buf);
    }

    /*左上角填充红色块*/
    fill_buffer_fnc(TOP_LEFT, 0, buf, buf_size);
    x = 0;
    y = 0;
    display_write(display_dev, x, y, &buf_desc, buf);

    /*右上角填充绿色块*/
    fill_buffer_fnc(TOP_RIGHT, 0, buf, buf_size);
    x = capabilities.x_resolution - rect_w;
    y = 0;
    display_write(display_dev, x, y, &buf_desc, buf);

    /*右下角填充蓝色块*/
    fill_buffer_fnc(BOTTOM_RIGHT, 0, buf, buf_size);
    x = capabilities.x_resolution - rect_w;
    y = capabilities.y_resolution - rect_h;
    display_write(display_dev, x, y, &buf_desc, buf);
    
    /* 关闭显示消隐 */
    display_blanking_off(display_dev);

    grey_count = 0;
    x = 0;
    y = capabilities.y_resolution - rect_h;

    /*左下角灰色动态色块*/
    while (1) {
        fill_buffer_fnc(BOTTOM_LEFT, grey_count, buf, buf_size);
        display_write(display_dev, x, y, &buf_desc, buf);
        ++grey_count;
        k_msleep(grey_scale_sleep);
    }
}

触摸屏功能实现

Zephyr具备kscan(keyboard scan matrix)驱动模型,其驱动程序用于检测矩阵键盘或带有按钮的设备中的按键(用户触碰触摸屏本质上是生成一个行列坐标)。查阅zephyr官网Display Interface。

图九_LCD点阵坐标触控1.JPG

图九

注册callback函数

/* 触摸回调函数,打印坐标 */
static void k_callback(const struct device *dev, uint32_t row, uint32_t col,
               bool pressed)
{
    ARG_UNUSED(dev);
    printk("row = %u col = %u, pressed:%s\\n", row, col, pressed ? "TRUE" : "FLASE");
}

void kscan_init(void)
{   
    /* 获取kscan设备实例 */
    const struct device *kscan_dev = device_get_binding(DISPLAY_KSAN_DEV_NAME);

    if (!device_is_ready(kscan_dev)) {
        LOG_ERR("kscan device %s not ready", kscan_dev->name);
        return;
    }
    
    /* 注册回调,在k_callback中可看到对应的坐标与状态printk输出操作 */
    kscan_config(kscan_dev, k_callback);
    /* 使能回调 */
    kscan_enable_callback(kscan_dev);
}

void main(void)
{
    kscan_init();
    ...
}

编译的指令是:

lisa zep build

烧录的指令是:

lisa zep flash

结果

触控屏显示了四个触控开关符,分别触摸对应显示在(LED1符 LED2符 LED3符 LED4符的下面触控开关)。四个功能(GPIO) PWM 控制电机运行,后面补上(高发性的疫情过后,回公司上班补上,焊接上电机驱动板)。我们开发了一个PC上位机软件(视觉图分析用)。GC032A摄像头上传的图像以后可以在触控屏显(一个静态图)。

图十_图像LCD点阵坐标分析.JPG

图十

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1700

    浏览量

    91297
  • LCD触摸屏
    +关注

    关注

    0

    文章

    11

    浏览量

    6684
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11543
  • 控制电机
    +关注

    关注

    0

    文章

    235

    浏览量

    18077
收藏 人收藏

    评论

    相关推荐

    LCD电阻触摸屏的设计安装

    如今LCD 触摸屏的应用在日常生活中已经很常见,触摸屏的人机交互简单快捷,本文介绍了在设计安装LCD的电阻式触摸屏时,我们需要注意的事项。
    发表于 04-08 10:41 895次阅读

    电阻式触摸屏,什么是电阻式触摸屏

    电阻式触摸屏,什么是电阻式触摸屏   这种触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电
    发表于 03-24 11:02 5535次阅读

    EP7212处理器的LCD控制触摸屏接口设计

    介绍EP7212 嵌入式处理器上LCD 控制器的结构和功能;深入探讨 ADS7843 触摸屏接口芯片的模式选择才应用技巧;基于该系统给出一个与彩色L
    发表于 07-19 15:08 29次下载
    EP7212处理器的<b class='flag-5'>LCD</b><b class='flag-5'>控制</b>及<b class='flag-5'>触摸屏</b>接口设计

    LCD控制触摸屏接口设计

    触摸屏作为一种特殊的计算机外设, 是目前最自然、便利的一种人机交互方式。提出了一种用8位单片机控制16位带触摸屏LCD的设计方法。TFT- LCD
    发表于 05-02 11:08 7486次阅读
    <b class='flag-5'>LCD</b><b class='flag-5'>控制</b>及<b class='flag-5'>触摸屏</b>接口设计

    电阻式触摸屏的结构和实现原理介绍

    很多LCD模块都采用了电阻式触摸屏,这些触摸屏等效于将物理位置转换为代表X、Y坐标的电压值的传感器。通常有4线、5线、7线和8线触摸屏实现
    的头像 发表于 12-11 09:35 2.5w次阅读
    电阻式<b class='flag-5'>触摸屏</b>的结构和<b class='flag-5'>实现</b>原理介绍

    如何掌握PLC触摸屏控制电机的正反转

    PLC触摸屏控制电机的正反转是plc编程中很重要的一个环节,所以难度是可想而知的。有些自动化高级工程师在初期也是经过4到5编的练习才熟练掌握了技巧。今天就为大家做一下触摸屏
    发表于 08-01 17:45 6929次阅读

    PLC触摸屏的作用_触摸屏是怎样控制PLC的

    PLC程序是用来控制电气设备传动的智能仪器,它需要工程人员利用编程语言编写程序,以实现各种控制方式。触摸屏程序可与PLC可编程序控制器直接连
    发表于 05-21 10:46 1.9w次阅读

    基于EP7212处理器芯片实现LCD触摸屏控制器的应用方案

    随着生活中类似于PDA的手持设备的增多,彩色LCD触摸屏也越来越普及。本文除了简单介绍EP7212的特性以外,主要讨论EP7212上的LCD控制器如何驱动彩色
    的头像 发表于 03-18 09:28 3135次阅读
    基于EP7212处理器芯片<b class='flag-5'>实现</b><b class='flag-5'>LCD</b><b class='flag-5'>触摸屏</b><b class='flag-5'>控制</b>器的应用方案

    电容触摸屏的优势

    当你使用手机和POS设备时,有曾想过为什么可以通过LCD触摸屏控制他们吗? 没错,电容式触摸技术可以实现这些
    的头像 发表于 02-24 11:26 1716次阅读

    LCD电容触摸屏的三种触摸技术In-Cell/On-Cell/OGS

    相信了解过TFT LCD触摸显示的朋友们一定都听说过In-Cell/ On-Cell/ OGS电容触摸技术。在很多的行业领域,都会应用到
    的头像 发表于 04-28 15:14 5284次阅读
    <b class='flag-5'>LCD</b>电容<b class='flag-5'>触摸屏</b>的三种<b class='flag-5'>触摸</b>技术In-Cell/On-Cell/OGS

    LCD | TFT LCD 触摸屏的选择

    具有触摸功能的TFT LCD显示操作简单,被广泛应用在各个领域。触摸屏技术有5种类型,他们具有优点和局限性,领域成本,图像质量,
    的头像 发表于 10-13 16:57 2211次阅读
    <b class='flag-5'>LCD</b> | TFT <b class='flag-5'>LCD</b> <b class='flag-5'>触摸屏</b>的选择

    modbus触摸屏

    modbus触摸屏是指支持Modbus通讯协议的触摸屏,它可以通过串口或网络与其他设备进行通讯,从而实现对其他设备的控制和监测。Modbus触摸屏
    的头像 发表于 06-28 09:34 1556次阅读
    modbus<b class='flag-5'>触摸屏</b>

    基于嵌入式LCD触摸屏的设计

    电子发烧友网站提供《基于嵌入式LCD触摸屏的设计.doc》资料免费下载
    发表于 10-12 10:18 4次下载
    基于嵌入式<b class='flag-5'>LCD</b>的<b class='flag-5'>触摸屏</b>的设计

    电容触摸屏原理 电容触摸屏和电阻触摸屏有什么区别

    电容触摸屏和电阻触摸屏是两种常见的触摸屏技术,它们在原理、结构和应用方面都有很大的区别。下面将详细介绍电容触摸屏的原理、结构和特点,并与电阻触摸屏
    的头像 发表于 01-22 16:13 4046次阅读

    LCD触摸屏的PCB设计

    液晶显示LCD)和触摸屏技术已经成为各种电子设备的核心组成部分,从智能手机到电视和医疗设备。在这些设备中,PCB的设计对于LCD触摸屏
    的头像 发表于 07-18 11:17 1865次阅读
    <b class='flag-5'>LCD</b><b class='flag-5'>屏</b>和<b class='flag-5'>触摸屏</b>的PCB设计