工程创建
- 复制上次的工程文件,重新命名为OLED显示,打开江科大的最新OLED显示的例程,如图所示,打开IIC的工程,选择GB3212,复制到hardware文件夹下,打开工程,添加文件到工程;
程序修改
- 修改 OLED.h 和 OLED.c文件,添加引脚头文件,与初始化引脚;
/*引脚配置*********************/
/**
* 函 数:OLED写SCL高低电平
* 参 数:要写入SCL的电平值,范围:0/1
* 返 回 值:无
* 说 明:当上层函数需要写SCL时,此函数会被调用
* 用户需要根据参数传入的值,将SCL置为高电平或者低电平
* 当参数传入0时,置SCL为低电平,当参数传入1时,置SCL为高电平
*/
void OLED_W_SCL(uint8_t BitValue)
{
/*根据BitValue的值,将SCL置高电平或者低电平*/
GPIO_WriteBitValue(GPIOB, GPIO_PIN_8, BitValue);
/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*/
//...
}
/**
* 函 数:OLED写SDA高低电平
* 参 数:要写入SDA的电平值,范围:0/1
* 返 回 值:无
* 说 明:当上层函数需要写SDA时,此函数会被调用
* 用户需要根据参数传入的值,将SDA置为高电平或者低电平
* 当参数传入0时,置SDA为低电平,当参数传入1时,置SDA为高电平
*/
void OLED_W_SDA(uint8_t BitValue)
{
/*根据BitValue的值,将SDA置高电平或者低电平*/
GPIO_WriteBitValue(GPIOB, GPIO_PIN_9, BitValue);
/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*/
//...
}
/**
* 函 数:OLED引脚初始化
* 参 数:无
* 返 回 值:无
* 说 明:当上层函数需要初始化时,此函数会被调用
* 用户需要将SCL和SDA引脚初始化为开漏模式,并释放引脚
*/
void OLED_GPIO_Init(void)
{
uint32_t i, j;
/*在初始化前,加入适量延时,待OLED供电稳定*/
for (i = 0; i < 1000; i ++)
{
for (j = 0; j < 1000; j ++);
}
/*将SCL和SDA引脚初始化为开漏模式*/
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
GPIO_Config_T configStruct;
configStruct.pin = GPIO_PIN_8;
configStruct.mode = GPIO_MODE_OUT_OD;
configStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOB, &configStruct);
configStruct.pin = GPIO_PIN_9;
GPIO_Config(GPIOB, &configStruct);
/*释放SCL和SDA*/
OLED_W_SCL(1);
OLED_W_SDA(1);
}
- 此时程序移植完成,可在主函数添加显示函数,进行显示,查看屏幕
#include "apm32e10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
int main (void)
{
/*OLED初始化*/
OLED_Init();
/*在(0, 0)位置显示字符'A',字体大小为8*16点阵*/
OLED_ShowChar(0, 0, 'A', OLED_8X16);
/*在(16, 0)位置显示字符串"Hello World!",字体大小为8*16点阵*/
OLED_ShowString(16, 0, "Hello World!", OLED_8X16);
/*在(0, 18)位置显示字符'A',字体大小为6*8点阵*/
OLED_ShowChar(0, 18, 'A', OLED_6X8);
/*在(16, 18)位置显示字符串"Hello World!",字体大小为6*8点阵*/
OLED_ShowString(16, 18, "Hello World!", OLED_6X8);
/*在(0, 28)位置显示数字12345,长度为5,字体大小为6*8点阵*/
OLED_ShowNum(0, 28, 12345, 5, OLED_6X8);
/*在(40, 28)位置显示有符号数字-66,长度为2,字体大小为6*8点阵*/
OLED_ShowSignedNum(40, 28, -66, 2, OLED_6X8);
/*在(70, 28)位置显示十六进制数字0xA5A5,长度为4,字体大小为6*8点阵*/
OLED_ShowHexNum(70, 28, 0xA5A5, 4, OLED_6X8);
/*在(0, 38)位置显示二进制数字0xA5,长度为8,字体大小为6*8点阵*/
OLED_ShowBinNum(0, 38, 0xA5, 8, OLED_6X8);
/*在(60, 38)位置显示浮点数字123.45,整数部分长度为3,小数部分长度为2,字体大小为6*8点阵*/
OLED_ShowFloatNum(60, 38, 123.45, 3, 2, OLED_6X8);
/*在(0, 48)位置显示汉字串"你好,世界。",字体大小为固定的16*16点阵*/
OLED_ShowChinese(0, 48, "你好,世界。");
/*在(96, 48)位置显示图像,宽16像素,高16像素,图像数据为Diode数组*/
OLED_ShowImage(96, 48, 16, 16, Diode);
/*在(96, 18)位置打印格式化字符串,字体大小为6*8点阵,格式化字符串为"[%02d]"*/
OLED_Printf(96, 18, OLED_6X8, "[%02d]", 6);
/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/
OLED_Update();
/*延时3000ms,观察现象*/
Delay_ms(3000);
/*清空OLED显存数组*/
OLED_Clear();
/*在(5, 8)位置画点*/
OLED_DrawPoint(5, 8);
/*获取(5, 8)位置的点*/
if (OLED_GetPoint(5, 8))
{
/*如果指定点点亮,则在(10, 4)位置显示字符串"YES",字体大小为6*8点阵*/
OLED_ShowString(10, 4, "YES", OLED_6X8);
}
else
{
/*如果指定点未点亮,则在(10, 4)位置显示字符串"NO ",字体大小为6*8点阵*/
OLED_ShowString(10, 4, "NO ", OLED_6X8);
}
/*在(40, 0)和(127, 15)位置之间画直线*/
OLED_DrawLine(40, 0, 127, 15);
/*在(40, 15)和(127, 0)位置之间画直线*/
OLED_DrawLine(40, 15, 127, 0);
/*在(0, 20)位置画矩形,宽12像素,高15像素,未填充*/
OLED_DrawRectangle(0, 20, 12, 15, OLED_UNFILLED);
/*在(0, 40)位置画矩形,宽12像素,高15像素,填充*/
OLED_DrawRectangle(0, 40, 12, 15, OLED_FILLED);
/*在(20, 20)、(40, 25)和(30, 35)位置之间画三角形,未填充*/
OLED_DrawTriangle(20, 20, 40, 25, 30, 35, OLED_UNFILLED);
/*在(20, 40)、(40, 45)和(30, 55)位置之间画三角形,填充*/
OLED_DrawTriangle(20, 40, 40, 45, 30, 55, OLED_FILLED);
/*在(55, 27)位置画圆,半径8像素,未填充*/
OLED_DrawCircle(55, 27, 8, OLED_UNFILLED);
/*在(55, 47)位置画圆,半径8像素,填充*/
OLED_DrawCircle(55, 47, 8, OLED_FILLED);
/*在(82, 27)位置画椭圆,横向半轴12像素,纵向半轴8像素,未填充*/
OLED_DrawEllipse(82, 27, 12, 8, OLED_UNFILLED);
/*在(82, 47)位置画椭圆,横向半轴12像素,纵向半轴8像素,填充*/
OLED_DrawEllipse(82, 47, 12, 8, OLED_FILLED);
/*在(110, 18)位置画圆弧,半径15像素,起始角度25度,终止角度125度,未填充*/
OLED_DrawArc(110, 18, 15, 25, 125, OLED_UNFILLED);
/*在(110, 38)位置画圆弧,半径15像素,起始角度25度,终止角度125度,填充*/
OLED_DrawArc(110, 38, 15, 25, 125, OLED_FILLED);
/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/
OLED_Update();
/*延时3000ms,观察现象*/
Delay_ms(3000);
while (1)
{
for (uint8_t i = 0; i < 4; i ++)
{
/*将OLED显存数组部分数据取反,从(0, i * 16)位置开始,宽128像素,高16像素*/
OLED_ReverseArea(0, i * 16, 128, 16);
/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/
OLED_Update();
/*延时1000ms,观察现象*/
Delay_ms(1000);
/*把取反的内容翻转回来*/
OLED_ReverseArea(0, i * 16, 128, 16);
}
/*将OLED显存数组全部数据取反*/
OLED_Reverse();
/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/
OLED_Update();
/*延时1000ms,观察现象*/
Delay_ms(1000);
}
}