全志R128应用开发案例——适配SPI驱动ST7789V2.4寸LCD

SPI驱动ST7789V1.47寸LCD

R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点:

  • Supports DBI Type C 3 Line/4 Line Interface Mode
  • Supports 2 Data Lane Interface Mode
  • Supports data source from CPU or DMA
  • Supports RGB111/444/565/666/888 video format
  • Maximum resolution of RGB666 240 x 320@30Hz with single data lane
  • Maximum resolution of RGB888 240 x 320@60Hz or 320 x 480@30Hz with dual data lane
  • Supports tearing effect
  • Supports software flexible control video frame rate

同时,提供了 SPILCD 驱动框架以供 SPI 屏幕使用。

此次适配的SPI屏为 ZJY147S0800TG01,使用的是 SPI 进行驱动。

在这里插入图片描述

引脚配置如下:

R128 DevkitTFT 模块
PA12CS
PA13SCL
PA18SDA
PA9BLK
PA20RES
PA19DC
3V3VCC
GNDGND

载入方案

我们使用的开发板是 R128-Devkit,需要开发 C906 核心的应用程序,所以载入方案选择 r128s2_module_c906

$ source envsetup.sh 
$ lunch_rtos 1

在这里插入图片描述

设置 SPI 驱动

屏幕使用的是SPI驱动,所以需要勾选SPI驱动,运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 SPI Devices

Drivers Options  --->soc related device drivers  --->SPI Devices --->-*- enable spi driver

在这里插入图片描述

配置 SPI 引脚

打开你喜欢的编辑器,修改文件:board/r128s2/module/configs/sys_config.fex,在这里我们不需要用到 SPI HOLD与SPI WP引脚,注释掉即可。

;----------------------------------------------------------------------------------
;SPI controller configuration
;----------------------------------------------------------------------------------
;Please config spi in dts
[spi1]
spi1_used       = 1
spi1_cs_number  = 1
spi1_cs_bitmap  = 1
spi1_cs0        = port:PA12<6><0><3><default>
spi1_sclk       = port:PA13<6><0><3><default>
spi1_mosi       = port:PA18<6><0><3><default>
spi1_miso       = port:PA21<6><0><3><default>
;spi1_hold       = port:PA19<6><0><2><default>
;spi1_wp         = port:PA20<6><0><2><default>

在这里插入图片描述

设置 PWM 驱动

屏幕背光使用的是PWM驱动,所以需要勾选PWM驱动,运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 PWM Devices

Drivers Options  --->soc related device drivers  --->PWM Devices --->-*- enable pwm driver

在这里插入图片描述

配置 PWM 引脚

打开你喜欢的编辑器,修改文件:board/r128s2/module/configs/sys_config.fex,增加 PWM1 节点

[pwm1]
pwm_used        = 1
pwm_positive    = port:PA9<4><0><3><default>

在这里插入图片描述

设置 SPI LCD 驱动

SPI LCD 由专门的驱动管理。运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 SPILCD Devices ,注意同时勾选 spilcd hal APIs test 方便测试使用。

Drivers Options  --->soc related device drivers  --->[*] DISP Driver Support(spi_lcd)[*]   spilcd hal APIs test

在这里插入图片描述

编写 SPI LCD 显示屏驱动

获取屏幕初始化序列

首先询问屏厂提供驱动源码

在这里插入图片描述

找到 LCD 的初始化序列代码

在这里插入图片描述

找到屏幕初始化的源码

在这里插入图片描述

整理后的初始化代码如下:

LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x00);LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x35);LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x13);LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);LCD_WR_REG(0xD6);
LCD_WR_DATA8(0xA1);LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x30);LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x32);LCD_WR_REG(0x21);LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);

用现成驱动改写 SPI LCD 驱动

选择一个现成的 SPI LCD 改写即可,这里选择 nv3029s.c 驱动来修改

在这里插入图片描述

复制这两个驱动,重命名为 st7789v.c

在这里插入图片描述

先编辑 st7789v.hnv3029s 改成 st7789v

在这里插入图片描述

