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继电器按钮,则控制继电器吸合和断开

TFT-LCD LVGL与硬件交互相关推荐

  1. 【正点原子FPGA连载】 第二十九章TFT LCD画板实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  2. ESP32快速实现3.2英寸TFT LCD中jpeg图像(ILI9341)

    此视频中,将向您展示了如何在ESP32中使用3.2英寸SPI TFT LCD.为了显示jpeg,您需要一个ESP32,Adafruit库,SPIFF和jpeg解码器. 要获得高速SPI,您需要使用正确 ...

  3. AT32驱动TFT LCD显示示例

    1.1 案例 TFT LCD显示 1.1.1 简介 TFT LCD液晶显示屏是薄膜晶体管型液晶显示屏,TFT液晶每个像素都可以单独控制,因而每个节点都相对独立,并可以连续控制,这不仅提高了显示的反应速 ...

  4. ESP8266-Arduino编程实例-2.8寸TFT LCD驱动(ILI9341控制器)

    2.8寸TFT LCD驱动(ILI9341控制器) 液晶显示器 (LCD) 是一种平板显示器或其他电子调制光学设备,它利用液晶与偏振器的光调制特性.液晶不直接发光,而是使用背光或反射器来产生彩色或单色 ...

  5. 如何利用Arduino和TFT LCD操控NeoPixel LED灯条

    原文地址:https://circuitdigest.com/microcontroller-projects/neopixel-rgb-led-strip-with-arduino 如何利用Ardu ...

  6. ESP8266-Arduino编程实例-二维码(QR Code)生成与TFT LCD显示

    二维码(QR Code)生成与TFT LCD显示 QR 码(快速响应码的缩写)是一种矩阵条码(或二维条码,由日本汽车公司 Denso Wave 于 1994 年发明.条形码是一种机器可读的光学标签,可 ...

  7. js怎样和硬件交互_Node.js与JavaScript

    有很多介绍nodejs的文章,也有很多教程,覆盖了服务器开发.桌面开发.移动端等等,但是鲜有文章明确的回答过一个问题:Node是什么? 这看起来是一个再简单过的问题了,真要答起来可不容易,不去深入研究 ...

  8. TFT LCD显示原理详解

    <什么是液晶> 我们一般认为物体有三态:固态.液态.气态,其实这只是针对水而言,有一些有机化和物 还有介于固态和液态中间的状态 就是液晶态,如下图(一):                 ...

  9. TFT LCD显示屏在阳光下可读

    显示屏作为公共场所广泛使用的电器,高亮度液晶显示屏越来越被人们所选择. 那么为什么越来越多的人想选择高亮度TFT LCD 显示屏? 阳光下的可读性显示屏使我们即使在阳光直射下也能看到清晰锐利的图像或视 ...

最新文章

  1. Hi3516a移植SDL+FreeType+SDL_ttf
  2. 《交互式程序设计 第2版》一3.1 下载并安装Processing
  3. 看漫画学python电子书-看漫画学Python(有趣有料好玩好用全彩版)
  4. python大数据分析实例-Python实现的大数据分析操作系统日志功能示例
  5. 分布式会话拦截器2 - 会话判断
  6. c语言电子计算器课程设计报告,计算机程序设计课程设计报告.doc
  7. shell 产生随机数的多种方法
  8. excel利用countif/match/lookup函数对比分析数据
  9. bat小工具_字节跳动收购效率工具幕布,张一鸣的 To B 野心 | 36氪独家
  10. 东师2016年秋季计算机基础,东师2016年秋季《计算机基础》期末考核答案(1).doc
  11. ICS共享上网方案与配置
  12. 【java】Applet显示阶乘结果
  13. JavaScript-传值(引用类型,基本类型)
  14. Oracle内账号密码过期the password has expired
  15. 海量数据解决方案,知多少?
  16. 从Trie树(字典树)谈到后缀树(10.28修订)
  17. 服务器识别不了移动硬盘
  18. JS中的各种遍历方法
  19. 基于RGB-D数据的人体检测
  20. 如何快速准备面试中的算法,获得 Offer?

热门文章

  1. vmware mac安装教程 | 不能全屏的终极原因
  2. 初学VUE.js之数据绑定
  3. 星巴克招人!要技术大拿。
  4. 三坐标检测之精密模具检测2021
  5. arch nvidia驱动安装记录
  6. 千图成像(用图片拼图片)的java教程
  7. 关于Descriptors cannot not be created directly报错
  8. 清北学堂 2017-10-01
  9. 明解C语言(入门篇)第二章
  10. 雀巢“可持续发展列车”驶入瑞士驻华大使馆