TFT-LCD LVGL与硬件交互

news2024/11/16 1:16:25

TFT-LCD LVGL与硬件交互

屏幕能正常显示LVGL官方例程,说明LVGL移植成功了,本次实验使用屏幕通过LVGL控制开发板硬件

实现效果

用LVGL画两个按钮和一个标签,一个按钮控制蜂鸣器,另一个按钮控制继电器,标签显示“TFT-LCD”

新建GUI.c和GUI.h

首先在工程上新建自己的GUI.c源文件和GUI.h头文件,再把蜂鸣器Buzzer和继电器Relay的源文件和头文件都加到工程里来

在这里插入图片描述

参考lv_ex_get_started_1.c代码

lv_ex_get_started_1函数就是创建了一个带"Button"标签的按钮,函数里设置了按钮的显示位置,按钮大小,按钮点击事件;

点击事件是通过回调函数的形式来实现的,btn_event_cb函数给出了点击按钮后要执行的操作,示例代码里实现效果是每点击一次按钮,则标签数字加一

#include "../../lv_examples.h"

static void btn_event_cb(lv_obj_t * btn, lv_event_t event)
{
    if(event == LV_EVENT_CLICKED) {
        static uint8_t cnt = 0;
        cnt++;

        /*Get the first child of the button which is the label and change its text*/
        lv_obj_t * label = lv_obj_get_child(btn, NULL);
        lv_label_set_text_fmt(label, "Button: %d", cnt);
    }
}

/**
 * Create a button with a label and react on Click event.
 */
void lv_ex_get_started_1(void)
{
    lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);     /*Add a button the current screen*/
    lv_obj_set_pos(btn, 10, 10);                            /*Set its position*/
    lv_obj_set_size(btn, 120, 50);                          /*Set its size*/
    lv_obj_set_event_cb(btn, btn_event_cb);                 /*Assign a callback to the button*/

    lv_obj_t * label = lv_label_create(btn, NULL);          /*Add a label to the button*/
    lv_label_set_text(label, "Button");                     /*Set the labels text*/
}

GUI.c

参考官方代码,编写蜂鸣器按钮函数、继电器按钮函数和标签函数,按钮点击事件就分别实现翻转蜂鸣器和翻转继电器

在GUI.h头文件中用结构体封装按钮和标签函数,点击事件函数不用

/* Includes ------------------------------------------------------------------*/
#include "MyApplication.h"

/* Private define-------------------------------------------------------------*/

/* Private variables----------------------------------------------------------*/
static void Button_Relay(void);
static void Button_Buzzer(void);
static void Label(void);
/* Public variables-----------------------------------------------------------*/
GUI_t GUI = 
{
	Button_Relay,
	Button_Buzzer,
	Label
};

/* Private function prototypes------------------------------------------------*/      

/*
 * @name   btn_event_cb_Relay
 * @brief  继电器按钮事件
 * @param  None
 * @retval None      
*/
static void btn_event_cb_Relay(lv_obj_t * btn, lv_event_t event)
{
	//检测到单击事件
    if(event == LV_EVENT_CLICKED) {	
        //翻转继电器
        Relay.Relay_Flip();
    }
}

/*
* @name   btn_event_cb_Buzzer
* @brief  蜂鸣器按钮事件
* @param  None
* @retval None      
*/
static void btn_event_cb_Buzzer(lv_obj_t * btn, lv_event_t event)
{
	//检测到单击事件
    if(event == LV_EVENT_CLICKED) {	
        //翻转蜂鸣器
        if(Buzzer.Status == OFF_Status)
        {
            Buzzer.Buzzer_ON();
        }
        else
        {
            Buzzer.Buzzer_OFF();
        }
    }
}

/*
* @name   Button_Relay
* @brief  初始化继电器按钮
* @param  None
* @retval None      
*/
static void Button_Relay(void)
{
	lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);     //在屏幕上添加一个按钮
    lv_obj_set_pos(btn, 60, 200);                           //设置按钮位置
    lv_obj_set_size(btn, 120, 50);                          //设置按钮大小
    lv_obj_set_event_cb(btn, btn_event_cb_Relay);           //通过回调函数添加按钮事件

    lv_obj_t * label = lv_label_create(btn, NULL);          //为按钮创建一个标签
    lv_label_set_text(label, "Relay");                     	//添加标签文本
}