#ifndef _ST7789V_H
#define _ST7789V_H#include "panels.h"struct __lcd_panel st7789v_panel;#endif /*End of file*/

编辑 st7789v.cnv3029s 改成 st7789v

在这里插入图片描述

编写初始化序列

先删除 static void LCD_panel_init(unsigned int sel) 中的初始化函数。

在这里插入图片描述

然后将屏厂提供的初始化序列复制进来

在这里插入图片描述

然后按照 spi_lcd 框架的接口改写驱动接口,具体接口如下

屏厂函数SPILCD框架接口
LCD_WR_REGsunxi_lcd_cmd_write
LCD_WR_DATA8sunxi_lcd_para_write
delay_mssunxi_lcd_delay_ms

可以直接进行替换

在这里插入图片描述

完成后如下

在这里插入图片描述

然后对照屏厂提供的驱动修改 address 函数

在这里插入图片描述

做如下修改

static void address(unsigned int sel, int x, int y, int width, int height)
{sunxi_lcd_cmd_write(sel, 0x2A); /* Set coloum address */sunxi_lcd_para_write(sel, (x + 34) >> 8);sunxi_lcd_para_write(sel, (x + 34));sunxi_lcd_para_write(sel, (width + 34) >> 8);sunxi_lcd_para_write(sel, (width + 34));sunxi_lcd_cmd_write(sel, 0x2B); /* Set row address */sunxi_lcd_para_write(sel, y >> 8);sunxi_lcd_para_write(sel, y);sunxi_lcd_para_write(sel, height >> 8);sunxi_lcd_para_write(sel, height);sunxi_lcd_cmd_write(sel, 0x2c);
}

完成驱动如下

