jinglixixi 发表于 2020-8-7 23:44

【ESK32-360测评】+ OLED屏驱动

本帖最后由 jinglixixi 于 2020-8-8 00:07 编辑

<p>ESK32-360开发板是一款外设资源十分丰富的开发板,因此要想找出一个空余的引脚是很困难的。手头有一个0.91&#39; OLED 显示屏,打算在开发板上实现其驱动显示,在无奈之下,只好采用借鸡生蛋了,就是用LED1、LED2的GPIO口来驱动0.91&#39; OLED 屏。</p>

<p>LED的接口电路如图1所示,可用LED1来接SCLK,用LED2来接SDIN。</p>

<p></p>

<p>图1&nbsp; LED接口电路</p>

<p>&nbsp;</p>

<p>使LED1、LED2输出高低电平的定义语句为:</p>

<p>#define OLED_SCLK_Clr() GPIO_WriteOutBits(HTCFG_LED0, HTCFG_OUTPUT_LED0_GPIO_PIN, RESET);</p>

<p>#define OLED_SCLK_Set() GPIO_WriteOutBits(HTCFG_LED0, HTCFG_OUTPUT_LED0_GPIO_PIN, SET);</p>

<p>#define OLED_SDIN_Clr() GPIO_WriteOutBits(HTCFG_LED1, HTCFG_OUTPUT_LED1_GPIO_PIN, RESET);</p>

<p>#define OLED_SDIN_Set() GPIO_WriteOutBits(HTCFG_LED1, HTCFG_OUTPUT_LED1_GPIO_PIN, SET);</p>

<p>实现图2所示内容的主程序如下:</p>

<pre>
<code class="language-cpp">int main(void)         
{
FlagStatus TmpStatus = RESET;
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
HTCFG_OUTPUT_LED0_CLK(CKCUClock)    = 1;
HTCFG_OUTPUT_LED1_CLK(CKCUClock)    = 1;
HTCFG_OUTPUT_LED2_CLK(CKCUClock)    = 1;
HTCFG_INPUT_WAKE_CLK(CKCUClock)   = 1;
HTCFG_INPUT_KEY1_CLK(CKCUClock)   = 1;
HTCFG_INPUT_KEY2_CLK(CKCUClock)   = 1;
CKCUClock.Bit.AFIO                  = 1;
CKCUClock.Bit.BKP                   = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);

if (PWRCU_CheckReadyAccessed() != PWRCU_OK)
{
    while (1);
}

AFIO_GPxConfig(HTCFG_INPUT_WAKE_ID, HTCFG_INPUT_WAKE_AFIO_PIN, AFIO_MODE_1);
AFIO_GPxConfig(HTCFG_INPUT_KEY1_ID, HTCFG_INPUT_KEY1_AFIO_PIN, AFIO_MODE_DEFAULT);
AFIO_GPxConfig(HTCFG_INPUT_KEY2_ID, HTCFG_INPUT_KEY2_AFIO_PIN, AFIO_MODE_DEFAULT);

GPIO_DirectionConfig(HTCFG_WAKE, HTCFG_INPUT_WAKE_GPIO_PIN, GPIO_DIR_IN);
GPIO_DirectionConfig(HTCFG_KEY1, HTCFG_INPUT_KEY1_GPIO_PIN, GPIO_DIR_IN);
GPIO_DirectionConfig(HTCFG_KEY2, HTCFG_INPUT_KEY2_GPIO_PIN, GPIO_DIR_IN);

GPIO_PullResistorConfig(HTCFG_WAKE, HTCFG_INPUT_WAKE_GPIO_PIN, GPIO_PR_DOWN);
GPIO_PullResistorConfig(HTCFG_KEY1, HTCFG_INPUT_KEY1_GPIO_PIN, GPIO_PR_UP);
GPIO_PullResistorConfig(HTCFG_KEY2, HTCFG_INPUT_KEY2_GPIO_PIN, GPIO_PR_UP);

GPIO_InputConfig(HTCFG_WAKE, HTCFG_INPUT_WAKE_GPIO_PIN, ENABLE);
GPIO_InputConfig(HTCFG_KEY1, HTCFG_INPUT_KEY1_GPIO_PIN, ENABLE);
GPIO_InputConfig(HTCFG_KEY2, HTCFG_INPUT_KEY2_GPIO_PIN, ENABLE);


AFIO_GPxConfig(HTCFG_OUTPUT_LED0_ID, HTCFG_OUTPUT_LED0_AFIO_PIN, AFIO_MODE_DEFAULT);
AFIO_GPxConfig(HTCFG_OUTPUT_LED1_ID, HTCFG_OUTPUT_LED1_AFIO_PIN, AFIO_MODE_DEFAULT);
AFIO_GPxConfig(HTCFG_OUTPUT_LED2_ID, HTCFG_OUTPUT_LED2_AFIO_PIN, AFIO_MODE_DEFAULT);

GPIO_DirectionConfig(HTCFG_LED0, HTCFG_OUTPUT_LED0_GPIO_PIN, GPIO_DIR_OUT);
GPIO_DirectionConfig(HTCFG_LED1, HTCFG_OUTPUT_LED1_GPIO_PIN, GPIO_DIR_OUT);
GPIO_DirectionConfig(HTCFG_LED2, HTCFG_OUTPUT_LED2_GPIO_PIN, GPIO_DIR_OUT);

OLED_Init();       
OLED_Clear();
OLED_ShowString(16,0, "HT32F1654",16);
OLED_ShowString(16,2, "OLED TEST",16);
while(1);

}
</code></pre>

<p></p>

<p>图2&nbsp; OLED屏显示效果</p>

<p>&nbsp;</p>

<p>在添加汉字库和显示函数的情况下,其显示效果如图3所示。</p>

<p></p>

<p>图3&nbsp; OLED屏菜单效果</p>

<p>产生显示效果的语句为:</p>

<p>OLED_Clear();</p>

<p>OLED_ShowCHinese(0,0,0);&nbsp; //澎湖湾</p>

<p>OLED_ShowCHinese(18,0,1);&nbsp;</p>

<p>OLED_ShowCHinese(36,0,2);</p>

<p>OLED_ShowString(0,2, &quot;Player NO&quot;,16);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>

<p>&nbsp;</p>

<p>对应的显示函数为:</p>

<pre>
<code class="language-cpp">void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{                                
        u8 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>&nbsp;</p>
页: [1]
查看完整版本: 【ESK32-360测评】+ OLED屏驱动