这个和博文《【STM32学习】(24)STM32完成模拟IIC实现OLED显示》有不一样的地方,这里是通过STM32 内置IIC配置实现OLED显示,这个效果要比模拟的IIC好。流程简单不繁琐,
写命令和写数据可以通过以下函数完成,简单快捷。
/**************************************************/
/* IIC Write byte Command */
/**************************************************/
void Write_IIC_Byte_Command(uint8_t IIC_Byte)
{
HAL_I2C_Mem_Write( &hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT, &IIC_Byte, 1,100); // 0X78 OLED的I2C地址(禁止修改) //0x00 OLED 命令(禁止修改)
}
/**************************************************/
/* IIC Write byte Data */
/**************************************************/
void Write_IIC_Byte_Data(uint8_t IIC_Byte)
{
HAL_I2C_Mem_Write( &hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT, &IIC_Byte, 1,100); // 0X78 OLED的I2C地址(禁止修改) //0x40 OLED 数据(禁止修改)
}
OLED相关驱动代码,如下:
#ifndef __OLED_H_
#define __OLED_H_
#include "stm32l0xx_hal.h"
#include "ZIKU.H"
#include "main.h"
/**************************************************/
/* 宏定义 */
/**************************************************/
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define OLED_MODE 0
#define OLED_SDA 0
#define OLED_CLK 1
//OLED模式设置
//0:4线串行模式
//1:并行8080模式
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
/**************************************************/
/* IIC Write byte Command */
/**************************************************/
void Write_IIC_Byte_Command(uint8_t IIC_Byte)
{
HAL_I2C_Mem_Write( &hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT, &IIC_Byte, 1,100); // 0X78 OLED的I2C地址(禁止修改) //0x00 OLED 命令(禁止修改)
}
/**************************************************/
/* IIC Write byte Data */
/**************************************************/
void Write_IIC_Byte_Data(uint8_t IIC_Byte)
{
HAL_I2C_Mem_Write( &hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT, &IIC_Byte, 1,100); // 0X78 OLED的I2C地址(禁止修改) //0x40 OLED 数据(禁止修改)
}
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
if(cmd)
{
Write_IIC_Byte_Data(dat);
}
else
{
Write_IIC_Byte_Command(dat);
}
}
/**************************************************/
/* 坐标设置 */
/**************************************************/
void OLED_Set_Pos(uint8_t x, uint8_t y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f),OLED_CMD);
}
/**************************************************/
/* 开启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显示 */
/**************************************************/
//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清屏 */
/**************************************************/
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
uint8_t 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(0,OLED_DATA);
} //更新显示
}
/**************************************************/
/* OLED开显示 */
/**************************************************/
//void OLED_On(void)
//{
// ur 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(1,OLED_DATA);
// } //更新显示
//}
/**************************************************/
/* OLED写一个字符 */
/* 在指定位置显示一个字符,包括部分字符 */
/* x:0~127 */
/* y:0~63 */
/* mode:0,反白显示;1,正常显示 */
/* size:选择字体 16/12 */
/**************************************************/
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
{
uint8_t c=0,i=0;
c=chr-' '; //得到偏移后的值
if(x>Max_Column-1)
{
x=0;y=y+2;
}
if(Char_Size ==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else
{
OLED_Set_Pos(x,y);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
/**************************************************/
/* 函数名:m^n函数 */
/**************************************************/
uint16_t oled_pow(uint8_t m,uint8_t n)
{
uint16_t result=1;
while(n--)
{
result*=m;
}
return result;
}
/**************************************************/
/* 显示2个数字 */
/* x,y :起点坐标 */
/* len :数字的位数 */
/* size:字体大小 */
/* mode:模式 0,填充模式;1,叠加模式 */
/* num:数值(0~4294967295); */
/**************************************************/
void OLED_ShowNum(uint8_t x,uint8_t y,uint16_t num,uint8_t wei,uint8_t size2)
{
uint8_t t,temp;
uint8_t enshow=0;
for(t=0;t120)
{
x=0;y+=2;
}
j++;
}
}
/**************************************************/
/* 函数名:显示汉字 */
/**************************************************/
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
{
uint8_t t,adder=0;
OLED_Set_Pos(x,y); //显示坐标位置
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1); //坐标
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
/***********显示图片*****************/
void OLED_DrawBMP(uint8_t x0, uint8_t y0,uint8_t x1, uint8_t y1,uint8_t BMP[])
{
unsigned int j=0;
uint8_t x,y;
if(y1%8==0) y=y1/8;
else y=y1/8+1;
for(y=y0;y
main函数实现:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
OLED_Init(); //OLED初始化
OLED_DrawBMP(0, 0,128, 8, BMP); //显示图片
HAL_Delay(2000); //显示延时
OLED_Clear(); //清除
OLED_ShowCHinese(16*1,0,0); //世界技能大赛
OLED_ShowCHinese(16*2,0,1);
OLED_ShowCHinese(16*3,0,2);
OLED_ShowCHinese(16*4,0,3);
OLED_ShowCHinese(16*5,0,4);
OLED_ShowCHinese(16*6,0,5);
OLED_ShowNum(0,2,1234,4,16); //纯数值显示
OLED_ShowString(3,4,"wantin",16); //送显示
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
效果如下:
完整代码可以查看链接:Tast16_IIC_OLED_Config.rar https://download.csdn.net/download/XiaoCaiDaYong/12443607
积分不够,可以留言,QQ发送,O(∩_∩)O