/*
* @name   Button_Buzzer
* @brief  初始化蜂鸣器按钮
* @param  None
* @retval None      
*/
static void Button_Buzzer(void)
{
	lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);     //在屏幕上添加一个按钮
    lv_obj_set_pos(btn, 60, 130);                           //设置按钮位置
    lv_obj_set_size(btn, 120, 50);                          //设置按钮大小
    lv_obj_set_event_cb(btn, btn_event_cb_Buzzer);          //通过回调函数添加按钮事件

    lv_obj_t * label = lv_label_create(btn, NULL);          //为按钮创建一个标签
    lv_label_set_text(label, "Buzzer");                     //添加标签文本
}

/*
* @name   Label
* @brief  创建一个标签
* @param  None
* @retval None      
*/
static void Label(void)
{
	lv_obj_t * label = lv_label_create(lv_scr_act (), NULL); //创建一个标签
	lv_obj_set_pos(label, 70, 80); 							//设置标签位置
    lv_label_set_text(label, "TFT-LCD");                     //添加标签文本
}

/********************************************************
  End Of File
********************************************************/

MyInit.c

在初始化函数中调用创建按钮和标签函数

/*
	* @name   Peripheral_Set
	* @brief  外设设置
	* @param  None
	* @retval None      
*/
static void Peripheral_Set()
{
	Timer6.Timer6_Start_IT(); //启动定时器6
	//调用lvgl的初始化函数
	lv_init();
	lv_port_disp_init();
	lv_port_indev_init();
  //触摸屏幕校准		SPI_Flash.ReadUnfixed(&Touch_Calibrate_Para.Calibrate_Flag,Touch_Calibrate_Para_Addr,sizeof(Touch_Calibrate_Para));
	if(Touch_Calibrate_Para.Calibrate_Flag != Touch_Calibrate_OK) 
	{
		while(!Touch.Calibrate());
	}
	
	//调用lvgl应用初始化
//	lv_ex_get_started_1();
//	lv_ex_get_started_2();
//	lv_ex_get_started_3();
//	lv_demo_widgets();
	GUI.Label();
	GUI.Button_Buzzer();
	GUI.Button_Relay();
}

主函数中需要调用lv_task_handler函数启动GUI任务

/*
* @name   Run
* @brief  系统运行
* @param  None
* @retval None      
*/
static void Run()
{		
	//获取坐标板坐标
	if(Touch.Scan() == TRUE)
	{
		//通过该标志位知道屏幕是否被触摸更新坐标
		Touch.Touch_Flag = TRUE;
	}
	//启动GUI任务
	lv_task_handler();
}

调整显示的字体大小

在lv_conf.h头文件中可以修改显示的字体大小,在下图的宏定义处,想用哪一号字体就改为1,则对应字体的代码会加入编译,代码量会变大,按需添加;默认使用14号,本次实验添加了26号

在这里插入图片描述

在481行处将正常模式(NORMAL)的字体改为26的

在这里插入图片描述

显示效果

显示了"TFT-LCD"标签,再显示两个按钮,点击Buzzer蜂鸣器按钮,则控制蜂鸣器开启和停止,点击Relay继电器按钮,则控制继电器吸合和断开

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于intel机器人控制器,支持slam,激光雷达和AI加速

9th/8th gen Intel Core™ i7/i5/i3 & Celeron.XM-5149 是专为机器人行业设计的工业计算机产品,高性能的处理能力加速 AI 学习速度,多种类 I/0 可接摄像头、雷达等丰富外设。在设备密闭舱体内,整机可以高温稳定运行不降速。 产品规格 芯…

flink不同部署方式-1.14

1. 版本说明 本文档内容基于 flink-1.14.x,其他版本的整理,请查看本人博客的 flink 专栏其他文章。 2. 概述 Flink 是一种通用性框架,支持多种不同的部署方式。 本章简要介绍 Flink 集群的组成部分、用途和可用实现。如果你只是想在本地启…

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等 1. 公式示例 E(T)∑(p,q)ϵκ∣∣p−Tq∣∣2E(T)\sum_{(p,q)\epsilon\kappa} \mid\mid p-T_q \mid \mid ^2 E(T)(p,q)ϵκ∑​∣∣p−Tq​∣∣2 E(T)∑(p,q)ϵκ…

高数 |【23数一 李林六套卷】卷四 自用思路 及 知识点 整理

23数一 李林六套卷 —— 自用思路 及 知识点 整理 ——【卷一】 以下均为个人复盘。 T1:高阶无穷小 T6:傅里叶级数 法一:直接套傅里叶展开公式,死算 法二:用技巧。取一个x,看最后结果趋近于这个数!是趋近于!不是直接等于 直接等于不可以。再来看下一个。

Java--IO流详解

目录 一、IO流的介绍 二、IO流的具体详解 (1)字节流 1:FileOutputStream 2:FileInputStream (2)字符流 1:解码编码 2:FileReader 3:FileWriter 三、IO流的使用 …

