04_瑞萨GUI(LVGL)移植实战教程之驱动LCD屏(SPI)

本系列教程配套出有视频教程,观看地址:https://www.bilibili.com/video/BV1gV4y1e7Sg

4. 驱动LCD屏(SPI)

本次实验我们在上一次实验的基础上驱动 LCD屏(SPI)。

上次实验我们已经能驱动触摸屏(I2C)并打印触摸点坐标,这次实验我们的目标是点亮LCD屏,向屏幕依次刷写红绿蓝三种不同的颜色,并在串口终端打印当前刷新的颜色文本信息。

4.1 复制工程

上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。

如果你不清楚复制工程的步骤,请参考阅读第2章实验的步骤教程。

本次实验我们的项目命名为:02_dshanmcu_ra6m5_spi_display

chapter-4_001

4.2 配置FSP

4.2.1 查看硬件资料

打开位于 03硬件资料\1_开发板原理图\ DshanMCU_RA6M5_V4.0.pdf 的开发板原理图,确认SPI引脚,电路图如下:

chapter-4_003

可以看到原理图并没有像之前那样直接就能确定使用的是哪一路spi,因此需要打开位于 03硬件资料\5_官方资料\RA6M5 Group User's Manual Hardware.pdf 的文档,跳转到下图所示的两个位置,确定使用的是 spi1:

chapter-4_003 chapter-4_003-0

03硬件资料\5_官方资料\RA6M5 Group User's Manual Hardware.pdf 的文档,跳转到下图所示的位置,确定SPI时钟频率计算公式:

chapter-4_003-1

打开 e2studio 如下窗口,确定当前的 PCLKA:
由下图可知 PCLKA 为 200MHz,因此可得出支持的SPI最大时钟频率为:100/ (2*(0+1) * 2^0) = 100 / 2 = 50Mbps

chapter-4_003-3

打开位于 4_模块资料\01_ST7796显示器芯片手册\ST7796U2_SPEC_V1.0.pdf 的文档,跳转到下图所示的位置:

chapter-4_003-3

通过换算可得出时钟频率: 1000000000 / 15= 66,666,666.66666667 ≈ 66.5Mhz

接下来我们根据这些信息对 r_spi 进行配置。

4.2.2 添加 Stacks(r_spi_master)

  1. 打开 FSP Configuration 视图:双击项目文件夹中的 configuration.xml 文件。
  2. 按照下图所示,添加 r_spi 模块:
chapter-4_005
  1. 点击刚刚添加的 r_spi 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

    • Name: g_spi1
    • Channel: 1
    • Callback: spi1_callback
    • Bitrate: 50000000
chapter-4_006

配置完成之后,如果马上编译会发现编译出错、可以根据错误信息进行解决,也可以在编译前参考下图解决:

chapter-4_007

点击刚刚添加的 r_dmac 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

  • Name: g_transfer1
  • Channel:1
chapter-4_008

4.2.3 配置RS、RESET、PWM引脚

这三个引脚,在上面的原理图中有标注,负责的功能分别是:

  • RS引脚(P104):低电平代表发送的是指令,高电平代表发送的是数据
  • RESET引脚(P105):控制LCD屏的复位
  • PWM引脚(P608):可以自由调节背光亮度调节,给高电平常亮

根据他们负责的功能特性,在FSP对其进行配置:

  1. 按下图所示操作,打开配置IO引脚页面:
chapter-4_009
  1. 按下图所示操作,配置RS引脚(P104)
chapter-4_010
  1. 按下图所示操作,配置RESET引脚(P105)
chapter-4_011
  1. 按下图所示操作,配置PWM引脚(P608)
chapter-4_012

最后检查确认无误,点击右上角的 “Generate Project Content” e2studio就会根据我们对FSP的配置自动配置项目、生成相应的代码。

chapter-4_012

4.3 编写LCD驱动代码

在e2studio中进入 02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\drivers 目录,新建如下两个文件 drv_spi_display.cdrv_spi_display.h

chapter-4_012

在e2studio中点击打开 02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\drivers\drv_spi_display.c 添加下面的代码:

/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "drv_spi_display.h"
#include <stdio.h>/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************/
#define LCD_DC_PIN              BSP_IO_PORT_01_PIN_04
#define LCD_RESET_PIN           BSP_IO_PORT_01_PIN_05
#define LCD_PWM_PIN             BSP_IO_PORT_06_PIN_08#define SPI_SEND_DATA           BSP_IO_LEVEL_HIGH
#define SPI_SEND_CMD            BSP_IO_LEVEL_LOW/* ST7796S部分寄存器定义 */
#define LCD_DISPLAY_CMD_RAMCTRL           0xb0 // RAM Control
#define LCD_DISPLAY_CMD_CASET             0x2a // Column address set
#define LCD_DISPLAY_CMD_RASET             0x2b // Row address set
#define LCD_DISPLAY_CMD_RAMWR             0x2c // Memory write/*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Private function prototypes**********************************************************************************************************************/
static void spi1_wait_for_tx(void);
static void spi_display_init(void);static fsp_err_t spi_send_data_cmd(uint8_t * uc_data, bsp_io_level_t uc_cmd, uint32_t len);
static fsp_err_t spi_display_backlight_opt(bsp_io_level_t opt);
static fsp_err_t spi_display_reset(void);/************************************************************************************************************************ Private global variables**********************************************************************************************************************/
/* Event flags for master */
static volatile spi_event_t g_master_event_flag;    // Master Transfer Event completion flag/************************************************************************************************************************ Functions**********************************************************************************************************************/fsp_err_t drv_spi_display_init(void)
{fsp_err_t err;/* 初始化I2C驱动 */err = g_spi1.p_api->open(&g_spi1_ctrl, &g_spi1_cfg);if (FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}spi_display_init();return err;
}void spi_display_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{uint8_t caset[4];uint8_t raset[4];caset[0] = (uint8_t)(x1 >> 8) & 0xFF;caset[1] = (uint8_t)(x1 & 0xff);caset[2] = (uint8_t)(x2 >> 8) & 0xFF;caset[3] = (uint8_t)(x2 & 0xff) ;raset[0] = (uint8_t)(y1 >> 8) & 0xFF;raset[1] = (uint8_t)(y1 & 0xff);raset[2] = (uint8_t)(y2 >> 8) & 0xFF;raset[3] = (uint8_t)(y2 & 0xff);spi_send_data_cmd((uint8_t []){LCD_DISPLAY_CMD_CASET}, SPI_SEND_CMD, 1); // Horizspi_send_data_cmd(caset, SPI_SEND_DATA, 4);spi_send_data_cmd((uint8_t []){LCD_DISPLAY_CMD_RASET}, SPI_SEND_CMD, 1); // Vertspi_send_data_cmd(raset, SPI_SEND_DATA, 4);spi_send_data_cmd((uint8_t []){LCD_DISPLAY_CMD_RAMWR}, SPI_SEND_CMD, 1); // Memory write
}fsp_err_t drv_spi_display_flush_data(uint8_t * data, uint32_t len)
{fsp_err_t err;err = spi_send_data_cmd(data, SPI_SEND_DATA, len);if (FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}return err;
}void spi1_callback(spi_callback_args_t *p_args)
{/* 判断是否是发送完成触发的中断 *//* 如果是的话就将发送完成标志位置1 */if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event){g_master_event_flag = SPI_EVENT_TRANSFER_COMPLETE;}else{g_master_event_flag = SPI_EVENT_TRANSFER_ABORTED;}
}/************************************************************************************************************************ Private Functions**********************************************************************************************************************/
static void spi1_wait_for_tx(void)
{while(!g_master_event_flag);g_master_event_flag = false;
}static void spi_display_init(void)
{spi_display_reset();spi_display_backlight_opt(BSP_IO_LEVEL_HIGH); // backlight on#if 1spi_send_data_cmd((uint8_t []){0x11}, SPI_SEND_CMD, 1);     // Sleep outspi_send_data_cmd((uint8_t []){0x20}, SPI_SEND_CMD, 1);     // 关闭显示反转spi_send_data_cmd((uint8_t []){0x36}, SPI_SEND_CMD, 1);     // 内存数据访问控制设置spi_send_data_cmd((uint8_t []){0x48}, SPI_SEND_DATA, 1);    // 显示方向:左->右,上->下(不旋转); BGRspi_send_data_cmd((uint8_t []){0x3a}, SPI_SEND_CMD, 1);     // 设置像素格式(bpp)spi_send_data_cmd((uint8_t []){0x55}, SPI_SEND_DATA, 1);    // RGB接口颜色格式:16bit/pixel;控制接口的颜色格式:16bit/pixelspi_send_data_cmd((uint8_t []){0x13}, SPI_SEND_CMD, 1);     // 普通显示模式spi_send_data_cmd((uint8_t []){0x29}, SPI_SEND_CMD, 1);     // 开启显示
#elifspi_send_data_cmd((uint8_t []){0x11}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x00}, SPI_SEND_DATA, 1);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS);     //延时120msspi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xc3}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x96}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0x36}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x48}, SPI_SEND_DATA, 1);    // RGBspi_send_data_cmd((uint8_t []){0xb4}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x01}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xb7}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xc6}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xe8}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x40, 0x8A, 0x00, 0x00, 0x29, 0x19, 0xA5, 0x33}, SPI_SEND_DATA, 8);spi_send_data_cmd((uint8_t []){0xc1}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x06}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xc2}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xa7}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xc5}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x18}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xe0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xF0, 0x09, 0x0B, 0x06, 0x04, 0x15, 0x2F, 0x54, 0x42, 0x3C, 0x17, 0x14, 0x18, 0x1B}, SPI_SEND_DATA, 14);spi_send_data_cmd((uint8_t []){0xe1}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xF0, 0x09, 0x0B, 0x06, 0x04, 0x03, 0x2D, 0x43, 0x42, 0x3B, 0x16, 0x14, 0x17, 0x1B}, SPI_SEND_DATA, 14);spi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x3c}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x69}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0x3a}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x55}, SPI_SEND_DATA, 1);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS);     //延时120msspi_send_data_cmd((uint8_t []){0x29}, SPI_SEND_CMD, 1);/*rotation*/spi_send_data_cmd((uint8_t []){0x36}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x48}, SPI_SEND_DATA, 1);    // 0
#endif}static fsp_err_t spi_send_data_cmd(uint8_t * uc_data, bsp_io_level_t uc_cmd, uint32_t len)
{fsp_err_t err = FSP_SUCCESS;     // Error status/* Master send data to device */err = g_ioport.p_api->pinWrite(g_ioport.p_ctrl, LCD_DC_PIN, uc_cmd);if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}err = g_spi1.p_api->write(g_spi1.p_ctrl, uc_data, len, SPI_BIT_WIDTH_8_BITS);if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}spi1_wait_for_tx();return err;
}static fsp_err_t spi_display_backlight_opt(bsp_io_level_t opt)
{fsp_err_t err = FSP_SUCCESS;     // Error statusg_ioport.p_api->pinWrite((ioport_ctrl_t * const )&g_ioport.p_ctrl, LCD_PWM_PIN, opt);return err;
}static fsp_err_t spi_display_reset(void)
{fsp_err_t err = FSP_SUCCESS;     // Error statusg_ioport.p_api->pinWrite((ioport_ctrl_t * const )&g_ioport.p_ctrl, LCD_RESET_PIN, BSP_IO_LEVEL_LOW);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS); //延时120msg_ioport.p_api->pinWrite((ioport_ctrl_t * const )&g_ioport.p_ctrl, LCD_RESET_PIN, BSP_IO_LEVEL_HIGH);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS); //延时120msreturn err;
}

在e2studio中点击打开 02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\drivers\drv_spi_display.h 添加下面的代码:

#ifndef DRV_SPI_DISPLAY_H
#define DRV_SPI_DISPLAY_H/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "hal_data.h"/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************/
#define LCD_SCREEN_WIDTH        (320)
#define LCD_SCREEN_HEIGHT       (480)#define LCD_COLOR_RED           (0xF800)
#define LCD_COLOR_GREEN         (0x07E0)
#define LCD_COLOR_BLUE          (0x001F)/*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Exported global variables**********************************************************************************************************************//************************************************************************************************************************ Exported global functions (to be accessed by other files)**********************************************************************************************************************/fsp_err_t drv_spi_display_init(void);void spi_display_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);fsp_err_t drv_spi_display_flush_data(uint8_t * data, uint32_t len);#endif /*DRV_SPI_DISPLAY_H*/

4.4 编写app

02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\applications 目录下新建 app_spi_display_test.c 文件,如下图所示:

chapter-4_014

打开 app_spi_display_test.c 添加如下代码:

/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "app.h"
#include "drv_uart.h"
#include "drv_spi_display.h"
#include <stdio.h>/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************//*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Private function prototypes**********************************************************************************************************************/
static void spi_display_show_color(uint16_t color_le);/************************************************************************************************************************ Private global variables**********************************************************************************************************************//************************************************************************************************************************ Functions**********************************************************************************************************************/
void app_spi_display_test(void)
{fsp_err_t err;err = drv_uart_init();if(FSP_SUCCESS != err) __BKPT();err = drv_spi_display_init();if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);__BKPT();}while(1){spi_display_show_color((uint16_t)LCD_COLOR_RED);printf ("Full screen display in red\r\n");R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //延时500msspi_display_show_color((uint16_t)LCD_COLOR_GREEN);printf ("Full screen display in green\r\n");R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //延时500msspi_display_show_color((uint16_t)LCD_COLOR_BLUE);printf ("Full screen display in blue\r\n");R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //延时500ms}}static void spi_display_show_color(uint16_t color_le)
{uint8_t color_be[2];color_be [0] = (uint8_t)((color_le & 0xff00) >> 8);color_be [1] = (uint8_t)(color_le & 0xff);spi_display_set_window(0, 0, LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);for(uint16_t x = 0; x < LCD_SCREEN_WIDTH; x++)for(uint16_t y = 0; y < LCD_SCREEN_HEIGHT; y++)drv_spi_display_flush_data(color_be, 2);
}
/************************************************************************************************************************ Private Functions**********************************************************************************************************************/

app.h 改为如下代码:

#ifndef APP_TEST_H
#define APP_TEST_H/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "hal_data.h"/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************//*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Exported global variables**********************************************************************************************************************//************************************************************************************************************************ Exported global functions (to be accessed by other files)**********************************************************************************************************************/void app_uart_test(void);void app_i2c_touchpad_test(void);void app_spi_display_test(void);#endif /*APP_TEST_H*/

4.5 调用app

打开 02_dshanmcu_ra6m5_spi_display\src\hal_entry.c ,按照如下步骤进行修改:

hal_entry 函数修改为如下所示的代码:

void hal_entry(void)
{/* TODO: add your own code here *///app_uart_test();//app_i2c_touchpad_test();app_spi_display_test();#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

4.6 验证效果

点击编译按钮,再点击 debug 按钮,将程序烧写到开发板中。会看到屏幕依次循环刷红、绿、蓝三种颜色。

【拓展】为什么要交换RGB565颜色数据两个字节的顺序

chapter-4_015

本节完

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

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

相关文章

CRC原理介绍及STM32 CRC外设的使用

1. CRC简介 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;简称CRC&#xff09;&#xff0c;由 W. Wesley Peterson 于 1961 年首次提出的一种纠错码理论。 CRC是一种数据纠错方法&#xff0c;主要应用于数据通信或者数据存储的场合&#xff…

《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》

&#x1f337;&#x1f341; 博主猫头虎&#x1f405;&#x1f43e; 带您进入 Golang 语言的新世界✨✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f…

【云原生系列】Docker学习

目录 一、Docker常用命令 1 基础命令 2 镜像命令 2.1 docker images 查看本地主机的所有镜像 2.2 docker search 搜索镜像 2.3 docker pull 镜像名[:tag] 下载镜像 2.4 docker rmi 删除镜像 2.5 docker build 构建镜像 3 容器命令 3.1 如拉取一个centos镜像 3.2 运行…

leetcode897. 递增顺序搜索树(java)

递增顺序搜索树 题目描述中序遍历代码演示 递归专题 题目描述 难度 - 简单 LC - 897. 递增顺序搜索树 给你一棵二叉搜索树的 root &#xff0c;请你 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子…

【Linux】进程间通信(匿名管道、命名管道、共享内存等,包含代码示例)

进程间通信 前言正式开始理解进程间通信一些标准管道原理管道演示匿名管道代码演示原理进程池管道大小 命名管道演示代码分配消息例子 systemV共享内存共享内存流程获取key值shm的创建shm的删除关联去关联完整流程演示开始通信 systemV 消息队列基于对共享内存的理解几个概念 前…

Kafka3.0.0版本——消费者(手动提交offset)

目录 一、消费者&#xff08;手动提交 offset&#xff09;的概述1.1、手动提交offset的两种方式1.2、手动提交offset两种方式的区别1.3、手动提交offset的图解 二、消费者&#xff08;手动提交 offset&#xff09;的代码示例2.1、手动提交 offset&#xff08;采用同步提交的方式…

解决ul元素不能跟div同一行显示的办法

现象如下&#xff1a; html结构如下&#xff1a; 可以看到div和ul是同级元素。 为什么这里ul换行了呢&#xff01; 这里要敲黑板了&#xff01; 因为ul是块级元素&#xff01;也就是独占一行&#xff0c;跟div一样。 如果需要ul跟div在同一行显示&#xff0c;则要求ul前面相…

基于改进二进制粒子群算法的含需求响应机组组合问题研究(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》第五章内容&#xff0c;主要做的是一个考虑需求响应的机组组合问题&#xff0c;首先构建了机组组合问题的基本模型&#x…

一文了解Android App Bundle 格式文件

1. Android App Bundle 是什么&#xff1f; 从 2021 年 8 月起&#xff0c;新应用需要使用 Android App Bundle 才能在 Google Play 中发布。 Android App Bundle是一种发布格式&#xff0c;打包出来的格式为aab&#xff0c;而之前我们打包出来的格式为apk。编写完代码之后&a…

vue3:5、组合式API-reactive和ref函数

<script setup> /* reactive接收一个对象类型的数据&#xff0c;返回一个响应式的对象 *//*** ref:接收简单类型或复杂类型&#xff0c;返回一个响应式对象* 本质&#xff1a;是在原有传入数据的基础上&#xff0c;外层报了一层对象&#xff0c;包成了复杂类型* 底层&…

Python小知识 - 如何使用Python进行机器学习

如何使用Python进行机器学习 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 机器学习是人工智能的一个分支&#xff0c;是让计算机自动“学习”。学习的过程是从经验E中获得知识K。经验E可以是一个数据集&#xff0c;比如一个图像数据集。知识K可以是计算机…

07_瑞萨GUI(LVGL)移植实战教程之LVGL对接EC11旋转编码器驱动

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 7. LVGL对接EC11旋转编码器驱动 本次实验我们向LVGL库中对接EC11旋转编码器驱动&#xff0c;让我们能通过EC11旋转编码器操作UI。 7.1 复制工程 上次实验得出的工…

景区AR虚拟三维场景沉浸式体验成为新兴的营销手段

科技的迅速崛起正在改变我们的世界&#xff0c;旅游业也在这股浪潮中掀起了一场全新的变革。增强现实(AR)技术正成为旅行中的一股强大力量&#xff0c;通过增添趣味和交互性&#xff0c;为旅程注入了前所未有的活力。本文将带您深入了解AR如何为旅游带来全新的体验&#xff0c;…

Docker 实现 MySQL 一主一从配置

1、新建主服务器容器实例&#xff0c;端口&#xff1a; 3307 docker run \ -p 3307:3306 \ --name mysql-master \ -v /var/docker/mysql-master/log:/var/log/mysql \ -v /var/docker/mysql-master/data:/var/lib/mysql \ -v /var/docker/mysql-master/conf:/etc/mysql \ --p…

【EI会议征稿】第三届机械自动化与电子信息工程国际学术会议(MAEIE 2023)

第三届机械自动化与电子信息工程国际学术会议&#xff08;MAEIE 2023&#xff09; 第三届机械自动化与电子信息工程国际学术会议&#xff08;MAEIE 2023&#xff09;将于2023年12月15-17日在江苏南京举行。本会议通过与业内众多平台、社会各团体协力&#xff0c;聚集机械自动…

【微信读书】数据内容接口逆向调试01

需求爬取微信读书的某一本书的整本书的内容 增强需求&#xff0c;大批量爬取一批书籍内容 众所周知微信读书是一个很好用的app&#xff0c;他上面书籍的格式很好&#xff0c;质量很高。 本人充值了会员但是看完做完笔记每次还得去翻很不方便&#xff0c;于是想把书籍内容弄下…

Visual Studio 线性表的链式存储节点输出引发异常:读取访问权限冲突

问题&#xff1a; 写了一个线性表的链式存储想要输出&#xff0c;能够输出&#xff0c;但是会报错&#xff1a;读取访问权限冲突 分析&#xff1a; 当我们输出到最后倒数第二个节点时&#xff0c;p指向倒数第二个节点并输出&#xff1b; 下一轮循环&#xff1a;p指向倒数第二…

027:vue中两列表数据联动,购物车添加、删除和状态更改

第027个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

javaee spring整合mybatis spring帮我们创建dao层

项目结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

buuctf crypto 【RSA2】解题记录

1.打开文件 2.写脚本 3.16进制转字符串