#include "st7789v.h"static void LCD_power_on(u32 sel);
static void LCD_power_off(u32 sel);
static void LCD_bl_open(u32 sel);
static void LCD_bl_close(u32 sel);
static void LCD_panel_init(u32 sel);
static void LCD_panel_exit(u32 sel);
#define RESET(s, v) sunxi_lcd_gpio_set_value(s, 0, v)
#define power_en(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val)static struct disp_panel_para info[LCD_FB_MAX];static void address(unsigned int sel, int x, int y, int width, int height)
{sunxi_lcd_cmd_write(sel, 0x2A); /* Set coloum address */sunxi_lcd_para_write(sel, (x + 34) >> 8);sunxi_lcd_para_write(sel, (x + 34));sunxi_lcd_para_write(sel, (width + 34) >> 8);sunxi_lcd_para_write(sel, (width + 34));sunxi_lcd_cmd_write(sel, 0x2B); /* Set row address */sunxi_lcd_para_write(sel, y >> 8);sunxi_lcd_para_write(sel, y);sunxi_lcd_para_write(sel, height >> 8);sunxi_lcd_para_write(sel, height);sunxi_lcd_cmd_write(sel, 0x2c);
}static void LCD_panel_init(unsigned int sel)
{if (bsp_disp_get_panel_info(sel, &info[sel])) {lcd_fb_wrn("get panel info fail!\n");return;}sunxi_lcd_cmd_write(sel, 0x11);sunxi_lcd_delay_ms(120);sunxi_lcd_cmd_write(sel, 0x36);sunxi_lcd_para_write(sel, 0x00);sunxi_lcd_cmd_write(sel, 0x3A);sunxi_lcd_para_write(sel, 0x05);sunxi_lcd_cmd_write(sel, 0xB2);sunxi_lcd_para_write(sel, 0x0C);sunxi_lcd_para_write(sel, 0x0C);sunxi_lcd_para_write(sel, 0x00);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_cmd_write(sel, 0xB7);sunxi_lcd_para_write(sel, 0x35);sunxi_lcd_cmd_write(sel, 0xBB);sunxi_lcd_para_write(sel, 0x35);sunxi_lcd_cmd_write(sel, 0xC0);sunxi_lcd_para_write(sel, 0x2C);sunxi_lcd_cmd_write(sel, 0xC2);sunxi_lcd_para_write(sel, 0x01);sunxi_lcd_cmd_write(sel, 0xC3);sunxi_lcd_para_write(sel, 0x13);sunxi_lcd_cmd_write(sel, 0xC4);sunxi_lcd_para_write(sel, 0x20);sunxi_lcd_cmd_write(sel, 0xC6);sunxi_lcd_para_write(sel, 0x0F);sunxi_lcd_cmd_write(sel, 0xD0);sunxi_lcd_para_write(sel, 0xA4);sunxi_lcd_para_write(sel, 0xA1);sunxi_lcd_cmd_write(sel, 0xD6);sunxi_lcd_para_write(sel, 0xA1);sunxi_lcd_cmd_write(sel, 0xE0);sunxi_lcd_para_write(sel, 0xF0);sunxi_lcd_para_write(sel, 0x00);sunxi_lcd_para_write(sel, 0x04);sunxi_lcd_para_write(sel, 0x04);sunxi_lcd_para_write(sel, 0x04);sunxi_lcd_para_write(sel, 0x05);sunxi_lcd_para_write(sel, 0x29);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_para_write(sel, 0x3E);sunxi_lcd_para_write(sel, 0x38);sunxi_lcd_para_write(sel, 0x12);sunxi_lcd_para_write(sel, 0x12);sunxi_lcd_para_write(sel, 0x28);sunxi_lcd_para_write(sel, 0x30);sunxi_lcd_cmd_write(sel, 0xE1);sunxi_lcd_para_write(sel, 0xF0);sunxi_lcd_para_write(sel, 0x07);sunxi_lcd_para_write(sel, 0x0A);sunxi_lcd_para_write(sel, 0x0D);sunxi_lcd_para_write(sel, 0x0B);sunxi_lcd_para_write(sel, 0x07);sunxi_lcd_para_write(sel, 0x28);sunxi_lcd_para_write(sel, 0x33);sunxi_lcd_para_write(sel, 0x3E);sunxi_lcd_para_write(sel, 0x36);sunxi_lcd_para_write(sel, 0x14);sunxi_lcd_para_write(sel, 0x14);sunxi_lcd_para_write(sel, 0x29);sunxi_lcd_para_write(sel, 0x32);sunxi_lcd_cmd_write(sel, 0x21);sunxi_lcd_cmd_write(sel, 0x11);sunxi_lcd_delay_ms(120);sunxi_lcd_cmd_write(sel, 0x29);if (info[sel].lcd_x < info[sel].lcd_y)address(sel, 0, 0, info[sel].lcd_x - 1, info[sel].lcd_y - 1);elseaddress(sel, 0, 0, info[sel].lcd_y - 1, info[sel].lcd_x - 1);
}static void LCD_panel_exit(unsigned int sel)
{sunxi_lcd_cmd_write(sel, 0x28);sunxi_lcd_delay_ms(20);sunxi_lcd_cmd_write(sel, 0x10);sunxi_lcd_delay_ms(20);sunxi_lcd_pin_cfg(sel, 0);
}static s32 LCD_open_flow(u32 sel)
{lcd_fb_here;/* open lcd power, and delay 50ms */LCD_OPEN_FUNC(sel, LCD_power_on, 50);/* open lcd power, than delay 200ms */LCD_OPEN_FUNC(sel, LCD_panel_init, 200);LCD_OPEN_FUNC(sel, lcd_fb_black_screen, 50);/* open lcd backlight, and delay 0ms */LCD_OPEN_FUNC(sel, LCD_bl_open, 0);return 0;
}static s32 LCD_close_flow(u32 sel)
{lcd_fb_here;/* close lcd backlight, and delay 0ms */LCD_CLOSE_FUNC(sel, LCD_bl_close, 50);/* open lcd power, than delay 200ms */LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10);/* close lcd power, and delay 500ms */LCD_CLOSE_FUNC(sel, LCD_power_off, 10);return 0;
}static void LCD_power_on(u32 sel)
{/* config lcd_power pin to open lcd power0 */lcd_fb_here;power_en(sel, 1);sunxi_lcd_power_enable(sel, 0);sunxi_lcd_pin_cfg(sel, 1);RESET(sel, 1);sunxi_lcd_delay_ms(100);RESET(sel, 0);sunxi_lcd_delay_ms(100);RESET(sel, 1);
}static void LCD_power_off(u32 sel)
{lcd_fb_here;/* config lcd_power pin to close lcd power0 */sunxi_lcd_power_disable(sel, 0);power_en(sel, 0);
}static void LCD_bl_open(u32 sel)
{sunxi_lcd_pwm_enable(sel);/* config lcd_bl_en pin to open lcd backlight */sunxi_lcd_backlight_enable(sel);lcd_fb_here;
}static void LCD_bl_close(u32 sel)
{/* config lcd_bl_en pin to close lcd backlight */sunxi_lcd_backlight_disable(sel);sunxi_lcd_pwm_disable(sel);lcd_fb_here;
}/* sel: 0:lcd0; 1:lcd1 */
static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
{lcd_fb_here;return 0;
}static int lcd_set_var(unsigned int sel, struct fb_info *p_info)
{return 0;
}static int lcd_set_addr_win(unsigned int sel, int x, int y, int width, int height)
{address(sel, x, y, width, height);return 0;
}static int lcd_blank(unsigned int sel, unsigned int en)
{return 0;
}struct __lcd_panel st7789v_panel = {/* panel driver name, must mach the name of lcd_drv_name in sys_config.fex*/.name = "st7789v",.func = {.cfg_open_flow = LCD_open_flow,.cfg_close_flow = LCD_close_flow,.lcd_user_defined_func = LCD_user_defined_func,.blank = lcd_blank,.set_var = lcd_set_var,.set_addr_win = lcd_set_addr_win,},
};

