打印
[方案相关]

【华大测评】+OLED屏显示驱动

[复制链接]
5464|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
与其他的开发板不同,在HC32F460开发板上配置了小巧别致的I2C接口OLED屏。有了它,我们需要显示的数据和信息就不必完全借助于串口通信了!
好像是华大要测试测评者的水平,尽管开发板配置了OLED显示屏,但在例程中却没有提供相应的程序支持。
好在要驱动它并不难,所做的无非是两件事,一是了解GPIO口的使用方法,将SDA和SCL引脚设置为输出口,然后定义好输出高低电平的语句,
以对OLED屏厂商的例程加以衔接;另一件事就是配置相应的延时函数,以控制OLED屏的时序要求。
此外,为了在OLED屏上实现汉字显示功能,可使用相应的字模提取软件来获得所需用到的字模,以构建专用的小字库。字模的提取过程参见图1所示。
图1 提取字模

在如下的主程序控制下,可见到图2和图3的显示效果。
int32_t main(void)
{
         SysClkIni();
         OLED_Init();
         Delay_ms(100);
         OLED_Clear();
         OLED_ShowString(0,0,"HC32F460",16);
         OLED_ShowString(0,2,"OLED TEST",16);
         OLED_ShowCHinese(72,0,0);
         OLED_ShowCHinese(88,0,1);
         OLED_ShowCHinese(104,0,2);
        
         Delay_m (5000);
         OLED_Clear();
         OLED_ShowCHinese(0,0,3);
         OLED_ShowCHinese(16,0,4);
         OLED_ShowCHinese(32,0,5);
         OLED_ShowCHinese(48,0,6);
         OLED_ShowCHinese(64,0,7);
         OLED_ShowCHinese(0,2,8);
         OLED_ShowCHinese(16,2,9);
         OLED_ShowCHinese(32,2,10);
         OLED_ShowCHinese(48,2,11);
         OLED_ShowCHinese(64,2,12);
        
         while(1);
}
图2 显示效果1

图3 显示效果2

其实在得到HC32F460开发板前,自己就购置了多种类型的OLED屏,如双色屏,彩色屏等,按接口类型又有I2C接口的及SPI接口的。
受引脚的制约,手头只有一款灰色的显示屏可与开发板匹配,其显示效果见图4所示。
图4 显示效果3

使用特权

评论回复
沙发
詹求实| | 2020-9-26 22:51 | 只看该作者
支持下,谢谢分享。外设资源确实都是很不错的。也希望有这么一块板子。

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2020-9-26 23:05 | 只看该作者
詹求实 发表于 2020-9-26 22:51
支持下,谢谢分享。外设资源确实都是很不错的。也希望有这么一块板子。

申请一下,看第5波能否有收获。

使用特权

评论回复
地板
zhiweijian| | 2021-10-6 16:49 | 只看该作者
没整亮呢 楼主 可以把点亮OLED程序可以发出来大家参考一下吗   3604595247@qq.com

使用特权

评论回复
5
kiwis66| | 2021-10-8 10:32 | 只看该作者
楼主
SysClkIni();
这个函数是否方便贴一下

使用特权

评论回复
6
jinglixixi|  楼主 | 2021-10-8 11:03 | 只看该作者
kiwis66 发表于 2021-10-8 10:32
楼主
SysClkIni();
这个函数是否方便贴一下

SysClkIni();应该是系统自己带的

使用特权

评论回复
7
jinglixixi|  楼主 | 2021-10-8 11:05 | 只看该作者
zhiweijian 发表于 2021-10-6 16:49
没整亮呢 楼主 可以把点亮OLED程序可以发出来大家参考一下吗

某宝买OLED屏时是由相关例程的,下载即可。

使用特权

评论回复
8
kyzhd| | 2021-10-8 14:08 | 只看该作者
其实华大的MCU还是可以的,支持国产芯片。

使用特权

评论回复
9
flytianya2010| | 2021-10-8 14:10 | 只看该作者
这板子看着不错。我喜欢那个屏。

使用特权

评论回复
10
kiwis66| | 2021-10-14 13:22 | 只看该作者
jinglixixi 发表于 2021-10-8 11:03
SysClkIni();应该是系统自己带的

我跑例程的时候,这个函数好像有点问题,
不加这个函数没事,
加上了,反而有时候会有重启

使用特权

评论回复
11
wubangmi| | 2021-10-14 16:43 | 只看该作者
kiwis66 发表于 2021-10-14 13:22
我跑例程的时候,这个函数好像有点问题,
不加这个函数没事,
加上了,反而有时候会有重启 ...

