cebemax hal库 stm32 OLED移植

序言:

这是一篇对于作者对于将OLED的驱动代码移植成hal库的文章,会有完整的过程,后面自然也会有完整的代码,希望能够帮到大家,同时也是做一个记录,方便自己查看。

注:萌新写文,大佬轻喷。

1.写命令与数据函数的完成

原标准库代码

void I2C_Configuration(void)
{I2C_InitTypeDef I2C_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x30;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 400000;I2C_Cmd(I2C1, ENABLE);I2C_Init(I2C1, &I2C_InitStructure);
}
void I2C_WriteByte(uint8_t addr,uint8_t data)
{while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));I2C_GenerateSTART(I2C1, ENABLE);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, addr);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_SendData(I2C1, data);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1, ENABLE);
}
void WriteCmd(unsigned char I2C_Command)
{I2C_WriteByte(0x00, I2C_Command);
}
void WriteDat(unsigned char I2C_Data)
{I2C_WriteByte(0x40, I2C_Data);
}

函数说明

I2C_Configuration 其实就是 I2C 的初始化函数,hal库里有现成的,所以删除。
I2C_WriteByte 在下面的两个函数有用到,但hal库里有现成的,所以删除。
WriteCmd 和 WriteDat 改写成 HAL 库的方式DelayMs 改为 HAL 库中的函数: HAL_I2C_Mem_Write……

所以就变成了

函数移植

void WriteCmd(unsigned char I2C_Command)
{HAL_I2C_Mem_Write(&hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT,&I2C_Command,1,100);
}
void WriteDat(unsigned char I2C_Data)
{HAL_I2C_Mem_Write(&hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT,&I2C_Data,1,100);
}

大家一定很疑惑,为啥一下子就变成这样了勒?
别急,接下来就来好好讲讲。
首先,我们先来看看HAL_I2C_Mem_Write函数的原型。
机翻,不一定会很准确,但能看懂。

移植代码的说明

说过了,是机翻,作者英语不好。

/**
* @brief以阻塞模式向特定内存地址写入大量数据
* @param hi2c指针指向一个I2C_HandleTypeDef结构,包含
*指定I2C的配置信息。
目标设备地址:设备7位地址值
*在数据表中必须在调用接口前向左移动
* @param MemAddress内存地址
* @param MemAddSize内存地址的大小
@param pData指向数据缓冲区的指针
* @param大小要发送的数据量
* @param超时超时持续时间
@retval HAL状态*/

我们再对照着完整的函数看。

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

两相对照,我们就能够看明白每一个参数大概是干啥的。

参数一:I2C_HandleTypeDef *hi2c
指向包含指定I2C的配置信息的I2C_HandleTypeDef结构的指针,大概就是填写你所使用的i2c通道,如&hi2c1,&hi2c2。

参数二:uint16_t DevAddress
这里填目标设备地址,7位地址值。

参数三:uint16_t MemAddress
内存地址,也是目标设备的。

参数四:uint16_t MemAddSize
内存地址的大小,目标设备。

参数五:uint8_t *pData
指向数据缓冲区的指针,要写的东西。

参数六:uint16_t Size
要发送的数据量。

参数七:uint32_t Timeout
超时持续时间,大概就是,传输了多久还没传输完,就算他超时。

这样一来,我们再来看一下我之前写的那两个函数。

void WriteCmd(unsigned char I2C_Command)
{HAL_I2C_Mem_Write(&hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT,&I2C_Command,1,100);
}
void WriteDat(unsigned char I2C_Data)
{HAL_I2C_Mem_Write(&hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT,&I2C_Data,1,100);
}

大概能看明白了吧。
其中,0X78就是OLED的地址,这是默认地址,还有一种是0X7A的,具体怎么搞,我也没仔细研究,暂时用不上。
I2C_MEMADD_SIZE_8BIT是一个宏定义

#define I2C_MEMADD_SIZE_8BIT            0x00000001U

代码的优化

作者想了想之后,这个函数还可以再优化一下。
两个函数合成一个,方便使用。

void OLED_Write(unsigned char dat,unsigned char cmd)
{if(cmd)HAL_I2C_Mem_Write(&hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT,&dat,1,100);elseHAL_I2C_Mem_Write(&hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT,&dat,1,100);
}

显而易见,dat填要写的数据,cmd选择是写数据还是写命令。
那么,到此,最为基本的写命令与数据的函数就完成了。
接下来,开始写初始化。

2.OLED初始化函数

原标准库函数