对接驱动框架

完成了屏幕驱动的编写,接下来需要对接到 SPILCD 驱动框架。首先编辑 Kconfig

在这里插入图片描述

增加 st7789v 的配置

在这里插入图片描述

config LCD_SUPPORT_ST7789Vbool "LCD support st7789v panel"default n---help---If you want to support st7789v panel for display driver, select it.

然后编辑 panels.cpanel_array 里增加 st7789 驱动的引用

在这里插入图片描述

如下图

在这里插入图片描述

#ifdef CONFIG_LCD_SUPPORT_ST7789V&st7789v_panel,
#endif

之后编辑 panels.h 同样增加引用

在这里插入图片描述

如下图

在这里插入图片描述

#ifdef CONFIG_LCD_SUPPORT_ST7789V
extern struct __lcd_panel st7789v_panel;
#endif

最后编辑外层的 Makefile 增加编译选项

在这里插入图片描述

如下所示

在这里插入图片描述

obj-${CONFIG_LCD_SUPPORT_ST7789V} += panels/st7789v.o

选择 ST7789V 驱动

在 SPILCD 驱动选择界面可以看到 LCD_FB panels select 选择 SPI 屏幕的驱动

进入 LCD_FB panels select 选项

在这里插入图片描述

选择并勾选 [*] LCD support st7789v panel

在这里插入图片描述

配置 SPI LCD 引脚

打开你喜欢的编辑器,修改文件:board/r128s2/module/configs/sys_config.fex

[lcd_fb0]
lcd_used            = 1   
lcd_model_name      = "spilcd"   
lcd_driver_name     = "st7789v" 
lcd_x               = 172   
lcd_y               = 320  
lcd_width           = 17  
lcd_height          = 32  
lcd_data_speed      = 50
lcd_pwm_used        = 1
lcd_pwm_ch          = 1
lcd_pwm_freq        = 5000 
lcd_pwm_pol         = 0 
lcd_if              = 0
lcd_pixel_fmt       = 11 
lcd_dbi_fmt         = 2
lcd_dbi_clk_mode    = 1
lcd_dbi_te          = 1
fb_buffer_num       = 2
lcd_dbi_if          = 4
lcd_rgb_order       = 0
lcd_fps             = 60
lcd_spi_bus_num     = 1
lcd_frm             = 2
lcd_gamma_en        = 1
lcd_backlight       = 100lcd_power_num       = 0
lcd_gpio_regu_num   = 0
lcd_bl_percent_num  = 0lcd_spi_dc_pin      = port:PA19<1><0><3><0>
;RESET Pin
lcd_gpio_0          = port:PA20<1><0><2><0>