供你参考
static void App_SysClkIni(void)
{
    stc_clk_xtal_cfg_t   stcXtalCfg;
    stc_clk_mpll_cfg_t   stcMpllCfg;
    en_clk_sys_source_t  enSysClkSrc;
    stc_clk_sysclk_cfg_t stcSysClkCfg;
    stc_clk_freq_t       stcClkFreq;
    stc_sram_config_t    stcSramConfig;

    MEM_ZERO_STRUCT(enSysClkSrc);
    MEM_ZERO_STRUCT(stcSysClkCfg);
    MEM_ZERO_STRUCT(stcXtalCfg);
    MEM_ZERO_STRUCT(stcMpllCfg);
    MEM_ZERO_STRUCT(stcClkFreq);
    MEM_ZERO_STRUCT(stcSramConfig);
#if 0
    App_Xtal32_ClockConfig();                     ///<   External XTAL32 configure and enable
#else
    CLK_LrcCmd(Enable);                           ///<   internal XTAL32 Enable
#endif
    /* Set bus clk div. */
    stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;  /* Max 200MHz */
    stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  /* Max 100MHz */
    stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  /* Max 200MHz */
    stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;  /* Max 100MHz */
    stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;  /* Max 50MHz */
    stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;  /* Max 50MHz */
    stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;  /* Max 100MHz */
    CLK_SysClkConfig(&stcSysClkCfg);
#if  0
    /* Switch system clock source to MPLL. */
    /* Use Xtal as MPLL source. */
    stcXtalCfg.enMode = ClkXtalModeOsc;
    stcXtalCfg.enDrv = ClkXtalLowDrv;
    stcXtalCfg.enFastStartup = Enable;
    CLK_XtalConfig(&stcXtalCfg);
    CLK_XtalCmd(Enable);

    /* MPLL config. */
    stcMpllCfg.pllmDiv = 1ul;                  ///<  extern Xtal is 8MHZ
    stcMpllCfg.plln    = 36ul;                 ///<  MPLL=8*36=288Mhz,PLL max is 400Mhz
    stcMpllCfg.PllpDiv = 4ul;                  ///<  MPLLP=MPLL/4 = 288Mhz/4=72Mhz
    stcMpllCfg.PllqDiv = 4ul;                  ///<  MPLLQ=MPLL/4 = 288Mhz/4=72Mhz
    stcMpllCfg.PllrDiv = 4ul;                  ///<  MPLLR=MPLL/4 = 288Mhz/4=72Mhz
    CLK_SetPllSource(ClkPllSrcXTAL);
    CLK_MpllConfig(&stcMpllCfg);
#else
    /* Use HRC as MPLL source. Config HRC*/
    /* Modify hc32f46x_icg.h Enable ICG1_HRC_HARDWARE_START for HRC*/
    /* HRC default is 16Mhz              */
//    CLK_HrcTrim(0);                            ///<   HRC Trim default is zero
    CLK_HrcCmd(Enable);
   
    /* MPLL config. */
    stcMpllCfg.pllmDiv = 2ul;                  ///<  Input clk source DIV,(Internal HRC is 16Mhz),2-1=1,DIV2
    stcMpllCfg.plln    = 50ul;                 ///<  Input clk source multiplication,MPLL=8*50=400Mhz,PLL max is 400Mhz
    stcMpllCfg.PllpDiv = 2ul;                  ///<  MPLLP Div 2,MPLLP Freq=MPLL/2 = 400Mhz/2=200Mhz
    stcMpllCfg.PllqDiv = 2ul;                  ///<  MPLLQ Div 2,MPLLQ Freq=MPLL/2 = 400Mhz/2=200Mhz
    stcMpllCfg.PllrDiv = 2ul;                  ///<  MPLLR Div 2,MPLLR Freq=MPLL/2 = 400Mhz/2=200Mhz
    CLK_SetPllSource(ClkPllSrcHRC);
    CLK_MpllConfig(&stcMpllCfg);
#endif   
    /* sram init include read/write wait cycle setting */
    stcSramConfig.u8SramIdx = Sram12Idx | Sram3Idx | SramHsIdx | SramRetIdx;
    stcSramConfig.enSramRC  = SramCycle2;
    stcSramConfig.enSramWC  = SramCycle2;
    SRAM_Init(&stcSramConfig);
    /* flash read wait cycle setting */
    EFM_Unlock();
    EFM_SetLatency(EFM_LATENCY_5);
    EFM_Lock();

    /* Enable MPLL. */
    CLK_MpllCmd(Enable);
    /* Wait MPLL ready. */
    while (Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
    {
      ;
    }
    PWC_HS2HP();                                ///<  high run mode
    /* Switch system clock source to MPLL. */
    CLK_SetSysClkSource(CLKSysSrcMPLL);
    CLK_GetClockFreq(&stcClkFreq);              ///<  Get HCLK pclk Value
}

使用特权

评论回复
12
kiwis66| | 2021-10-16 10:50 | 只看该作者
wubangmi 发表于 2021-10-14 16:43
供你参考
static void App_SysClkIni(void)
{

使用特权

评论回复
13
1433977388| | 2022-11-24 16:24 | 只看该作者
华大的低功耗还是可以

使用特权

评论回复
14
大自在| | 2022-11-24 20:19 | 只看该作者
广告牌亮起来

使用特权

评论回复
15
gygp| | 2023-1-5 11:12 | 只看该作者
这个不是硬件IIC。              

使用特权

评论回复
16
alvpeg| | 2023-1-6 12:27 | 只看该作者
oled刷屏的时候会闪烁的。              

使用特权

评论回复
17
minzisc| | 2023-1-6 17:29 | 只看该作者
这个怎么确定汉字的大小?              

使用特权

评论回复
18
jinglixixi|  楼主 | 2023-1-7 00:34 | 只看该作者
minzisc 发表于 2023-1-6 17:29
这个怎么确定汉字的大小?

一般用16*16的点阵字模,太小看不清,太大又太占存储空间。当然有特殊要求除外。

使用特权

评论回复
19
ccook11| | 2023-1-9 10:17 | 只看该作者
汉字的字库取模的方式是什么              

使用特权

评论回复
20
jinglixixi|  楼主 | 2023-1-9 15:56 | 只看该作者
ccook11 发表于 2023-1-9 10:17
汉字的字库取模的方式是什么

使用该软件PCtoLCD2002

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