一.前提
1.使用IIC(I2C)通信
2.0.96寸OLED屏(SSD1306驱动)
可以参考STM32入门HAL库-硬件I2C与0.96寸OLED
关于0.96OLED(SSD1306)指令可以参考SSD1306(OLED驱动芯片)指令详解
OLED屏幕指令使用方法参考0.96寸_OLED_屏幕_SSD1306_IIC通信_入门教程_指令详解_驱动介绍
PCtolCD2022完美版----中国移动云盘链接:https://caiyun.139.com/m/i?095CtZC6JMpnN
提取码:Hgdx
二.创建项目
1.使用STM32CubeMX创建相关项目
1).选择相应芯片
我使用的是嘉立创天空星-青春版STM32VET6
2).配置调试方式及时钟配置--请你按照自已的设备设置
3).初始化相关 I2C GPIO口
4.修改项目属性 -- 生成
三.配置相关代码
1.关于HAL发送I2C数据
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)
/*
hi2c 对应I2C初始化对象
DevAddress 从设备地址
MemAddress 从设备要读写的地址
pData 发送的数据
Size 发送的字节大小‘
Timeout 超时时间
*/
2.发送命令代码---当前OLED默认从设备地址是0x78
0x78 从机设备地址
0x00 从机设备存储地址
void WriteCmd(uint8_t cmd)
{
HAL_I2C_Mem_Write(&hi2c2,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,1000);
}
3.发送数据代码
void WriteDat(uint8_t data)
{
HAL_I2C_Mem_Write(&hi2c2,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,1000);
}
4.打开关闭OLED屏幕指令
/**
*@brief 打开OLED
*@param
*@retval
*/
void OLED_ON(void) //打开OLED
{
WriteCmd(0X8D); //设置电荷泵
WriteCmd(0X14); //开启电荷泵
WriteCmd(0XAF); //OLED唤醒
}
/**
*@brief 关闭OLED
*@param
*@retval
*/
void OLED_OFF(void) //关闭OLED
{
WriteCmd(0X8D); //设置电荷泵
WriteCmd(0X10); //关闭电荷泵
WriteCmd(0XAE); //关闭OLED
}
5.设置屏幕起始点
void SetPos(unsigned char x,unsigned char y) //设置起点坐标
{
WriteCmd(0xb0+y);
WriteCmd((x&0xf0)>>4|0x10); //取高位
WriteCmd((x&0x0f)|0x01); //取低位
}
6.屏幕初始化 -- 此代码厂商提供
void OLED_Init(void) //OELD屏幕初始化
{
HAL_Delay(100);
WriteCmd(0xAE); //display off
WriteCmd(0x20); //Set Memory Addressing Mode
WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(0xc8); //Set COM Output Scan Direction
WriteCmd(0x00); //---set low column address
WriteCmd(0x10); //---set high column address
WriteCmd(0x40); //--set start line address
WriteCmd(0x81); //--set contrast control register
WriteCmd(0xff); //áá?èμ÷?ú 0x00~0xff
WriteCmd(0xa1); //--set segment re-map 0 to 127
WriteCmd(0xa6); //--set normal display
WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
WriteCmd(0x3F); //
WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(0xd3); //-set display offset
WriteCmd(0x00); //-not offset
WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
WriteCmd(0xf0); //--set divide ratio
WriteCmd(0xd9); //--set pre-charge period
WriteCmd(0x22); //
WriteCmd(0xda); //--set com pins hardware configuration
WriteCmd(0x12);
WriteCmd(0xdb); //--set vcomh
WriteCmd(0x20); //0x20,0.77xVcc
WriteCmd(0x8d); //--set DC-DC enable
WriteCmd(0x14); //
WriteCmd(0xaf); //--turn on oled panel
}
7.全屏填充函数
void OLED_Fill(unsigned char Fill_Data) //全屏填充
{
unsigned char m,n;
for(m=0;m<8;m++){
WriteCmd(0xb0+m);
WriteCmd(0x00);
WriteCmd(0x10);
for(n=0;n<128;n++){
WriteDat(Fill_Data);
}
}
}
8.显示字符串代码
void OLED_ShowStr(unsigned char x,unsigned char y,unsigned char ch[])
{
unsigned char c = 0,i = 0,j = 0;
while(ch[j] !='\0')
{
// 字符取模从’!‘开始
// '!'-33 是0
c= ch[j] -33;
if(x >120)
{
x = 0;
y+=2 ;
}
SetPos(x,y);
for(i = 0;i<8;i++)
WriteDat( letter[c*16+i] );
SetPos(x,y+1);
for(i = 0;i<8;i++)
WriteDat( letter[c*16+i+8] );
x+=8;
j++;
}
}
四.显示字符串
需要显示字符在OLED屏幕上就需要对字符进行取模
1.字符取模
根据ascii码排序的字符和符号
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
打开取模软件---修改取模设置---请你按照图片上进行取模
复制取模完成的到代码 -- 注意删除括号(可以在取模软件中取消自定义生成中的数据前后缀)
2.主函数使用
至此使用STM32CubeMX生成代码显示OLED到此结束---感谢你的阅读!