1. 简介
本次采用四线OLED与开发板实现通信,使用模拟IIC方式,在自己平时的应用中OLED屏幕还是用的比较多的,本文目标是实现OLED显示功能
2.新建工程
新建LED文件夹,在LED文件夹中在新建core、gd32f3xx_lib、hardw、obj、system、user文件夹。
1 从官方给的固件库函数里面复制启动文件,头文件代码等到core文件夹中,如下图所示:
2 复制Inc,src文件夹到gd32f3xx_lib中,里面主要是库函数的头文件和源文件,如下图所示:
3 hardware中主要是工程的硬件代码,里面放自己写好的LED,OLED线程代码。
4 obj中存放编译工程产生的中间文件。
5 user中存放工程文件,main函数等,如下图所示:
6 在keil工程里面添加C文件和路径
由于本次使用的开发板RAM比较小,编译工程是会出现栈溢出的情况。
3.编译报错解决方案
7 将启动文件中的栈空间改大
8 提高编译优化等级
3 将取模的数据前加上const使之存在FLASH中
4.硬件程序的编写
9 编写一个LED驱动程序,创建LED.C和LED.H文件,并添加至工程中。
10 OLED初始化函数的编写
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];}
else if(size1==16)
{temp=asc2_1608[chr1][i];}
else if(size1==24)
{temp=asc2_2412[chr1][i];}
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.运行结果
6.总结
整体开发板使用挺好的就是ram有点太小了,还有就是里面的delyay_1ms函数,对这种命名方式有点不习惯。强制的把这个函数改成delay_ms了。需要注意的是添加芯片包时要确保自己使用的keil版本不要太老。
原作者:兆易创新GD32 MCU 理想三旬