编译打包

运行命令 mp 编译打包,可以看到编译了 st7789v.o

在这里插入图片描述

测试

烧录启动之后,屏幕背光启动,但是屏幕全黑。

在这里插入图片描述

输入 test_spilcd ,屏幕显示黄色。

在这里插入图片描述

在这里插入图片描述

输入 lv_examples 1 可以显示 lvgl 界面

在这里插入图片描述

常见问题

LVGL 出现 DMA Over Size

在这里插入图片描述

这是由于 LVGL 配置的 LV_COLOR_DEPTH 为 32,但是 SPI 屏配置为16位。请修改 lv_conf.h

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/177969.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins实践篇(2)—— 自动打tag的可回滚发布模式

大家好&#xff0c;我是蓝胖子&#xff0c;在上一篇我简单介绍了如何基于特定分支做自动编译和发布&#xff0c;在生产环境中&#xff0c;为了更加安全和快速回滚&#xff0c;我采取的是通过对代码打tag的方式来进行部署&#xff0c;下面我将详细介绍整个发布过程的逻辑。 发布…

Android开发笔记(三)—Activity篇

活动组件Activity 启动和结束生命周期启动模式信息传递Intent显式Intent隐式Intent 向下一个Activity发送数据向上一个Activity返回数据 附加信息利用资源文件配置字符串利用元数据传递配置信息给应用页面注册快捷方式 启动和结束 &#xff08;1&#xff09;从当前页面跳到新页…

vmware--主机win11 samba 映射虚拟机ubuntu共享文件夹

参考链接 1.效果如下图 2.教程 2.1 win11开启 smb 忽略… 2.2 vmware–ubuntu 安装 samba sudo apt update sudo apt install samba2.3 vmware–ubuntu 验证 安装成功 ppan:~$ whereis samba samba: /usr/sbin/samba /usr/lib/x86_64-linux-gnu/samba /etc/samba /usr/sh…

基于ubuntu20.04 环境跑通LIO_SAM重定位

link 序言 作为LOAM重要的一个变种&#xff0c;LIO_SAM基本上算是这个系列里面知识点最全面。这个软件框架包含了去畸变、特征点提取&#xff08;角点、平面点&#xff09;、前端、后端、回环&#xff0c;同时软件框架还融合了IMU信息&#xff0c;可以配置融合GPS信息。当然这种…

常用编程语言排行与应用场景汇总(2023.10)

文章目录 编程语言排行一、Python二、C三、C四、Java五、C#六、JavaScript七、VB&#xff08;Visual Basic&#xff09;八、PHP九、SQL十、ASM&#xff08;Assembly Language&#xff09;十一、Go十二、Scratch十三、Delphi/Object Pascal十四、MATLAB十五、Swift十六、Fortran…

任意文件下载之漏洞复现

0x01 应用介绍 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件,国内协同OA办公领域领导品牌,致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案 0x02 影响版本及语法特征 泛微e-offcie9 fofa&#xff1a;app”泛微-EOffice” && b…

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

背景介绍 随着大数据技术的进步&#xff0c;企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法&#xff0c;有助于理解数据如何被转换和消费&#xff0c;同时对数据治理和合规性起到关…

gtsam初探以及结合LIO-SAM算法的一些理解

概述 GTSAM&#xff08;Georgia Tech Smoothing and Mapping&#xff09;是基于因子图的C库&#xff0c;本篇基于GTSAM对因子图优化做一个简单了解和梳理&#xff0c;并以LIO-SAM为例进一步分析因子图优化在SLAM中的应用。 参考链接&#xff1a; [0]gtsam官方文档 [1]https:/…

Android各版本对应的SDK及JDK版本要求

