【平头哥RVB2601创意应用开发】+ 2个DEMO试用
[复制链接]
本帖最后由 symic 于 2022-3-11 00:05 编辑
趁着夜色,又开始了测试,这次测试了GUI和音频的demo。
首先是GUI的demo,分析源代码可以看到,主要运行逻辑还是在main.c,自建了一个流程导图。从中可以看出,整个程序还是以多任务形式展开。其中主函数main完成板级的初始化后,创建一个新的任务gui_lvgl_task,该任务实现关于oled屏的显示,主要包括以下过程
1、显示屏相关的初始化
2、创建需要显示的标签
3、在死循环中处理任务切换。
主要的文字显示工作在gui_label_create()中处理,包括设置label显示模式、对齐方式、坐标、宽高等属性。
这里摘抄部分关于AOS操作系统的知识。YoC开发板支持多种 RTOS 内核,已集成原生的 Rhino 内核,同时也支持 FreeRTOS 等多种开源RTOS内核。它采用统一的 AOS 操作系统API 实现操作系统接口的定义,用户可以根据项目要求,选择不同的 RTOS 内核,YoC 默认并推荐使用原生的 Rhino 内核,目前 已支持平头哥全系统 CPU 架构。Rhino 内核具备更快的中断处理响应,更快的优先级抢占调度,它具有体积小、功耗低、实时性强和调试方便等特点。供了丰富多元的内核原语,包括缓冲队列,环形缓冲区、定时器、信号量、互斥量、先入先出队列、事件等。在最小的配置下(只运行一个 IDLE 任务),仅需要1.9KB 的 ROM,1KB 的 RAM 空间。YoC 中定义了 RTOS 的基本操作,包括:任务管理、内存管理、信号量、消息队列、软件定时器等,即可以满足小系统的需要,也具备良好的可扩展性。
总的来说,GUI的DEMO测试还是比较简单的,下面尝试显示中文字符。其实中文显示的本质就是通过字库画点。
打开player demo工程,在oled文件夹下建立两个文件,分别是hanzi.c和hanzi.h。参考坛友Laspide老师的汉字显示例程(https://bbs.eeworld.com.cn/thread-1195840-1-1.html),首先从帖子中下载《GB2312汉字编码字符集对照表.xlsx》和hzk16.c,这两个文件分别是GB2312的汉字编码号,和相对的汉字字模库(16x16),可自行找到所需的汉字建立需要用到的字库。如下所示
在oled.c中添加与汉字显示相关的代码
//汉字相关函数
uint8_t g_oled_whole[Max_Row][Max_Column];
/* 整个OLED清屏函数,清零屏OLED数组缓存*/
void refresh_oled_whole()
{
uint8_t i, j;
for(i = 0; i < Max_Row; i++)
{
for (j = 0; j < Max_Column; ++j)
{
g_oled_whole[i][j] = 0;
}
}
}
/* 处理单个汉字*/
void handle_single_CH_character(uint8_t xpoint, uint8_t ypoint, uint8_t Chinese[32])
{
uint8_t i, j, k;
uint8_t currentByte;
for (i = 0; i < 16; ++i)
{
for (j = 0; j < 2; ++j)
{
currentByte = Chinese[i * 2 + j];
for (k = 0; k < 8; ++k)
{
g_oled_whole[xpoint + i][ypoint + j * 8 + k] = (currentByte & 0x80) >> 7;
currentByte = currentByte << 1;
}
}
}
}
/*显示汉字*/
void show_CH_character()
{
oled_draw_frame(g_oled_whole);
oled_reflesh();
}
将新定义的函数声明到oled.h中,并在app_main.c中添加两条代码
int main(void)
{
// must call this func when use c++
cxx_system_init();
board_yoc_init();
oled_init();
player_init();
cli_reg_cmd_player();
//新加的显示汉字代码
handle_single_CH_character(0, 0, acFontHZ16_c6bd); //平
handle_single_CH_character(0, 16, acFontHZ16_cdb7); //头
handle_single_CH_character(0, 32, acFontHZ16_b8e7); //哥
handle_single_CH_character(16, 0, acFontHZ16_c6e4); //其
handle_single_CH_character(16, 16, acFontHZ16_c0d6);//乐
handle_single_CH_character(16, 32, acFontHZ16_cede);//无
handle_single_CH_character(16, 48, acFontHZ16_c7ee);//穷
show_single_CH_character(0, 16);
return 0;
}
这样就可以在屏幕上显示中文了。
|