jinglixixi 发表于 2022-5-14 08:56

【兆易GD32F310测评】+OLED屏显示驱动

<p style="text-align:justify">对于GD32F310这种引脚不多、能耗低的MCU,要为它配上一个有效的显示器件,I2C接口的OLED屏自然是首先之一。</p>

<p>为便于灵活性的使用,这里是采用GPIO口模拟的方式来实现其显示驱动。</p>

<p>为保证引脚的输出有效,实现对选取的引脚PB6和PB7进行了输出能力的测试,其测试程序如下:</p>

<pre>
<code class="language-cpp">int main(void)

    systick_config();
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6|GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7);
    gpio_bit_reset(GPIOB, GPIO_PIN_6);
    gpio_bit_reset(GPIOB, GPIO_PIN_7);
    while(1){
        gpio_bit_write(GPIOB, GPIO_PIN_6, SET);
        gpio_bit_write(GPIOB, GPIO_PIN_7, SET);
        delay_1ms(1000);
        gpio_bit_write(GPIOB, GPIO_PIN_6, RESET);
        gpio_bit_write(GPIOB, GPIO_PIN_7, RESET);
        delay_1ms(1000);
    }
}</code></pre>

<p>经下载测试,其效果如图1所示,说明控制有效。</p>

<p> &nbsp;</p>

<p>图1 引脚测试</p>

<p>随后,便是模拟I2C来驱动OLED屏。</p>

<p>起初在编译后,一直提示存储空间不足,为此进行了诸段的测试。</p>

<p>首先是只保留了较小规模的汉字字模库,经测试显示效果如图2所示,说明程序不存在问题,只是内存小的问题。</p>

<p> &nbsp;</p>

<p>图2 汉字显示</p>

<p>显示汉字显示的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    systick_config();
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6|GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7);
    gpio_bit_reset(GPIOB, GPIO_PIN_6);
    gpio_bit_reset(GPIOB, GPIO_PIN_7);
    OLED_Init();
    OLED_Clear();
    OLED_ShowCHinese(0,0,0);
    OLED_ShowCHinese(20,0,1);
    while(1) ;
}</code></pre>

<p>相应的汉字显示函数为:</p>

<pre>
<code class="language-cpp">void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
{
    uint8_t t,adder=0;
    OLED_Set_Pos(x,y);
    for(t=0;t&lt;16;t++)
    {
         OLED_WR_Byte(Hzk,OLED_DATA);
         adder+=1;
    }
    OLED_Set_Pos(x,y+1);
    for(t=0;t&lt;16;t++)
    {
         OLED_WR_Byte(Hzk,OLED_DATA);
         adder+=1;
    }
}</code></pre>

<p>接着去除了汉字库,只添加8*16点阵的字库来显示,其显示效果如图3所示,说明用该字库是可以满足显示的基本需要的。为此,就只使用该字库来支持OLED屏的显示了。</p>

<p> &nbsp;</p>

<p>图2 字符串显示</p>

<p>实现字符串显示的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    systick_config();
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6|GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7);
    gpio_bit_reset(GPIOB, GPIO_PIN_6);
    gpio_bit_reset(GPIOB, GPIO_PIN_7);
    OLED_Init();
    OLED_Clear();
    OLED_ShowChar(0,0,'V',16);
    OLED_ShowString(20,0,"GD32F310K8T6",16);
    OLED_ShowString(20,2,"OLED test",16);
    while(1) ;
}</code></pre>

<p>支持该显示效果的字符及字符串显示函数为:</p>

<pre>
<code class="language-cpp">void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
{
        unsigned char c=0,i=0;
        c=chr-' ';
        if(x&gt;Max_Column-1)
        {
            x=0;
            y=y+2;
        }
        if(Char_Size ==16)
        {
            OLED_Set_Pos(x,y);
            for(i=0;i&lt;8;i++) OLED_WR_Byte(F8X16,OLED_DATA);
            OLED_Set_Pos(x,y+1);
            for(i=0;i&lt;8;i++) OLED_WR_Byte(F8X16,OLED_DATA);
         }
}


void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
{
    uint8_t t,temp;
    uint8_t enshow=0;
    for(t=0;t&lt;len;t++)
    {
        temp=(num/oled_pow(10,len-t-1))%10;
        if(enshow==0&amp;&amp;t&lt;(len-1))
        {
            if(temp==0)
            {
                OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
                continue;
            }
            else
            enshow=1;
        }
        OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
    }
}


void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
    unsigned char j=0;
    while (chr!='\0')
    {
          OLED_ShowChar(x,y,chr,Char_Size);
            x+=8;
            if(x&gt;120)
            {
                x=0;
                y+=2;
            }
            j++;
    }
}</code></pre>

<p>这样再有显示输出的工作,就不用完全只靠串口输出功能了!</p>

lugl4313820 发表于 2022-5-14 09:52

那灯好漂亮,是干什么东东呀!

jinglixixi 发表于 2022-5-14 18:22

lugl4313820 发表于 2022-5-14 09:52
那灯好漂亮,是干什么东东呀!

<p>哦,是个LED模块,用起来比较安全,可以测试指定GPIO口的输出性能。</p>

csfc 发表于 2024-5-17 14:56

<p>博主又没有源代码,想参照了改写到GD32F303中<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>

emma2015 发表于 2024-5-22 11:49

<p>LED模块,用起来比较安全,可以测试指定GPIO口的输出性能。</p>
页: [1]
查看完整版本: 【兆易GD32F310测评】+OLED屏显示驱动