void OLED_Init(void)
{IIC_Init();DelayMs(500);                               //初始化之前的延时很重要!OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示OLED_WR_Byte(0x00,OLED_CMD);//设置低列地址OLED_WR_Byte(0x10,OLED_CMD);//设置高列地址OLED_WR_Byte(0x40,OLED_CMD);//设置起始行地址,集映射RAM显示起始行(0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);//设置对比度控制寄存器OLED_WR_Byte(0xCF,OLED_CMD);//设置SEG输出电流亮度OLED_WR_Byte(0xA1,OLED_CMD);//段重定义设置,bit0:0,0->0;1,0->127; 0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);//设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);//设置正常显示(设置显示方式;bit0:1,反相显示;0,正常显示   )OLED_WR_Byte(0xA8,OLED_CMD);//设置驱动路数 设置多路复用比(1比64)OLED_WR_Byte(0x3F,OLED_CMD);//1/64 duty(默认0X3F(1/64))OLED_WR_Byte(0xD3,OLED_CMD);//设置显示偏移位移映射RAM计数器(0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);//-not offsetOLED_WR_Byte(0xD5,OLED_CMD);//设置显示时钟分频比/振荡器频率OLED_WR_Byte(0x80,OLED_CMD);//设置分频比,设置时钟为100帧/秒OLED_WR_Byte(0xD9,OLED_CMD);//设置预充电周期OLED_WR_Byte(0xF1,OLED_CMD);//设置预充15个时钟,放电1个时钟([3:0],PHASE 1;[7:4],PHASE 2;)OLED_WR_Byte(0xDA,OLED_CMD);//设置COM硬件引脚配置OLED_WR_Byte(0x12,OLED_CMD);//[5:4]配置OLED_WR_Byte(0xDB,OLED_CMD);//设置VCOMH 电压倍率OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM 释放电压([6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;)OLED_WR_Byte(0x20,OLED_CMD);//设置页面寻址模式(0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;OLED_WR_Byte(0x8D,OLED_CMD);//设置充电泵启用/禁用OLED_WR_Byte(0x14,OLED_CMD);//设置(0x10禁用,0x14启用)OLED_WR_Byte(0xA4,OLED_CMD);// 全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏) (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);// 设置显示方式;bit0:1,反相显示;0,正常显示 (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//开启显示 OLED_Clear();OLED_SetCursorAddrese(0,0);
}

这个不用解释吧,无非是定好的一连串命令。
一个个写太麻烦,搞一个数组。

移植后函数

const uint8_t OLED_Init_cmd[28]={0xAE, //关闭显示0x00,//设置低列地址0x10,//设置高列地址0x40,//设置起始行地址,集映射RAM显示起始行(0x00~0x3F)0x81,//设置对比度控制寄存器0xCF,//设置SEG输出电流亮度0xA1,//段重定义设置,bit0:0,0->0;1,0->127; 0xa0左右反置 0xa1正常0xC8,//设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数   0xc0上下反置 0xc8正常0xA6,//设置正常显示(设置显示方式;bit0:1,反相显示;0,正常显示  )0xA8,//设置驱动路数 设置多路复用比(1比64)0x3F,//1/64 duty(默认0X3F(1/64))0xD3,//设置显示偏移位移映射RAM计数器(0x00~0x3F)0x00,//-not offset0xD5,//设置显示时钟分频比/振荡器频率0x80,//设置分频比,设置时钟为100帧/秒0xD9,//设置预充电周期0xF1,//设置预充15个时钟,放电1个时钟([3:0],PHASE 1;[7:4],PHASE 2;)0xDA,//设置COM硬件引脚配置0x12,//[5:4]配置0xDB,//设置VCOMH 电压倍率0x40,//Set VCOM 释放电压([6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;)0x20,//设置页面寻址模式(0x00/0x01/0x02)0x02,//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;0x8D,//设置充电泵启用/禁用0x14,//设置(0x10禁用,0x14启用)0xA4,// 全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏) (0xa4/0xa5)0xA6,// 设置显示方式;bit0:1,反相显示;0,正常显示 (0xa6/a7) 0xAF //开启显示
};

然后再加一个初始化的for循环

void OLED_Init(void)
{uint8_t i;//IIC_Init(); //cubemax自动生成了,我们不需要。HAL_Delay(500);                                //初始化之前的延时很重要!for(i = 0;i < 29;i ++){OLED_Write(OLED_Init_cmd[i],1);}OLED_Clear();OLED_SetCursorAddrese(0,0);
}

原初始化函数里还有三个函数的调用,其中一个我们不需要,另外两个我们先放着,一个是用来清屏的,还有一个是用来设置光标位置的,后面马上就可以看到。
那么,至此,初始化便完成了,我们继续改其他的函数。
上原函数。

3.OLED其他功能函数移植

开显示,关显示,还有显示一个点的原函数