MATLB|基于改进教学的优化算法(TLSBO)的最优功率优化

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 📝目前更新:🌟🌟🌟电力系统相关知识,期刊论文&…

使用 Zabbix 监控Oracle

zabbix ODBC 数据库监控 ODBC 是 C 语言开发的、用于访问数据库的中间件接口.zabbix 支持查询任何 ODBC 支持的数据库.zabbix 经过调用 ODBC 来获取数据库的数据以及数据库状态等等信息 一、安装unixODBC 官方主页:http://www.unixodbc.org/download.html 使用阿里巴巴提供的…

线性方程组迭代法

雅可比迭代法与高斯-塞德尔迭代法 雅可比迭代法 例一 {10x1−x2−2x37.2−x110x2−2x38.3−x1−x25x34.2\left\{\begin{array}{l} 10 x_{1}-x_{2}-2 x_{3}7.2 \\ -x_{1}10 x_{2}-2 x_{3}8.3 \\ -x_{1}-x_{2}5 x_{3}4.2 \end{array}\right. ⎩⎨⎧​10x1​−x2​−2x3​7.2−x…

Css-Grid布局(强大)

前言 我们前面讲的Flex布局是轴线布局,只能指定"项目"针对轴线的位置,可以看做是一维布局,Grid布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格&…

从手动测试到自动化测试老司机,只用了3个月,我的薪资翻了一倍

虽然笔者是一个测试老人了,但是基本上所有的测试经验都停留在手工测试方面,对于自动化测试方面的实战经验少之又少,可以说,从这个角度来说,就像生活在原始社会,一切靠双手解决问题。(别想歪了&a…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Introduction

文章目录一、深度学习的概念二、函数的类型三、深度学习的步骤3.1 定义一个参数未知的函数表达式3.2 定义一个损失函数3.3 采用梯度下降法求解使得函数表达式的Loss最小的参数四、视频播放量预测案例4.1 案例介绍和思路分析4.2 线性函数表达式14.3 改进1:使用前一段…

此文件存在危险因此chrome已将其拦截

当您尝试在 chrome 中下载一些文件时,有时 chrome 会说“此文件可能很危险,因此 Chrome 已阻止它”。这可能是因为 Chrome 的内置安全功能可能已将其检测为可能有害的文件。但是,如果您信任文件的来源并想要下载它,那么您可以按照…

authorization server client resource 使用1

authorization server && client && resource 使用1 OAuth2介绍 OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上…

leetcode.1691 堆叠长方体的最大高度 - dp + 排序

1691. 堆叠长方体的最大高度 目录 1、java 2、c 思路: 根据题目描述,长方体 j 能够放在长方体 i 上,当且仅当 题目允许旋转长方体,也就是可以选择长方体的任意一边作为长方体的高。 对于任意一种合法的堆叠&#xff0…

聊一聊三级等保

本文为joshua317原创文章,转载请注明:转载自joshua317博客 聊一聊三级等保 - joshua317的博客 一、前言 1.1 基本认知 网络安全:根据《信息安全技术网络安全等级保护基本要求》(GB/T 22239-2019),是指通过采取必要措…

m基于功率谱,高阶累积量和BP神经网络-GRNN网络的调制方式识别仿真,对比2psk,4PSK,2FSK以及4FSK

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 首先区分大类的话采用的基于功率谱提取的len参数(峰值频率间隔),用峰值个数来代替,这样能很好的区分大类把MFSK和MPSK信号区分开。 针对MPSK&…

VSCode-远程连接服务器进行开发

一:安装插件 二:设置SSH 按照划线位置依次配置要连接的服务器配置 三:打开远程连接选项 勾选此选项后即可显示配置好的远程服务器,点击登录即可。 输入服务器用户密码 注意 :终端框install不要关闭!&#…

基于MPS算法和改进的非支配排序遗传算法II(MNSGA-II)求解配备起重机的模糊鲁棒设施布局问题(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【C语言航路】第八站:调试(第二幕)

目录 四、一些调试的实例 1.实例一 2.实例二 五、如何写出优秀的,易于调试的代码 1.优秀的代码 2.几个经典的例子 (1)模拟实现strcpy函数 (2)模拟实现strlen 六、编程常见的错误 1.编译型错误 2.链接型错误 …

Spring学习:学完总结

前言: 此次学习大概花了6天的时间,不过只是浅浅的学到了皮毛,所以后面有新的理解就会持续更新!下面是一些重点总结。 总结: 一、Spring概述 1.1 什么是Spring (1)全称:EJB(sun企…