1、Android Gradle 插件版本说明 | Android 开发者 | Android Developers 2、 3、Android Gradle 插件 7.3.0&#xff08;2022 年 9 月&#xff09; | Android 开发者 | Android Developers 4、 5、参考 Android中Gradle版本和Gradle插件版本 - 简书

Spring IOC - ConfigurationClassPostProcessor源码解析

上文提到Spring在Bean扫描过程中&#xff0c;会手动将5个Processor类注册到beanDefinitionMap中&#xff0c;其中ConfigurationClassPostProcessor就是本文将要讲解的内容&#xff0c;该类会在refresh()方法中通过调用invokeBeanFactoryPosstProcessors(beanFactory)被调用。 5…

68 内网安全-域横向PTHPTKPTT哈希票据传递

目录 演示案例:域横向移动PTH传递-Mimikatz域横向移动PTK传递-Mimikatz域横向移动PTT传递-MS14068&kekeo&local国产Ladon内网杀器测试验收-信息收集,连接等 涉及资源: PTH(pass the hash) #利用lm或ntlm的值进行的渗透测试 PTT(pass the ticket) #利用的票据凭证TGT进行…

C++ Qt 学习(二):常用控件使用与界面布局

1. Qt 布局详解 ui 设计器设计界面很方便&#xff0c;为什么还要手写代码&#xff1f; 更好的控制布局更好的设置 qss代码复用 完全不会写 Qt 布局&#xff0c;很麻烦&#xff0c;怎么学会手写布局&#xff1f; 看 Qt 自己怎么写改良 Qt 的布局写法 1.1 水平布局 #include …

LVGL库入门 02 - 布局

1、简单布局 可以使用 lv_obj_set_pos(obj, x, y) 调整一个控件的位置&#xff08;或者使用类似的函数单独调整一个方向的坐标&#xff09;&#xff0c;将它放在相对父容器左上角的合适位置。不过这种布局方式非常死板&#xff0c;因为绝对坐标一旦设定就不能自动调整&#xf…

fastapi-参数

路径参数 你可以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量"&#xff1a; from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}") async def item_details(item_id: int):return {"item_id": i…

竖版视频怎么做二维码?扫码播放竖版视频的方法

当我们在将视频转二维码图片展示的时候&#xff0c;一般横版视频在手机展示不会有影响&#xff0c;但是竖版视频会默认用横版的方式播放就会导致无法清晰的看到画面的内容&#xff0c;那么如何将竖版视频生成二维码是很多小伙伴头疼的一个问题。那么下面教大家使用二维码生成器…

Android 如何在Android studio中快速创建raw和assets文件夹

一 方案 1. 创建raw文件夹 切成project浏览模式——>找到res文件粘贴要放入raw文件夹下的文件。 当然此时raw文件还没有&#xff0c;直接在右侧输入框中出现的路径~\res后面加上\raw即可。 2. 创建assets文件夹 同理在main文件夹下粘贴要放入assets文件夹的文件&#xff0…

Java精品项目62基于Springboot+Vue实现的大学生在线答疑平台(编号V62)

Java精品项目62基于SpringbootVue实现的大学生在线答疑平台(编号V62) 大家好&#xff0c;小辰今天给大家介绍一个基于SpringbootVue实现的大学生在线答疑平台(编号V62)&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目…

云尘-Node1 js代码

继续做题 拿到就是基本扫一下 nmap -sP 172.25.0.0/24 nmap -sV -sS -p- -v 172.25.0.13 然后顺便fscan扫一下咯 nmap: fscan: 还以为直接getshell了 老演员了 其实只是302跳转 所以我们无视 只有一个站 直接看就行了 扫出来了两个目录 但是没办法 都是要跳转 说明还是需要…

tomcat必要的配置

tomcat要配置两个&#xff0c;不然访问不了localhost:8080 名&#xff1a;CATALINA_HOME 值&#xff1a;D:\software\computer_software\Tomcat\tomcat8.5.66

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档&#xff1a;Taro 文档 页面路由配置&#xff0c;配置在app.config.ts里面的pages里&#xff1a; window用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff0c;其配置项如下&#xff1a; tabBar配置&#xff1a;如果小程序是一个多 tab 应用&…