/*函数功能:开启OLED显示 */
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令(设置电荷泵)OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON (开启电荷泵)OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON(OLED唤醒)
}
/*函数功能:关闭OLED显示*/ void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令 (设置电荷泵)OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF (关闭电荷泵)OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF (OLED休眠)
}/*
函数功能:清屏函数,清完屏,整个屏幕是黑色的!
说明: 清屏就是向OLED里写0对于OLED屏,0就不显示,1才会在屏幕上显示出来一个点
*/
void OLED_Clear(void)
{  u8 i,n;  for(i=0;i<8;i++){OLED_WR_Byte(0xB0+i,OLED_CMD);//设置页地址(0~7)OLED_WR_Byte(0x00,OLED_CMD);  //设置显示位置―列低地址OLED_WR_Byte(0x10,OLED_CMD);  //设置显示位置―列高地址 for(n=0;n<128;n++){OLED_WR_Byte(0x00,OLED_DATA);}}
}

开显示的修改

/*函数功能:开启OLED显示 */
void OLED_Display_On(void)
{OLED_Write(0X8D,1);//SET DCDC命令(设置电荷泵)OLED_Write(0X14,1);//DCDC ON (开启电荷泵)OLED_Write(0XAF,1);//DISPLAY ON(OLED唤醒)
}

关显示的修改

/*函数功能:关闭OLED显示*/
void OLED_Display_Off(void)
{OLED_Write(0X8D,1);//SET DCDC命令 (设置电荷泵)OLED_Write(0X10,1); //DCDC OFF (关闭电荷泵)OLED_Write(0XAE,1);//DISPLAY OFF (OLED休眠)
}

清屏函数的修改

/*
函数功能:清屏函数,清完屏,整个屏幕是黑色的!
说明: 清屏就是向OLED里写0对于OLED屏,0就不显示,1才会在屏幕上显示出来一个点
*/
void OLED_Clear(void)
{  u8 i,n;  for(i=0;i<8;i++){OLED_Write(0xB0+i,1);//设置页地址(0~7)OLED_Write(0x00,1);//设置显示位置―列低地址OLED_Write(0x10,1);//设置显示位置―列高地址 for(n=0;n<128;n++){OLED_Write(0x00,0);}}
}

直接复制的小伙伴,是不是有些出现了问题,哈哈。
是一些有关于宏定义的问题。
在c文件里加上这一段就行:

typedef   signed          char int8_t;    //  标准表达方式 signed char 被等同于 int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;   //在32位环境里,int代表4个字节32位!!/* exact-width unsigned integer types */
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;typedef int32_t  s32;
typedef int16_t s16;
typedef int8_t  s8;typedef uint32_t  u32; //32位
typedef uint16_t u16;  //16位
typedef uint8_t  u8;   //8位

接下来便是

写点,设光标以及垂直滚动的原函数

/*
函数功能:在显存数组上画一个点
函数参数:x,y为点的横纵坐标   c为这个点的亮灭(1亮0灭)
参数范围:x 0~128  y 0~8
每一个数据是 低位在前,高位在后
*/
void OLED_Draw_Point(u8 x,u8 y,u8 c)
{u8 page,addr;page = y/8; //显存的页地址addr = y%8; //显存的一个字节数据中c所在的位置 if(c) OLED_GRAM[page][x] |= 1<<addr;else  OLED_GRAM[page][x] &= ~(1<<addr);
}
/*
函数功能: 设置光标位置
函数参数: x列的起始位置(0~127)y页的起始位置(0~7)
比如: 0x8  高4位0000   低4位1000
*/
void OLED_SetCursorAddrese(u8 x,u8 y)
{OLED_WR_Byte(0xB0+y,OLED_CMD);                    //设置页地址//第6列显示数据  6被分成2个4位(高位和低位)。OLED_WR_Byte((x&0xF0)>>4|0x10,OLED_CMD);//设置列高起始地址(半字节)OLED_WR_Byte((x&0x0F)|0x00,OLED_CMD);   //设置列低起始地址(半字节)
}
/*****************************************************
** 函数名称:OLED_VerticalDisplay
** 函数功能:实现OLED垂直滚动范围配置
** 参    数:1.toprow:设置滚动起始行
**           2.scrollrow:设置滚动行数
**           注意:toprow+scrollrow<64
** 函数返回:无
******************************************************/
void OLED_VerticalDisplay(u8 toprow,u8 scrollrow)
{OLED_WR_Byte(SET_VERTICAL_SCROLL_AREA,OLED_CMD);OLED_WR_Byte(toprow,OLED_CMD);OLED_WR_Byte(scrollrow,OLED_CMD);
}

写点函数的修改

这些函数的名字啥的我都懒得改了,无所谓的。

/*
函数功能:在显存数组上画一个点
函数参数:x,y为点的横纵坐标   c为这个点的亮灭(1亮0灭)
参数范围:x 0~128  y 0~8
每一个数据是 低位在前,高位在后
*/
void OLED_Draw_Point(u8 x,u8 y,u8 c)
{u8 page,addr;page = y/8; //显存的页地址addr = y%8; //显存的一个字节数据中c所在的位置 if(c) OLED_GRAM[page][x] |= 1<<addr;else  OLED_GRAM[page][x] &= ~(1<<addr);
}

这个好像不用改,不过涉及到一个数组,之前没有定义,定义一下。

u8 OLED_GRAM[8][128];/*定义OLED显存数组*/

函数内容很简单,就是要让哪位显示出来,就给哪位赋值一个1,不显示就给那位非一下,赋值0.

设光标函数的修改

/*
函数功能: 设置光标位置
函数参数: x列的起始位置(0~127)y页的起始位置(0~7)
比如: 0x8  高4位0000   低4位1000
*/
void OLED_SetCursorAddrese(u8 x,u8 y)
{       OLED_Write(0xB0+y,1);  //设置页地址//第6列显示数据  6被分成2个4位(高位和低位)。OLED_Write((x&0xF0)>>4|0x10,1);//设置列高起始地址(半字节)OLED_Write((x&0x0F)|0x00,1);  //设置列低起始地址(半字节)
}

滚动函数修改

/*****************************************************
** 函数名称:OLED_VerticalDisplay
** 函数功能:实现OLED垂直滚动范围配置
** 参    数:1.toprow:设置滚动起始行
**           2.scrollrow:设置滚动行数
**           注意:toprow+scrollrow<64
** 函数返回:无
******************************************************/
void OLED_VerticalDisplay(u8 toprow,u8 scrollrow)
{OLED_Write(0xA3,1);//设置垂直滚动范围命令OLED_Write(toprow,1);//设置滚动起始行OLED_Write(scrollrow,1);//设置滚动行数
}

关闭滚动, 按页清屏,更新显示原函数

/*****************************************************
** 函数名称:OledScrollStop
** 函数功能:关闭滚屏功能
******************************************************/
void OledScrollStop(void)
{OLED_WR_Byte(DEACTIVATE_SCROLL,OLED_CMD);
}/*
函数功能: 按页清屏 (0~7)
*/
void OLED_PageClear(u8 page)
{u8 j;OLED_WR_Byte(0xB0+page,OLED_CMD); //设置页地址OLED_WR_Byte(0x10,OLED_CMD);      //设置列高起始地址(半字节)OLED_WR_Byte(0x00,OLED_CMD);      //设置列低起始地址(半字节)for(j=0;j<128;j++){OLED_WR_Byte(0,OLED_DATA); //写数据}
}/*
函数功能:更新显存到OLED屏幕上
*/
void OLED_Refresh_Screen(void)
{u8 page,list;  //定义页地址和列地址for(page=0;page<8;page++){OLED_WR_Byte(0xB0+page,OLED_CMD); //设置页地址(0~7)OLED_WR_Byte(0x00,OLED_CMD);      //设置显示位置―列低地址OLED_WR_Byte(0x10,OLED_CMD);      //设置显示位置―列高地址 for(list=0;list<128;list++){OLED_WR_Byte(OLED_GRAM[page][list],OLED_DATA);}}memset(OLED_GRAM,0,sizeof(OLED_GRAM)); /*清空显存数组*/
}

关闭滚动函数修改

/*****************************************************
** 函数名称:OledScrollStop
** 函数功能:关闭滚屏功能
******************************************************/
void OledScrollStop(void)
{OLED_Write(0x2E,1);//关闭滚动显示功能
}

按页清屏函数修改

/*
函数功能: 按页清屏 (0~7)
*/
void OLED_PageClear(u8 page)
{u8 j;OLED_Write(0xB0+page,1); //设置页地址 OLED_Write(0x10,1);   //设置列高起始地址(半字节)OLED_Write(0x00,1);   //设置列低起始地址(半字节)for(j=0;j<128;j++){OLED_Write(0,0); //写数据}
}

更新显示函数修改

/*
函数功能:更新显存到OLED屏幕上
*/
void OLED_Refresh_Screen(void)
{u8 page,list;  //定义页地址和列地址for(page=0;page<8;page++){OLED_Write(0xB0+page,1); //设置页地址(0~7)OLED_Write(0x00,1);      //设置显示位置―列低地址OLED_Write(0x10,1);      //设置显示位置―列高地址 for(list=0;list<128;list++){OLED_Write(OLED_GRAM[page][list],0);}}memset(OLED_GRAM,0,sizeof(OLED_GRAM));  /*清空显存数组*/
}

memset(OLED_GRAM,0,sizeof(OLED_GRAM)); /清空显存数组/这个函数是#include "string.h"这里面的一个函数,整句话的意思是,向OLED_GRAM数组里面写满0.

4.字符显示函数

基础的函数都移植完了,那么接下来就是显示的函数了,原函数这里就不放了。
原程序里他把中英文搞一块儿我觉得编程序的时候不太友好,给阉割了, 我给单独领出来了,这里只能显示些英文符号。
也不是说他那样干不好,不过一般我们用起来其实最多几个汉字,自己取一下模就行。
或者有兴趣的也可以按照他那样搞一个中文字库,哈哈,有搞好的千万@我一下。
我还是把他的原版程序给你们看看吧。

原程序

void OLED_DisplayString(u8 x,u8 y,u8 width,u8 height,u8 *str)
{u8 addr=0,i;u16 font=0;while(*str!='\0') //连续显示{//取模从空格开始的,计算下标//写8*16ASCII字符的上半部分if(*str >= ' '&& *str <= '~') //显示英文{addr=*str-' '; //取模从空格开始的,计算下标//写8*16ASCII字符的上半部分OLED_SetCursorAddrese(x,y); //设置光标的位置for(i=0;i<width/2;i++)      //横向写width列{OLED_WR_Byte(ASCII_8_16[addr][i],OLED_DATA); }//写8*16ASCII字符的下半部分OLED_SetCursorAddrese(x,y+1); //设置光标的位置for(i=0;i<width/2;i++)        //横向写width列{OLED_WR_Byte(ASCII_8_16[addr][i+width/2],OLED_DATA); }str++;//继续显示下一个字符x+=width/2; //在下一个位置继续显示数据           }else //显示中文{OLED_SetCursorAddrese(x,y); //设置光标的位置font=((*str)<<8)+(*(str+1));switch(font){case 0xCEC2:addr=0;break;//温case 0xCAAA:addr=1;break;//湿case 0xB6C8:addr=2;break;//度case 0xCAFD:addr=3;break;//数case 0xBEDD:addr=4;break;//据case 0xB3C9:addr=5;break;//成case 0xB9A6:addr=6;break;//功case 0xB7A2:addr=7;break;//发case 0xCBCD:addr=8;break;//送case 0xC1AC:addr=9;break;//连case 0xBDD3:addr=10;break;//接case 0xB7FE:addr=11;break;//服case 0xCEF1:addr=12;break;//务case 0xC6F7:addr=13;break;//器case 0xC9CF:addr=14;break;//上case 0xCFC2:addr=15;break;//下case 0xCFDE:addr=16;break;//限case 0xD6B5:addr=17;break;//值case 0xC9E8:addr=18;break;//设case 0xD6C3:addr=19;break;//置case 0xB4AB:addr=20;break;//传case 0xD6DC:addr=21;break;//周case 0xC6DA:addr=22;break;//期case 0xBFD8:addr=23;break;//控case 0xD6C6:addr=24;break;//制case 0xB2CE:addr=25;break;//参case 0xD7DC:addr=26;break;//总case 0xB1ED:addr=27;break;//表case 0xB1B8:addr=28;break;//备case 0xCDF8:addr=29;break;//网case 0xC2E7:addr=30;break;//络case 0xD0C5:addr=31;break;//信case 0xCFA2:addr=32;break;//息case 0xCAA7:addr=33;break;//失case 0xB0DC:addr=34;break;//败case 0xB1A3:addr=35;break;//保case 0xB4E6:addr=36;break;//存case 0xB9FD:addr=37;break;//过case 0xB8DF:addr=38;break;//高case 0xA1E6:addr=39;break;//℃case 0xD0C7:addr=40;break;//星case 0xC8D5:addr=42;break;//日case 0xD2BB:addr=43;break;//一case 0xB6FE:addr=44;break;//二case 0xC8FD:addr=45;break;//三case 0xCBC4:addr=46;break;//四case 0xCEE5:addr=47;break;//五case 0xC1F9:addr=48;break;//六case 0xC4EA:addr=49;break;//年case 0xD4C2:addr=50;break;//月default : break;}for(i=0;i<width;i++) //横向写width列{OLED_WR_Byte(ChineseFont_16_16[addr][i],OLED_DATA); }//写8*16ASCII字符的下半部分OLED_SetCursorAddrese(x,y+1); //设置光标的位置for(i=0;i<width;i++)          //横向写width列{OLED_WR_Byte(ChineseFont_16_16[addr][i+width],OLED_DATA); }str+=2;//继续显示下一个字符x+=width; //在下一个位置继续显示数据}}
}

英文字符显示函数修改

void OLED_DisplayString(u8 x,u8 y,u8 *str)
{u8 addr=0,i;u16 font=0;while(*str!='\0') //连续显示{//取模从空格开始的,计算下标//写8*16ASCII字符的上半部分addr=*str-' '; //取模从空格开始的,计算下标//写8*16ASCII字符的上半部分OLED_SetCursorAddrese(x,y); //设置光标的位置for(i=0;i<8;i++)      //横向写width列{OLED_Write(ASCII_8_16[addr][i],0); }//写8*16ASCII字符的下半部分OLED_SetCursorAddrese(x,y+1); //设置光标的位置for(i=0;i<8;i++)        //横向写width列{OLED_Write(ASCII_8_16[addr][i+8],0); }str++;//继续显示下一个字符x+=8; //在下一个位置继续显示数据            }
}

ASCII_8_16数组

const u8 ASCII_8_16[][16]=
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x10,0x0C,0x02,0x10,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x40,0xC0,0x78,0x40,0xC0,0x78,0x00,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x00},/*"#",3*/
{0x00,0x70,0x88,0x88,0xFC,0x08,0x30,0x00,0x00,0x18,0x20,0x20,0xFF,0x21,0x1E,0x00},/*"$",4*/
{0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00},/*"%",5*/
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x2C,0x19,0x27,0x21,0x10},/*"&",6*/
{0x00,0x12,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",8*/
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",9*/
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x70,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x00,0xC0,0x38,0x04,0x00,0x00,0x60,0x18,0x07,0x00,0x00,0x00,0x00},/*"/",15*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",16*/
{0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",17*/
{0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",18*/
{0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",19*/
{0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24},/*"4",20*/
{0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00},/*"5",21*/
{0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00},/*"6",22*/
{0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00},/*"7",23*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",24*/
{0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00},/*"9",25*/
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00},/*"<",28*/
{0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00},/*"=",29*/
{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00},/*">",30*/
{0x00,0x70,0x48,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x30,0x37,0x00,0x00,0x00},/*"?",31*/
{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x28,0x2F,0x28,0x17,0x00},/*"@",32*/
{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",33*/
{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},/*"B",34*/
{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",35*/
{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},/*"D",36*/
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},/*"E",37*/
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},/*"F",38*/
{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00},/*"G",39*/
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},/*"H",40*/
{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"I",41*/
{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00},/*"J",42*/
{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00},/*"K",43*/
{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00},/*"L",44*/
{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x01,0x3E,0x01,0x3F,0x20,0x00},/*"M",45*/
{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00},/*"N",46*/
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00},/*"O",47*/
{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00},/*"P",48*/
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x28,0x28,0x30,0x50,0x4F,0x00},/*"Q",49*/
{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20},/*"R",50*/
{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00},/*"S",51*/
{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"T",52*/
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"U",53*/
{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},/*"V",54*/
{0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00},/*"W",55*/
{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20},/*"X",56*/
{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"Y",57*/
{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00},/*"Z",58*/
{0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00},/*"[",59*/
{0x00,0x04,0x38,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00},/*"\",60*/
{0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/
{0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00},/*"a",65*/
{0x10,0xF0,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"b",66*/
{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},/*"c",67*/
{0x00,0x00,0x80,0x80,0x80,0x90,0xF0,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},/*"d",68*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00},/*"e",69*/
{0x00,0x80,0x80,0xE0,0x90,0x90,0x20,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"f",70*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00},/*"g",71*/
{0x10,0xF0,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"h",72*/
{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},/*"j",74*/
{0x10,0xF0,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x06,0x29,0x30,0x20,0x00},/*"k",75*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"l",76*/
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F},/*"m",77*/
{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"n",78*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"o",79*/
{0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0x91,0x20,0x20,0x11,0x0E,0x00},/*"p",80*/
{0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0x91,0xFF,0x80},/*"q",81*/
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},/*"r",82*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",83*/
{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00},/*"t",84*/
{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},/*"u",85*/
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x03,0x0C,0x30,0x0C,0x03,0x00,0x00},/*"v",86*/
{0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80,0x01,0x0E,0x30,0x0C,0x07,0x38,0x06,0x01},/*"w",87*/
{0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x20,0x31,0x0E,0x2E,0x31,0x20,0x00},/*"x",88*/
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x81,0x86,0x78,0x18,0x06,0x01,0x00},/*"y",89*/
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x00,0xFC,0x02,0x02,0x00,0x00,0x00,0x00,0x01,0x3E,0x40,0x40},/*"{",91*/
{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},/*"|",92*/
{0x02,0x02,0xFC,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x3E,0x01,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x80,0x40,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00},/*"~",94*/
};

