TL-LED 发表于 2024-9-11 23:33

【匠芯创D133CBS】I2C驱动OLED显示屏

本帖最后由 TL-LED 于 2024-9-11 23:33 编辑

<p><span style="font-size:16px;">测试I2C接口,驱动OLED显示屏。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>一、硬件电路</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">电路板上方面外部连接的I2C端口就是J11插件对应的I2C0。</span></p>

<p><span style="font-size:16px;">1.1、I2C0接口电路图部分</span></p>

<p><span style="font-size:16px;"></span></p>

<p><span style="font-size:16px;">1.2、硬件连接图</span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>二、配置I2C</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">2.1、打开I2C0</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">2.2、使能I2C驱动调试和例程</span></p>

<p><span style="font-size:16px;"></span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>三、配置第三方库</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">3.1、选择SSD1306库</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">3.2、选择I2C0和使能测试例程</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">选择完成后 ,执行命令pkgs --update跟新库文件</span></p>

<p><span style="font-size:16px;">下载完成后,会在packages目录下找到源文件</span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>四、程序</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">4.1、ssd1306_tests.c</span></p>

<pre>
<code>/*
* Copyright (c) 2020, RudyLo &lt;luhuadong@163.com&gt;
*
* SPDX-License-Identifier: MIT License
*
* Change Logs:
* Date         Author       Notes
* 2020-11-15   luhuadong    the first version
*/

#include &lt;rtthread.h&gt;
#include &lt;rtdevice.h&gt;
#include &lt;board.h&gt;

#include &lt;string.h&gt;
#include &lt;stdio.h&gt;
#include "ssd1306.h"
#include "ssd1306_tests.h"

void ssd1306_TestBorder()
{
    ssd1306_Fill(Black);

    uint32_t start = rt_tick_get();
    uint32_t end = start;
    uint8_t x = 0;
    uint8_t y = 0;
    do {
      ssd1306_DrawPixel(x, y, Black);

      if((y == 0) &amp;&amp; (x &lt; 127))
            x++;
      else if((x == 127) &amp;&amp; (y &lt; 63))
            y++;
      else if((y == 63) &amp;&amp; (x &gt; 0))
            x--;
      else
            y--;

      ssd1306_DrawPixel(x, y, White);
      ssd1306_UpdateScreen();
   
      rt_thread_mdelay(5);
      end = rt_tick_get();
    } while((end - start) &lt; 8000);
   
    rt_thread_mdelay(1000);
}

void ssd1306_TestFonts()
{
    ssd1306_Fill(Black);
    ssd1306_SetCursor(2, 0);
    ssd1306_WriteString("Font 16x26", Font_16x26, White);
    ssd1306_SetCursor(2, 26);
    ssd1306_WriteString("Font 11x18", Font_11x18, White);
    ssd1306_SetCursor(2, 26+18);
    ssd1306_WriteString("Font 7x10", Font_7x10, White);
    ssd1306_SetCursor(2, 26+18+10);
    ssd1306_WriteString("Font 6x8", Font_6x8, White);
    ssd1306_UpdateScreen();
}

void ssd1306_TestFPS()
{
    ssd1306_Fill(White);
   
    uint32_t start = rt_tick_get();
    uint32_t end = start;
    int fps = 0;
    char message[] = "ABCDEFGHIJK";
   
    ssd1306_SetCursor(2,0);
    ssd1306_WriteString("Testing...", Font_11x18, Black);
   
    do {
      ssd1306_SetCursor(2, 18);
      ssd1306_WriteString(message, Font_11x18, Black);
      ssd1306_UpdateScreen();
      
      char ch = message;
      memmove(message, message+1, sizeof(message)-2);
      message = ch;

      fps++;
      end = rt_tick_get();
    } while((end - start) &lt; 5000);
   
    rt_thread_mdelay(1000);

    char buff;
    fps = (float)fps / ((end - start) / 1000.0);
    snprintf(buff, sizeof(buff), "~%d FPS", fps);
   
    ssd1306_Fill(White);
    ssd1306_SetCursor(2, 18);
    ssd1306_WriteString(buff, Font_11x18, Black);
    ssd1306_UpdateScreen();
}

void ssd1306_TestLine()
{
    ssd1306_Line(1,1,SSD1306_WIDTH - 1,SSD1306_HEIGHT - 1,White);
    ssd1306_Line(SSD1306_WIDTH - 1,1,1,SSD1306_HEIGHT - 1,White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestRectangle()
{
    uint32_t delta;

    for(delta = 0; delta &lt; 5; delta ++)
    {
      ssd1306_DrawRectangle(1 + (5*delta),1 + (5*delta) ,SSD1306_WIDTH-1 - (5*delta),SSD1306_HEIGHT-1 - (5*delta),White);
    }
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestCircle()
{
    uint32_t delta;

    for(delta = 0; delta &lt; 5; delta ++)
    {
      ssd1306_DrawCircle(20* delta+30, 30, 10, White);
    }
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestArc()
{
    ssd1306_DrawArc(30, 30, 30, 20, 270, White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestPolyline()
{
    SSD1306_VERTEX loc_vertex[] =
    {
      {35,40},
      {40,20},
      {45,28},
      {50,10},
      {45,16},
      {50,10},
      {53,16}
    };

    ssd1306_Polyline(loc_vertex,sizeof(loc_vertex)/sizeof(loc_vertex),White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestAll()
{
    ssd1306_Init();

    ssd1306_TestFPS();
    rt_thread_mdelay(3000);

    ssd1306_TestBorder();

    ssd1306_TestFonts();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestRectangle();
    ssd1306_TestLine();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestPolyline();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestArc();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestCircle();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_SetCursor(0, 0);
    ssd1306_WriteString("MCU:D133CBS", Font_11x18, White);
    ssd1306_SetCursor(0, 20);
    ssd1306_WriteString("I2C:OLED", Font_11x18, White);
    ssd1306_UpdateScreen();
    rt_thread_mdelay(3000);
}

#ifdef FINSH_USING_MSH
MSH_CMD_EXPORT(ssd1306_TestAll, test ssd1306 oled driver);
#endif
</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">4.2、ssd1306_tests.h</span></p>

<pre>
<code>/*
* Copyright (c) 2020, RudyLo &lt;luhuadong@163.com&gt;
*
* SPDX-License-Identifier: MIT License
*
* Change Logs:
* Date         Author       Notes
* 2020-11-15   luhuadong    the first version
*/

#ifndef __SSD1306_TEST_H__
#define __SSD1306_TEST_H__

#include &lt;_ansi.h&gt;

_BEGIN_STD_C

void ssd1306_TestBorder(void);
void ssd1306_TestFonts(void);
void ssd1306_TestFPS(void);
void ssd1306_TestAll(void);
void ssd1306_TestLine(void);
void ssd1306_TestRectangle(void);
void ssd1306_TestCircle(void);
void ssd1306_TestArc(void);
void ssd1306_TestPolyline(void);



_END_STD_C

#endif // __SSD1306_TEST_H__
</code></pre>

<p>&nbsp;</p>

<p><strong><span style="font-size:16px;">五、程序运行</span></strong></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">下载程序后,串口终端执行ssd1306_TestAll,显示如下视频</span></p>

<p>611fe0121d6af809710bcba4fb4516db<br />
&nbsp;</p>
页: [1]
查看完整版本: 【匠芯创D133CBS】I2C驱动OLED显示屏