总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

资料截图 :

高级前端工程师必备资料包

* The buffer has to be greater than 1 display row
*
* There are 3 buffering configurations:
* 1. Create ONE buffer:
* LVGL will draw the display’s content here and writes it to your display
*
* 2. Create TWO buffer:
* LVGL will draw the display’s content to a buffer and writes it your display.
* You should use DMA to write the buffer’s content to the display.
* It will enable LVGL to draw the next part of the screen to the other buffer while
* the data is being sent form the first buffer. It makes rendering and flushing parallel.
*
* 3. Double buffering
* Set 2 screens sized buffers and set disp_drv.full_refresh = 1.
* This way LVGL will always provide the whole rendered screen in flush\_cb
* and you only need to change the frame buffer’s address.
*/

/\* Example for 1) \*/
static lv\_disp\_draw\_buf\_t draw_buf_dsc_1;
static lv\_color\_t buf_1[LV_HOR_RES_MAX \* 10];                          /\*A buffer for 10 rows\*/
lv\_disp\_draw\_buf\_init(&draw_buf_dsc_1, buf_1, NULL, LV_HOR_RES_MAX \* 10);   /\*Initialize the display buffer\*/

/\*-----------------------------------

* Register the display in LVGL
*----------------------------------*/

static lv\_disp\_drv\_t disp_drv;                         /\*Descriptor of a display driver\*/
lv\_disp\_drv\_init(&disp_drv);                    /\*Basic initialization\*/

/\*Set up the functions to access to your display\*/

/\*Set the resolution of the display\*/
disp_drv.hor_res = lcddev.width;
disp_drv.ver_res = lcddev.height;

/\*Used to copy the buffer's content to the display\*/
disp_drv.flush_cb = disp_flush;

/\*Set a display buffer\*/
disp_drv.draw_buf = &draw_buf_dsc_1;

/\*Required for Example 3)\*/
//disp\_drv.full\_refresh = 1

/\* Fill a memory array with a color if you have GPU.

* Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
* But if you have a different GPU you can use with this callback.*/
//disp_drv.gpu_fill_cb = gpu_fill;

/\*Finally register the driver\*/
lv\_disp\_drv\_register(&disp_drv);

}

/**********************
* STATIC FUNCTIONS
**********************/

/*Initialize your display and the required peripherals.*/
//static void disp_init(void)
//{
// /*You code here*/
//}

volatile bool disp_flush_enabled = true;

/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL
*/
void disp_enable_update(void)
{
disp_flush_enabled = true;
}

/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL
*/
void disp_disable_update(void)
{
disp_flush_enabled = false;
}

/*Flush the content of the internal buffer the specific area on the display
*You can use DMA or any hardware acceleration to do this operation in the background but
*‘lv_disp_flush_ready()’ has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{

LCD\_Color\_Fill(area->x1,area->y1,area->x2,area->y2,(u16\*)color_p);
lv\_disp\_flush\_ready(disp_drv);

}

#else /*Enable this file at the top*/

/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif


基本上只要修改disp\_flush函数,不同的屏幕显示接口移植


修改indev代码,配置好触摸屏驱动



/**
* @file lv_port_indev_templ.c
*
*/

/*Copy this file as “lv_port_indev.c” and set this value to “1” to enable content*/
#if 1

/*********************
* INCLUDES
*********************/
#include “lv_port_indev.h”
#include “…/lvgl.h”
#include “touch.h”
/*********************
* DEFINES
*********************/

/**********************
* TYPEDEFS
**********************/

/**********************
* STATIC PROTOTYPES
**********************/

static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);

/**********************
* STATIC VARIABLES
**********************/
lv_indev_t * indev_touchpad;

static int32_t encoder_diff;
static lv_indev_state_t encoder_state;

/**********************
* MACROS
**********************/

/**********************
* GLOBAL FUNCTIONS
**********************/

