完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、初步探索
图上是用SPI1来进行 数据传输,我们通过cdk下载[color=rgba(0, 0, 0, 0.8)]ch2601_gui_demo该例程,通过oled.c源码中可以看出,从例程中看出spi采用IO模拟,没有用本身硬件的csi接口,少了一个可以正面接触硬件spi使用csi接口的机会。 之前由于本身单片机内部资源受限的问题,都是用点阵的形式,一个点一个点的描绘出要显示的图形以及内容,但是在该例程已经移植好了lvgl,我们就在巨人的肩膀上来使用lvgl这个GUI库。 lvgl通过oled.c中的 oled_init()函数进行显示区域的初始化,具体代码如下 void oled_init() { oled_pinmux_init(); oled_gpio_init(); oled_initialize(); // lv_disp porting /*Create a display buffer*/ lv_disp_buf_init(&disp_buf1, buf1, buf2, 64 * 128); /*Create a display*/ lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic initialization*/ disp_drv.buffer = &disp_buf1; disp_drv.flush_cb = oled_flush; disp_drv.rotated = 0; lv_disp_drv_register(&disp_drv); } 我们通过CDK下载例程代码看到如下 2、采用label显示字符串 该oled为128*64,我们就以16个点为一行字符,可分为4行,以下声明4个lv_obj_t对象指针及代码 lv_obj_t *label_line1; lv_obj_t *label_line2; lv_obj_t *label_line3; lv_obj_t *label_line4; static void gui_label_display(void) { label_line1= lv_label_create(lv_scr_act(), NULL); lv_label_set_long_mode(label_line1, LV_LABEL_LONG_DOT);//保持对象的大小不变,当文本内容太长显示不下时,会在文本末尾显示...三个点的省略号 lv_label_set_align(label_line1, LV_LABEL_ALIGN_CENTER); lv_obj_set_pos(label_line1, 0, 0); lv_obj_set_size(label_line1, 128, 16); lv_label_set_text(label_line1, "****************"); label_line2= lv_label_create(lv_scr_act(), NULL); lv_label_set_long_mode(label_line2, LV_LABEL_LONG_SROLL);//保持对象的大小不变,当文本内容太长显示不下时,会自动循环向前向后滚动文本 lv_label_set_align(label_line2, LV_LABEL_ALIGN_CENTER); lv_obj_set_pos(label_line2, 0, 16); lv_obj_set_size(label_line2, 128, 16); lv_label_set_anim_speed(label_line2,lv_label_get_anim_speed(label_line2)*2);//加快滚动速度 lv_label_set_text(label_line2, "THIS IS T-HEAD RISC-V GUI DEMO"); label_line3= lv_label_create(lv_scr_act(), NULL); lv_label_set_long_mode(label_line3, LV_LABEL_LONG_SROLL_CIRC);//保持对象的大小不变,当文本内容太长显示不下时,会自动循环环形滚动文本 lv_label_set_align(label_line3, LV_LABEL_ALIGN_CENTER); lv_obj_set_pos(label_line3, 0, 32); lv_obj_set_size(label_line3, 128, 16); lv_label_set_anim_speed(label_line3,lv_label_get_anim_speed(label_line3)*10);//加快滚动速度 lv_label_set_text(label_line3,"THIS IS T-HEAD RISC-V GUI DEMO"); label_line4= lv_label_create(lv_scr_act(), NULL); lv_label_set_long_mode(label_line4, LV_LABEL_LONG_DOT); lv_label_set_align(label_line4, LV_LABEL_ALIGN_CENTER); lv_obj_set_pos(label_line4, 0, 48); lv_obj_set_size(label_line4, 128, 16); lv_label_set_text(label_line4, "THIS IS T-HEAD RISC-V GUI DEMO");//保持对象的大小不变,当文本内容太长显示不下时,会在文本末尾显示...三个点的省略号 } 3、采用line画线绘制渐变正方形 我们采用 lv_line_create画线绘制正方形,使其从小慢慢变大,再慢慢变小 static void gui_rectangle_display(void) { lv_point_t line_points[] = { {64, 32}, {64, 32}, {64, 32}, {64, 32},{64, 32}};//中间点 /*Create style*/ static lv_style_t style_line; lv_style_init(&style_line); lv_style_set_line_width(&style_line, LV_STATE_DEFAULT, 1); //线宽1个像素点 lv_style_set_line_color(&style_line, LV_STATE_DEFAULT, LV_COLOR_BLACK); lv_style_set_line_rounded(&style_line, LV_STATE_DEFAULT, true); /*Create a line and apply the new style*/ lv_obj_t * obj1; obj1 = lv_line_create(lv_scr_act(), NULL); lv_obj_add_style(obj1, LV_LINE_PART_MAIN, &style_line); /*Set the points*/ lv_obj_align(obj1, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); for(int i=0;i<28;i++) { lv_line_set_points(obj1, line_points, 5); //走线绘制正方形 aos_msleep(200); line_points[0].x--; line_points[0].y--; line_points[1].x--; line_points[1].y++; line_points[2].x++; line_points[2].y++; line_points[3].x++; line_points[3].y--; line_points[4].x--; line_points[4].y--; } for(int i=0;i<28;i++) { lv_line_set_points(obj1, line_points, 5); /*Set the points*/ aos_msleep(200); line_points[0].x++; line_points[0].y++; line_points[1].x++; line_points[1].y--; line_points[2].x--; line_points[2].y--; line_points[3].x--; line_points[3].y++; line_points[4].x++; line_points[4].y++; } lv_line_set_points(obj1, line_points, 5); /*Set the points*/ aos_msleep(200); lv_obj_del(obj1);//清除对象 } 我们在main里面创建一个demo_gui_lvgl_task任务,直接在任务里面进行显示测试,代码如下 int main(void) { board_yoc_init(); lv_init(); /*Initialize for LittlevGL*/ oled_init(); aos_task_new("demo_gui", demo_gui_lvgl_task, NULL, 1024); while (1) { /* Periodically call the lv_task handler. * It could be done in a timer interrupt or an OS task too.*/ lv_task_handler(); aos_msleep(5); lv_tick_inc(1); } } demo_gui_lvgl_task任务代码如下: static void demo_gui_lvgl_task(void *arg) { int stat =0; char buf[64]; gui_rectangle_display(); aos_msleep(1000); gui_label_display(); while (1) { /* Periodically call the lv_task handler. * It could be done in a timer interrupt or an OS task too.*/ //lv_task_handler(); aos_msleep(1000); sprintf(buf,"%d",stat++); lv_label_set_text(label_line4,buf); //lv_tick_inc(1); } } 4、反色显示 为了更直观的看到图形,我们将oled进行反色,代码如下 5、显示效果 直接看视频吧 6、一些问题 lvgl我想绘制进度条和仪表盘绘制不起来,可能是单色oled的问题,也有可能是其他问题导致的,目前没有深入研究,有知道问题的大佬们看到的话,看是否能在评论区留言告知问题,在这里不胜感谢了!!! 文章转载自:平头哥芯片开放社区 作者:lianding |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15662 浏览 1 评论
13712 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19629 浏览 2 评论
59037 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
87765 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
746浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
643浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 18:42 , Processed in 0.501689 second(s), Total 37, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号