接下来就是:

中文显示函数修改

void OLED_DisplayChinese(u8 x,u8 y,u8 str)
{u8 addr=0,i;addr = str; //你要显示第几个汉字OLED_SetCursorAddrese(x,y); //设置光标的位置for(i=0;i<16;i++)      //横向写width列{OLED_Write(ChineseFont_16_16[addr][i],0); }OLED_SetCursorAddrese(x,y+1); //设置光标的位置for(i=0;i<16;i++)        //横向写width列{OLED_Write(ChineseFont_16_16[addr][i+16],0); }
}

ChineseFont_16_16数组

const u8 ChineseFont_16_16[][32]=
{
{0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",0*/
{0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00},/*"湿",1*/
{0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",2*/
{0x90,0x52,0x34,0x10,0xFF,0x10,0x34,0x52,0x80,0x70,0x8F,0x08,0x08,0xF8,0x08,0x00,0x82,0x9A,0x56,0x63,0x22,0x52,0x8E,0x00,0x80,0x40,0x33,0x0C,0x33,0x40,0x80,0x00},/*"数",3*/
{0x10,0x10,0xFF,0x10,0x90,0x00,0xFE,0x92,0x92,0x92,0xF2,0x92,0x92,0x9E,0x80,0x00,0x42,0x82,0x7F,0x01,0x80,0x60,0x1F,0x00,0xFC,0x44,0x47,0x44,0x44,0xFC,0x00,0x00},/*"据",4*/
{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x08,0x00,0x80,0x60,0x1F,0x00,0x10,0x20,0x1F,0x80,0x40,0x21,0x16,0x18,0x26,0x41,0xF8,0x00},/*"成",5*/
{0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,0x10,0x30,0x10,0x1F,0x08,0x88,0x48,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00},/*"功",6*/
{0x00,0x00,0x18,0x16,0x10,0xD0,0xB8,0x97,0x90,0x90,0x90,0x92,0x94,0x10,0x00,0x00,0x00,0x20,0x10,0x8C,0x83,0x80,0x41,0x46,0x28,0x10,0x28,0x44,0x43,0x80,0x80,0x00},/*"发",7*/
{0x40,0x40,0x42,0xCC,0x00,0x88,0x89,0x8E,0x88,0xF8,0x88,0x8C,0x8B,0x88,0x80,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x48,0x46,0x41,0x42,0x44,0x58,0x40,0x40,0x00},/*"送",8*/
{0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00},/*"连",9*/
{0x10,0x10,0x10,0xFF,0x10,0x50,0x44,0x54,0x65,0xC6,0x44,0x64,0x54,0x44,0x40,0x00,0x04,0x44,0x82,0x7F,0x01,0x82,0x82,0x4A,0x56,0x23,0x22,0x52,0x4E,0x82,0x02,0x00},/*"接",10*/
{0x00,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0xFE,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00,0x80,0x60,0x1F,0x02,0x42,0x82,0x7F,0x00,0xFF,0x40,0x2F,0x10,0x2C,0x43,0x80,0x00},/*"服",11*/
{0x00,0x00,0x90,0x88,0x4C,0x57,0xA4,0x24,0x54,0x54,0x8C,0x84,0x00,0x00,0x00,0x00,0x01,0x01,0x80,0x42,0x22,0x1A,0x07,0x02,0x42,0x82,0x42,0x3E,0x01,0x01,0x01,0x00},/*"务",12*/
{0x80,0x80,0x9E,0x92,0x92,0x92,0x9E,0xE0,0x80,0x9E,0xB2,0xD2,0x92,0x9E,0x80,0x00,0x08,0x08,0xF4,0x94,0x92,0x92,0xF1,0x00,0x01,0xF2,0x92,0x94,0x94,0xF8,0x08,0x00},/*"器",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00},/*"上",14*/
{0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x42,0x82,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00},/*"下",15*/
{0x00,0xFE,0x22,0x5A,0x86,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,0xFF,0x04,0x08,0x07,0x00,0xFF,0x40,0x20,0x03,0x0C,0x14,0x22,0x41,0x40,0x00},/*"限",16*/
{0x00,0x80,0x60,0xF8,0x07,0x04,0xE4,0xA4,0xA4,0xBF,0xA4,0xA4,0xE4,0x04,0x00,0x00,0x01,0x00,0x00,0xFF,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00},/*"值",17*/
{0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00},/*"设",18*/
{0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00},/*"置",19*/
{0x00,0x80,0x60,0xF8,0x07,0x40,0x48,0x48,0xE8,0x5F,0x48,0x48,0x48,0x40,0x40,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0x02,0x0B,0x12,0x22,0xD2,0x0A,0x06,0x00,0x00,0x00},/*"传",20*/
{0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00,0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00},/*"周",21*/
{0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00},/*"期",22*/
{0x10,0x10,0x10,0xFF,0x90,0x20,0x98,0x48,0x28,0x09,0x0E,0x28,0x48,0xA8,0x18,0x00,0x02,0x42,0x81,0x7F,0x00,0x40,0x40,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x40,0x00},/*"控",23*/
{0x40,0x50,0x4E,0x48,0x48,0xFF,0x48,0x48,0x48,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0x02,0x02,0xFF,0x12,0x22,0x1E,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00},/*"制",24*/
{0x00,0x20,0x20,0xA8,0x6C,0x2A,0x39,0x28,0xA8,0x2A,0x6C,0xA8,0x20,0x20,0x00,0x00,0x02,0x82,0x81,0x90,0x92,0x4A,0x49,0x45,0x24,0x22,0x10,0x08,0x01,0x02,0x02,0x00},/*"参",25*/
{0x00,0x00,0x00,0xF1,0x12,0x14,0x10,0x10,0x10,0x14,0x12,0xF1,0x00,0x00,0x00,0x00,0x40,0x30,0x00,0x03,0x39,0x41,0x41,0x45,0x59,0x41,0x41,0x73,0x00,0x08,0x30,0x00},/*"总",26*/
{0x00,0x04,0x24,0x24,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x24,0x24,0x04,0x00,0x00,0x21,0x21,0x11,0x09,0xFD,0x83,0x41,0x23,0x05,0x09,0x11,0x29,0x25,0x41,0x41,0x00},/*"表",27*/
{0x80,0x90,0x90,0x48,0x4C,0x57,0x24,0x24,0x24,0x54,0x4C,0x44,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00},/*"备",28*/
{0x00,0xFE,0x02,0x22,0x42,0x82,0x72,0x02,0x22,0x42,0x82,0x72,0x02,0xFE,0x00,0x00,0x00,0xFF,0x10,0x08,0x06,0x01,0x0E,0x10,0x08,0x06,0x01,0x4E,0x80,0x7F,0x00,0x00},/*"网",29*/
{0x20,0x30,0xAC,0x63,0x30,0x20,0x10,0x18,0xA7,0x44,0xA4,0x14,0x0C,0x00,0x00,0x00,0x22,0x67,0x22,0x12,0x12,0x04,0x02,0xFD,0x44,0x44,0x44,0x45,0xFD,0x02,0x02,0x00},/*"络",30*/
{0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00},/*"信",31*/
{0x00,0x00,0x00,0xFC,0x54,0x54,0x56,0x55,0x54,0x54,0x54,0xFC,0x00,0x00,0x00,0x00,0x40,0x30,0x00,0x03,0x39,0x41,0x41,0x45,0x59,0x41,0x41,0x73,0x00,0x08,0x30,0x00},/*"息",32*/
{0x00,0x40,0x30,0x1E,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x81,0x81,0x41,0x21,0x11,0x0D,0x03,0x01,0x03,0x0D,0x11,0x21,0x41,0x81,0x81,0x00},/*"失",33*/
{0x00,0xFE,0x02,0xFA,0x02,0xFE,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00},/*"败",34*/
{0x00,0x80,0x60,0xF8,0x07,0x00,0x3E,0x22,0x22,0xE2,0x22,0x22,0x3E,0x00,0x00,0x00,0x01,0x00,0x00,0xFF,0x20,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x11,0x20,0x00},/*"保",35*/
{0x04,0x04,0x84,0xE4,0x1C,0x07,0x24,0x24,0x24,0x24,0xA4,0x64,0x24,0x04,0x04,0x00,0x02,0x01,0x00,0xFF,0x00,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x00},/*"存",36*/
{0x40,0x40,0x42,0xCC,0x00,0x08,0x48,0x88,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x40,0x41,0x40,0x48,0x50,0x4F,0x40,0x40,0x40,0x00},/*"过",37*/
{0x04,0x04,0x04,0x04,0xF4,0x94,0x95,0x96,0x94,0x94,0xF4,0x04,0x04,0x04,0x04,0x00,0x00,0xFE,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x82,0xFE,0x00,0x00},/*"高",38*/
{0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00},/*"℃",39*/
{0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00},/*"星",40*/
{0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00},/*"期",41*/
{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00},/*"日",42*/
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",43*/
{0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00},/*"二",44*/
{0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"三",45*/
{0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00},/*"四",46*/
{0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00},/*"五",47*/
{0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00},/*"六",48*/
{0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"年",49*/
{0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00},/*"月",50*/
{0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00},/*"间",51*/
};

至于图片显示的函数。
由于没有现成的图片数组素材,也懒得去搞字模了,(本文章里的这些字模都是隔壁偷的,嘿嘿,)所以没有尝试,哈哈,反正原理差不多,大家可以自己动手改一改,如果前面都看明白了的话……
最后的效果大概是这样:

while循环里的代码:

while (1){/* USER CODE END WHILE */OLED_DisplayString(20,0,"Are you ok?");OLED_DisplayChinese(0,4,0);//温OLED_DisplayChinese(16,4,1);//湿OLED_DisplayChinese(32,4,2);//度/* USER CODE BEGIN 3 */}

注意啊,OLED的初始化我写在while循环外面了。

最后

再给你们看一下作者cubemax里面的引脚配置吧~
作者用的是C8T6,但是这个OLED的移植显然是可以在所有支持cubemax的32芯片上用的,不然还移植个屁啊,对吧。

需要用到的代码都在这里啦,仔细看完肯定就能过搞出来的。
当然,如果不想去理解那么多,也可以直接拿来就用,付个费就行,哈哈。
作者文章堆里还有一篇一模一样的,付费的文章,里面有完整工程哦~

cebemax hal库 stm32 OLED移植 解析相关推荐

  1. HAL库硬件IIC_MPU6050_DMP移植

    HAL库硬件IIC_MPU6050_DMP移植 一.CUBEMX基本配置 ​ 本篇博客只介绍如何在HAL库进行移植代码,所以只开启了一些必要的端口:I2C1,USART1,另外介绍一下本文基于芯片ST ...

  2. DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动

    系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...

  3. 基于正点原子F103精英板和CubeIDE的Hal库LCD驱动移植(从零开始)

    最近在学习王维波老师的<STM32Cube高效开发教程>,王老师移植的是普中科技的驱动,而我手动移植了一下正点原子的lcd驱动,看了网上的诸多教程,有的博客存在一些bug,于是乎手动整理了 ...

  4. 正点原子STM32F4探索者开发板HAL库触摸屏例程移植到STM32CubeMX+CLion

    前言 本次移植我们将在移植好的TFT LCD屏幕例程的基础上进行修改 正文 我们打开STM32CubeMX文件,并配置好一个1us的定时器,我这里使用的是定时器6 我这里的系统时钟频率是168M,定时 ...

  5. 3.HAL库-STM32的OLED开发基础

    关于OLED的概述 OLED:Organic Light-Emitting Display,有机发光显示. OLED具备自发光.厚度薄.视角广.功耗低.对比度高.响应速度快.可用于挠曲性面板.使用温度 ...

  6. 基于HAL库STM32串口驱动不定长数据接收

    STM32串口驱动不定长数据接收带环形缓冲区 最新框架代码 使用方法 源码 串口接口文件 环形缓冲区接口文件 移植图示 使用涉及4个文件, UART_Port.c UART_Port.h Circul ...

  7. 11.小白初学日记 STM32F429 HAL库 STM32程序启动过程

    大家好,怀着激动地小心,激动地小手,我们来了. 今天我想给大家分享一个我自己的错误点.来警示大家. 刚才写我按键例程程序的时候,我自己来写的,发现启动不了,终于找到了原因,大家一起来看下. while ...

  8. Openmv入门01——HAL库stm32

    Openmv入门01 开启一个项目 Openmv程序 1.识别长度 2.识别面积 STM32 1.识别长度 2.识别面积 开启一个项目 看看例程~很快上手https://docs.singtown.c ...

  9. 基于STM32移植U8g2图形库——OLED显示(HAL库)

    前言:本文主要内容为将优秀的图形库U8g2移植到STM32单片机上,用于OLED显示精美UI.其实,目前GitHub上有需要优秀的开源GUI库,但是大部分的GUI解决方案并不适合0.96 OLED(1 ...

最新文章

  1. java线程池笔记及相关代码
  2. OpenCV学习:仿射变换+投射变换+单应性矩阵
  3. 张志华:机器学习的发展历程及启示
  4. 查看各类型数据库版本的SQL(Oracle/DB2/SQL Server/PG/MySQL)
  5. Facebook发布神经蛋分离法,可从嘈杂环境中提取音视频
  6. 基本文件管理,针对Centos7的XFS文件系统备份恢复(需要更改)
  7. php网站整合ck播放器,CKplayer 整合播放M3U8视频
  8. 1.4多媒体计算机系统教案,1.4 多媒体计算机系统教案3
  9. poi导出excel报错Failed to read zip entry source
  10. PDF不小心删掉了怎么恢复?4个方法隔壁家老王已经恢复了
  11. 运算放大器的简单介绍和运用
  12. CCS中如何使用profile
  13. 国产 android 平板,三大旗舰新品 国产Android系统平板对比
  14. 全国青少年编程等级考试python一级真题2020年12月(含题库答题软件账号)
  15. 完美生成年度节假日表,Kettle还能这么玩!
  16. 孙玄谈:微服务架构何去何从?
  17. python培训浦东
  18. workbench应力应变曲线_workbench ansys 每个时刻的应力应变变形云图 如何查看?
  19. 如何学好计算机应用基础这门课,如何学好《计算机应用基础》课.docx
  20. 亚洲卫视 技术讲义

热门文章

  1. PHP实现站内信设计思路与方案
  2. Virtual Hosts
  3. python 相关性检验_Python中的相关分析correlation analysis的实现
  4. 安徽师大附中%你赛day7 T2 乘积 解题报告
  5. 帕累托法则/20:80法则/犹太法则
  6. 杰迷福利!1句python命令下载Jay Chou全部专辑MV
  7. 褚时健 | 我这辈子最问心无愧的就是:没有庸庸碌碌地过完一生
  8. XYNUOJ-2139 德莱联盟
  9. 人工智能,机器学习,深度学习(笔记)
  10. 蓝桥杯练习题 Fibonacci数列