symic 发表于 2022-3-11 00:05

【平头哥RVB2601创意应用开发】+ 2个DEMO试用

本帖最后由 symic 于 2022-3-11 00:05 编辑

<p>趁着夜色,又开始了测试,这次测试了GUI和音频的demo。</p>

<p>首先是GUI的demo,分析源代码可以看到,主要运行逻辑还是在main.c,自建了一个流程导图。从中可以看出,整个程序还是以多任务形式展开。其中主函数main完成板级的初始化后,创建一个新的任务gui_lvgl_task,该任务实现关于oled屏的显示,主要包括以下过程</p>

<p>1、显示屏相关的初始化</p>

<p>2、创建需要显示的标签</p>

<p>3、在死循环中处理任务切换。</p>

<p>主要的文字显示工作在gui_label_create()中处理,包括设置label显示模式、对齐方式、坐标、宽高等属性。</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;这里摘抄部分关于AOS操作系统的知识。YoC开发板支持多种 RTOS 内核,已集成原生的 Rhino 内核,同时也支持 FreeRTOS 等多种开源RTOS内核。它采用统一的 AOS 操作系统API 实现操作系统接口的定义,用户可以根据项目要求,选择不同的 RTOS 内核,YoC 默认并推荐使用原生的 Rhino 内核,目前 已支持平头哥全系统 CPU 架构。Rhino 内核具备更快的中断处理响应,更快的优先级抢占调度,它具有体积小、功耗低、实时性强和调试方便等特点。供了丰富多元的内核原语,包括缓冲队列,环形缓冲区、定时器、信号量、互斥量、先入先出队列、事件等。在最小的配置下(只运行一个 IDLE 任务),仅需要1.9KB 的 ROM,1KB 的 RAM 空间。YoC 中定义了 RTOS 的基本操作,包括:任务管理、内存管理、信号量、消息队列、软件定时器等,即可以满足小系统的需要,也具备良好的可扩展性。<br />
&nbsp; &nbsp; &nbsp; 总的来说,GUI的DEMO测试还是比较简单的,下面尝试显示中文字符。其实中文显示的本质就是通过字库画点。</p>

<p>&nbsp; &nbsp; &nbsp; 打开player demo工程,在oled文件夹下建立两个文件,分别是hanzi.c和hanzi.h。参考坛友<a href="https://home.eeworld.com.cn/space-uid-65032.html" target="_blank">Laspide</a>老师的汉字显示例程(https://bbs.eeworld.com.cn/thread-1195840-1-1.html),首先从帖子中下载《GB2312汉字编码字符集对照表.xlsx》和hzk16.c,这两个文件分别是GB2312的汉字编码号,和相对的汉字字模库(16x16),可自行找到所需的汉字建立需要用到的字库。如下所示</p>

<p>&nbsp; &nbsp; &nbsp; 在oled.c中添加与汉字显示相关的代码</p>

<pre>
<code class="language-cpp">//汉字相关函数
uint8_t g_oled_whole;

/* 整个OLED清屏函数,清零屏OLED数组缓存*/
void refresh_oled_whole()
{
    uint8_t i, j;
       
    for(i = 0; i &lt; Max_Row; i++)
        {
      for (j = 0; j &lt; Max_Column; ++j)
      {
            g_oled_whole = 0;
                }
    }
}
/* 处理单个汉字*/
void handle_single_CH_character(uint8_t xpoint, uint8_t ypoint, uint8_t Chinese)
{
    uint8_t i, j, k;
    uint8_t currentByte;

    for (i = 0; i &lt; 16; ++i)
    {
      for (j = 0; j &lt; 2; ++j)
      {
            currentByte = Chinese;
            for (k = 0; k &lt; 8; ++k)
            {
                g_oled_whole = (currentByte &amp; 0x80) &gt;&gt; 7;
                currentByte = currentByte &lt;&lt; 1;
            }
      }
    }
}
/*显示汉字*/
void show_CH_character()
{

        oled_draw_frame(g_oled_whole);
        oled_reflesh();
}</code></pre>

<p>&nbsp; &nbsp; &nbsp; &nbsp;将新定义的函数声明到oled.h中,并在app_main.c中添加两条代码</p>

<pre>
<code class="language-cpp">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;
}</code></pre>

<p>&nbsp; &nbsp; &nbsp;这样就可以在屏幕上显示中文了。</p>

<p></p>

Jacktang 发表于 2022-3-11 07:46

<p>显示中文字符的字库是通过什么口装载</p>

soso 发表于 2022-3-11 09:24

<p>这是有时差?第一句话。:)</p>

symic 发表于 2022-3-11 15:45

soso 发表于 2022-3-11 09:24
这是有时差?第一句话。:)

<p>哈哈,意思就是白天干活没空,趁着晚上没事可以玩玩</p>

symic 发表于 2022-3-20 20:32

Jacktang 发表于 2022-3-11 07:46
显示中文字符的字库是通过什么口装载

<p>通过查表方式,建立单独的.h文件。</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】+ 2个DEMO试用