理想三旬 · 2022年04月09日

【GD32F310开发板试用】四线OLED显示

1. 简介

本次采用四线OLED与开发板实现通信,使用模拟IIC方式,在自己平时的应用中OLED屏幕还是用的比较多的,本文目标是实现OLED显示功能

2.新建工程

新建LED文件夹,在LED文件夹中在新建core、gd32f3xx_lib、hardw、obj、system、user文件夹。

  1. 从官方给的固件库函数里面复制启动文件,头文件代码等到core文件夹中,如下图所示:
    图片.png
  2. 复制Inc,src文件夹到gd32f3xx_lib中,里面主要是库函数的头文件和源文件,如下图所示:
    图片.png
  3. hardware中主要是工程的硬件代码,里面放自己写好的LED,OLED线程代码。
    图片.png
  4. obj中存放编译工程产生的中间文件。
  5. user中存放工程文件,main函数等,如下图所示:
    图片.png
  6. 在keil工程里面添加C文件和路径
    图片.png
    图片.png
    由于本次使用的开发板RAM比较小,编译工程是会出现栈溢出的情况。

    3.编译报错解决方案

  7. 将启动文件中的栈空间改大
    图片.png
  8. 提高编译优化等级
    图片.png
    3.将取模的数据前加上const使之存在FLASH中
    图片.png

    4.硬件程序的编写

  9. 编写一个LED驱动程序,创建LED.C和LED.H文件,并添加至工程中。
    图片.png
    图片.png
  10. OLED初始化函数的编写
    图片.png
    图片.png
    3,实现字符显示

    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1)
    {
     u8 i,m,temp,size2,chr1;
     u8 y0=y;
     size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节数
     chr1=chr-' ';  //计算偏移后的值
     for(i=0;i<size2;i++)
     {
         if(size1==12)
         {temp=asc2_1206[chr1][i];} //调用1206字体
         else if(size1==16)
         {temp=asc2_1608[chr1][i];} //调用1608字体
         else if(size1==24)
         {temp=asc2_2412[chr1][i];} //调用2412字体
         else return;
                 for(m=0;m<8;m++)           //写入数据
                 {
                     if(temp&0x80)OLED_DrawPoint(x,y);
                     else OLED_ClearPoint(x,y);
                     temp<<=1;
                     y++;
                     if((y-y0)==size1)
                     {
                         y=y0;
                         x++;
                         break;
           }
                 }
      }
    }
    字符串显示
    void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1)
    {
     while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
     {
         OLED_ShowChar(x,y,*chr,size1);
         x+=size1/2;
         if(x>128-size1)  //换行
         {
             x=0;
             y+=2;
     }
         chr++;
      }
    }

    4.主函数程序编写

    #include "gd32f3x0.h"
    #include "systick.h"
    #include <stdio.h>
    #include "main.h"
    #include "led.h"
    #include "oled.h"
    
    int main(void)
    {
     systick_config();
     OLED_Init();
     led_init();
     OLED_Clear();
     OLED_ShowString(0,18,"Hello world!",16);
     OLED_Refresh();
      while(1)
      {
    
    
     GPIO_BOP(GPIOA) = GPIO_PIN_8;
     delay_ms(500);
     GPIO_BC(GPIOA) = GPIO_PIN_8;
     delay_ms(500);
     }
     
    }

    5.运行结果

    图片.png

    6.总结

    整体开发板使用挺好的就是ram有点太小了,还有就是里面的delyay_1ms函数,对这种命名方式有点不习惯。强制的把这个函数改成delay_ms了。需要注意的是添加芯片包时要确保自己使用的keil版本不要太老。

源程序:
链接:https://pan.baidu.com/s/1JT7wrBHc_JM-LS9mef6ZZw?pwd=ilrn
提取码:ilrn

推荐阅读
关注数
10708
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息