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