【IAR工程】STM8S208RB基于寄存器操作硬件I2C驱动ssd1306/sh1106 Oled

文章提供了STM8S208RB单片机在IAR开发环境下,基于寄存器操作的硬件I2C驱动SSD1306和SH1106OLED显示屏的工程源码。内容包括移植说明,如更换头文件和调整硬件I2C引脚,并给出了显示字符、字符串和16进制数值的函数示例。源码来源于21ic.com论坛,已测试OLED显示和AT24C02模块,但存在一些乱码问题。
摘要由CSDN通过智能技术生成

【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值