首先需要三个文件
code.h存放字库
剩下俩就是驱动相关。
这里使用stm32 hal库提供的iic函数作为接口
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)
做好的接口如下:
//Cmd_Data:表示数据的类型,数据或者命令
//data: 数据本身
/*注:以下写在.h之中
#define IIC_Cmd 0x00
#define IIC_Data 0x40
这俩是作为函数第一个的参数被调用的
*/
void IIC_write(uint8_t Cmd_Data,uint8_t data){
HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, Cmd_Data, I2C_MEMADD_SIZE_8BIT, &data, 1, 0xff);
}
接下来就是把驱动中的函数换成自己的IIC_write就行。
OLED初始化函数
void OLED_Init(void){
HAL_Delay(500);
IIC_write(IIC_Cmd,0xAE); //display off
IIC_write(IIC_Cmd,0x20); //Set Memory Addressing Mode
IIC_write(IIC_Cmd,0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
IIC_write(IIC_Cmd,0xb0); //Set Page Start Address for Page Addressing Mode,0-7
IIC_write(IIC_Cmd,0xc8); //Set COM Output Scan Direction
IIC_write(IIC_Cmd,0x00); //---set low column address
IIC_write(IIC_Cmd,0x10); //---set high column address
IIC_write(IIC_Cmd,0x40); //--set start line address
IIC_write(IIC_Cmd,0x81); //--set contrast control register
IIC_write(IIC_Cmd,0xff); //亮度调节 0x00~0xff
IIC_write(IIC_Cmd,0xa1); //--set segment re-map 0 to 127
IIC_write(IIC_Cmd,0xa6); //--set normal display
IIC_write(IIC_Cmd,0xa8); //--set multiplex ratio(1 to 64)
IIC_write(IIC_Cmd,0x3F); //
IIC_write(IIC_Cmd,0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
IIC_write(IIC_Cmd,0xd3); //-set display offset
IIC_write(IIC_Cmd,0x00); //-not offset
IIC_write(IIC_Cmd,0xd5); //--set display clock divide ratio/oscillator frequency
IIC_write(IIC_Cmd,0xf0); //--set divide ratio
IIC_write(IIC_Cmd,0xd9); //--set pre-charge period
IIC_write(IIC_Cmd,0x22); //
IIC_write(IIC_Cmd,0xda); //--set com pins hardware configuration
IIC_write(IIC_Cmd,0x12);
IIC_write(IIC_Cmd,0xdb); //--set vcomh
IIC_write(IIC_Cmd,0x20); //0x20,0.77xVcc
IIC_write(IIC_Cmd,0x8d); //--set DC-DC enable
IIC_write(IIC_Cmd,0x14); //
IIC_write(IIC_Cmd,0xaf); //--turn on oled panel
}
然后是各种功能函数把里面的写数据写命令换成自己的即可,不在赘述。
/**
* @brief OLED_SetPos,设置光标
* @param x,光标x位置
* y,光标y位置
* @retval 无
*/
void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
{
IIC_write(IIC_Cmd,0xb0+y);
IIC_write(IIC_Cmd,((x&0xf0)>>4)|0x10);
IIC_write(IIC_Cmd,(x&0x0f)|0x01);
}
/**
* @brief OLED_Fill,填充整个屏幕
* @param fill_Data:要填充的数据
* @retval 无
*/
void OLED_Fill(unsigned char fill_Data)//全屏填充
{
unsigned char m,n;
for(m=0;m<8;m++)
{
IIC_write(IIC_Cmd,0xb0+m); //page0-page1
IIC_write(IIC_Cmd,0x00); //low column start address
IIC_write(IIC_Cmd,0x10); //high column start address
for(n=0;n<128;n++)
{
IIC_write(IIC_Data,fill_Data);
}
}
}
void OLED_CLS(void)//清屏
{
OLED_Fill(0x00);
}
/**
* @brief OLED_ON,将OLED从休眠中唤醒
* @param 无
* @retval 无
*/
void OLED_ON(void)
{
IIC_write(IIC_Cmd,0X8D); //设置电荷泵
IIC_write(IIC_Cmd,0X14); //开启电荷泵
IIC_write(IIC_Cmd,0XAF); //OLED唤醒
}
/**
* @brief OLED_OFF,让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
* @param 无
* @retval 无
*/
void OLED_OFF(void)
{
IIC_write(IIC_Cmd,0X8D); //设置电荷泵
IIC_write(IIC_Cmd,0X10); //关闭电荷泵
IIC_write(IIC_Cmd,0XAE); //OLED休眠
}
/**
* @brief OLED_ShowStr,显示codetab.h中的ASCII字符,有6*8和8*16可选择
* @param x,y : 起始点坐标(x:0~127, y:0~7);
* ch[] :- 要显示的字符串;
* TextSize : 字符大小(1:6*8 ; 2:8*16)
* @retval 无
*/
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
unsigned char c = 0,i = 0,j = 0;
switch(TextSize)
{
case 1:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 126)
{
x = 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<6;i++)
IIC_write(IIC_Data,F6x8[c][i]);
x += 6;
j++;
}
}break;
case 2:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 120)
{
x = 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<8;i++)
IIC_write(IIC_Data,F8X16[c*16+i]);
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
IIC_write(IIC_Data,F8X16[c*16+i+8]);
x += 8;
j++;
}
}break;
}
}
/**
* @brief OLED_ShowCN,显示codetab.h中的汉字,16*16点阵
* @param x,y: 起始点坐标(x:0~127, y:0~7);
* N:汉字在codetab.h中的索引
* @retval 无
*/
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
unsigned char wm=0;
unsigned int adder=32*N;
OLED_SetPos(x , y);
for(wm = 0;wm < 16;wm++)
{
IIC_write(IIC_Data,F16x16[adder]);
adder += 1;
}
OLED_SetPos(x,y + 1);
for(wm = 0;wm < 16;wm++)
{
IIC_write(IIC_Data,F16x16[adder]);
adder += 1;
}
}
/**
* @brief OLED_DrawBMP,显示BMP位图
* @param x0,y0 :起始点坐标(x0:0~127, y0:0~7);
* x1,y1 : 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
* @retval 无
*/
void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y1%8==0)
y = y1/8;
else
y = y1/8 + 1;
for(y=y0;y<y1;y++)
{
OLED_SetPos(x0,y);
for(x=x0;x<x1;x++)
{
IIC_write(IIC_Data,BMP[j++]);
}
}
}
最后是制作相关的字库,这里给出本例程中使用的(字库的头文件在.c中包含)
#ifndef __CODE_H
#define __CODE_H
//字库文件
/***************************16*16的点阵字体取模方式:共阴——列行式——逆向输出*********/
unsigned char F16x16[] =
{
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,//年0
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,//月1
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,//日2
0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,//时3
0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,//分4
0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x03,0x00,0x00,//秒5
0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,//开6
0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,
0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,//启7
0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,//关8
0x00,0xF8,0x01,0x22,0x20,0x22,0x22,0xA2,0xFA,0x22,0x22,0x22,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x08,0x04,0x02,0x11,0x20,0x1F,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,//闭9
0x08,0x04,0x23,0x22,0x26,0x2A,0x22,0xFA,0x24,0x23,0x22,0x26,0x2A,0x02,0x02,0x00,
0x01,0x09,0x09,0x09,0x19,0x69,0x09,0x09,0x49,0x89,0x7D,0x09,0x09,0x09,0x01,0x00,//等10
0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,//待11
0x40,0x44,0xC4,0x4

文章提供了基于STM32HAL库的IIC通信接口函数以及OLED显示屏的初始化和控制函数,包括显示字符、填充屏幕、开关等操作。此外,还展示了不同点阵尺寸的字符字库。
最低0.47元/天 解锁文章
1162

被折叠的 条评论
为什么被折叠?



