【IAR工程】STM8S208RB基于寄存器操作硬件I2C驱动ssd1306/sh1106 Oled
- ✨申明:本文章仅发表在
CSDN网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! - 🍁对于文中所提供的相关资源链接将作不定期更换。
- 📌在GitHub上有关stm8驱动ssd1306 oled的开源项目:
https://github.com/microgeek-eu/oled_ssd1306_stm8
不过该项目是在SDCC环境下编译的,包含I2C和spi接口可选择。
- 🔖本篇带来的是在IAR开发环境下,可移植到其他stm8系列当中其他型号上使用,本工程也是通过修改他人实现硬件驱动移植过来的,通stm8系列移植相对而已比较简单。
⛳移植说明
- 🌿更换头文件,在IAR安装目录下找到自己芯片型号的头文件进行替换。
//#include "global.h"
//#include"iostm8s103f3.h"
//#include"iostm8s903k3.h"
#include"iostm8s208rb.h"

- 🌿针对不同型号的单片机,硬件I2C引脚不一定都是一样。
像
STM8S208RB单片机,默认硬件I2C引脚是在PE1、PE2引脚上,如果项切换到PB4、PB5引脚上需要修改OPTION Byte选项字节,激活AFR6,来完成切换。

📚工程源码
链接: https://pan.baidu.com/s/1_kRrqyWHZLB3rCMSoH0x6Q
提取码: mnu2
ssd1306/sh1106 Oled兼容程序
-
🔖本程序来源于
21ic.com论坛,值测试了OLED显示,测试了同时挂载AT24C02模块,读取的内容显示出来有些是乱码,针对STM8系列之间进行移植还是很容易实现的。

-
🔰针对屏幕类型切换进行了注释说明,当然你也可以参考屏幕厂商的驱动代码进行比对参考修改。
-
🎉程序默认是驱动SH106的。
-
sh1106.c驱动代码
#include "SH1106.h"
//SSD1306(12864)的列显示从列地址0开始
// SH1106(13264)的列显示从列地址2开始
//光标定位
void OLED_Cursor(unsigned char x, unsigned char y)
{
unsigned char x2;
x2=x+2;
IIC_SendAddr(0x78,0);
IIC_WriteByte(0x00);
IIC_WriteByte(0xb0+y);
IIC_WriteByte(((x2&0xf0)>>4)|0x10);
IIC_WriteByte((x2&0x0f));//sh1106:|0x01;ssd1306: no
IIC_Stop();
}
//清屏
void OLED_Clear(void)
{
unsigned char i,n;
for(i=0;i<8;i++)
{
IIC_SendAddr(0x78,0); //高7位器件地址+1位R/W
IIC_WriteByte(0x00); //准备写指令
IIC_WriteByte(0xb0+i); //设置页地址(0~7)
IIC_WriteByte(0x00); //设置显示位置—列低地址;ssd1306:0x00 sh1106:0x02
IIC_WriteByte(0x10); //设置显示位置—列高地址
IIC_SendAddr(0x78,0);
IIC_WriteByte(0x40); //准备写数据
for(n=0;n<132;n++) IIC_WriteByte(0); //兼容128和132点阵
IIC_Stop();
}
}
//=====================================================================================
void OLED_ShowChar(unsigned char dat) //显示字符
{
unsigned char i=0;
unsigned int No;
No=dat-32; //字模数据是由空格开始,空格字符的ASCII的值就是32
No=No*5; //每个字符的字模是5个字节
IIC_SendAddr(0x78,0);
IIC_WriteByte(0x40);
while(i<5) //一个字符的字模是5个字节,就是5*8点阵
{
IIC_WriteByte(font0805[No]);
i++;
No++;
}
IIC_WriteByte(0); //每个字符之间空一列
IIC_Stop();
}
//=====================================================================================
void OLED_ShowString(unsigned char *s) //显示字符串,C编译器会在字符串后面加\0
{
while(*s) //检测字符串结束符
{
OLED_ShowChar(*s++);
}
}
//=======================================================================================
void OLED_ShowU16(unsigned int dat) //显示U16变量
{
unsigned int i;
for(i=10000; i>=1; i=i/10)
{
OLED_ShowChar(dat/i%10+0x30);
}
}
//初始化
void OLED_Init(void) //下列参数参考OLED厂家的设置
{
DelayMs(99);
IIC_SendAddr(0x78,0); //总线OLED地址
IIC_WriteByte(0x00); //准备写指令
IIC_WriteByte(0xae); //关显示
IIC_WriteByte(0xd5); //晶振频率
IIC_WriteByte(0x80);
IIC_WriteByte(0xa8); //duty 设置
IIC_WriteByte(0x3f); //duty=1/64
IIC_WriteByte(0xd3); //显示偏移
IIC_WriteByte(0x00);
IIC_WriteByte(0x40); //起始行
IIC_WriteByte(0x8d); //升压允许
IIC_WriteByte(0x14);
IIC_WriteByte(0x20); //page address mode
IIC_WriteByte(0x02);
IIC_WriteByte(0xc8); //行扫描顺序:从上到下
IIC_WriteByte(0xa1); //列扫描顺序:从左到右
IIC_WriteByte(0xda); //sequential configuration
IIC_WriteByte(0x12);
IIC_WriteByte(0x81); //微调对比度,本指令的 0x81 不要改动,改下面的值
IIC_WriteByte(0x01); //微调对比度的值,可设置范围 0x00~0xff
IIC_WriteByte(0xd9); //Set Pre-Charge Period
IIC_WriteByte(0xf1);
IIC_WriteByte(0xdb); //Set VCOMH Deselect Level
IIC_WriteByte(0x40);
IIC_WriteByte(0xaf); //开显示
IIC_Stop();
}
📓程序源码
- ✨申明:本文章仅发表在
CSDN网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! - 🍁对于文中所提供的相关资源链接将作不定期更换。
链接: https://pan.baidu.com/s/1TqYFB1ubKTTl8ceObN-iGw
提取码: 4iuu
文章提供了STM8S208RB单片机在IAR开发环境下,基于寄存器操作的硬件I2C驱动SSD1306和SH1106OLED显示屏的工程源码。内容包括移植说明,如更换头文件和调整硬件I2C引脚,并给出了显示字符、字符串和16进制数值的函数示例。源码来源于21ic.com论坛,已测试OLED显示和AT24C02模块,但存在一些乱码问题。
531

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