void lv_port_indev_init(void)
{
static lv_indev_drv_t indev_drv;

/\*------------------

* Touchpad
* -----------------*/

/\*Initialize your touchpad if you have\*/
touchpad\_init();

/\*Register a touchpad input device\*/
lv\_indev\_drv\_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = touchpad_read;
indev_touchpad = lv\_indev\_drv\_register(&indev_drv);

/*------------------
* Touchpad
* -----------------*/

/*Initialize your touchpad*/
static void touchpad_init(void)
{
/*Your code comes here*/
tp_dev.init();
if (0 == (tp_dev.touchtype & 0x80))
{
TP_Adjust();
TP_Save_Adjdata();
}
}

/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0;

/\*Save the pressed coordinates and the state\*/
if(touchpad\_is\_pressed()) 

{
touchpad_get_xy(&last_x, &last_y);
data->state = LV_INDEV_STATE_PR;
}
else {
data->state = LV_INDEV_STATE_REL;
}

/\*Set the last pressed coordinates\*/
data->point.x = last_x;
data->point.y = last_y;

}

/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{

if(tp_dev.sta & TP_PRES_DOWN)
  return true;
return false;

}

/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
(*x) = tp_dev.x[0];
(*y) = tp_dev.y[0];
}
#else /*Enable this file at the top*/

/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif


10. 注意:移植 LVGL 必须开启 C99 模式  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bad9786e6a7e4e7fb8e123b881fa4dd3.jpeg#pic_center)


#### 主函数配置


参考实际工程的东西,这里的许多的头文件包含,全部在main.h中



int main(void)
{
Hareware_Iint();
printf(“Hareware_Iint [OK] \r\n”);

lv\_init();			  // lvgl系统初始化
lv\_port\_disp\_init();  // lvgl显示接口初始化,放在lv\_init()的后面
lv\_port\_indev\_init(); // lvgl输入接口初始化,放在lv\_init()的后面
//lv\_example\_event\_1();
//lv\_example\_get\_started\_3();
//lv\_example\_anim\_timeline\_1();
//lv\_demo\_benchmark();
//lv\_example\_event\_3();
//lv\_example\_chart\_5();
//lv\_example\_list\_2();
//lv\_example\_roller\_3();
lv\_example\_meter\_1();
while (1)
{
    tp_dev.scan(0);
	lv\_task\_handler(); // lvgl的事务处理
}

}


### 移植效果


![在这里插入图片描述](https://img-blog.csdnimg.cn/76e14a13ca9b40d78ab86e065975e7f9.jpeg#pic_center)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c569e39e1f7b4c9cafc27da259c7f02a.jpeg#pic_center)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6768e14b4c65414eb2b680eb99e6a994.jpeg#pic_center)


![在这里插入图片描述](https://img-blog.csdnimg.cn/4b4e74dd3ba94fb8adb7343825dd04fe.jpeg#pic_center)


### 实用工具 | GUI-Guider的使用分享


[工具使用教程文章链接]( )


GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式设计LVGL GUI页面,加速GUI的设计。


设计完成的GUI页面可以在PC上仿真运行,确认设计完毕之后可以生成C代码,再整合到MCU项目中。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2735407f079e4ea1811c7813d6d8e900.jpeg#pic_center)  
 具体使用以后再说,先看看效果



lv_ui guider_ui;

int main(void)
{
Hareware_Iint();
printf(“Hareware_Iint [OK] \r\n”);

lv\_init();			  // lvgl系统初始化
lv\_port\_disp\_init();  // lvgl显示接口初始化,放在lv\_init()的后面
lv\_port\_indev\_init(); // lvgl输入接口初始化,放在lv\_init()的后面
//lv\_example\_event\_1();
//lv\_example\_get\_started\_3();

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

初始化,放在lv_init()的后面
lv_port_indev_init(); // lvgl输入接口初始化,放在lv_init()的后面
//lv_example_event_1();
//lv_example_get_started_3();

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

[外链图片转存中…(img-x9v8tj40-1715740387000)]

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