程序员小哈
认证:普通会员
作者动态
手里没有USB转TTL模块,无法调试红外学习模块不要紧,利用最小系统板自己焊接一个
9小时前
基于鸿蒙OS移植OLED驱动程序
2天前
鸿蒙系统固件编译及烧写——通过AT命令完成WLAN模组Hi3861联网
3天前
涂鸦三明治开发套件开箱及固件下载
4天前
基于STM32使用TTP223点动触摸传感器模块
4天前

那位同学需要的:STM32驱动四针OLED,来了

大家好,我是程序员小哈,今天给大家分享一个网友问答,整个问题解决的过程,也是我一般拿到一个新模块寻找资料的过程。

一般寻找资料的途径就是三个途径:

  • 模块的商品描述
  • 官方芯片手册
  • 网上相关内容的博文

我们看一下今天的问题的解决,看看是不是很容易?

问题由来

我们之前分享了很多液晶屏模块的例程了,这个OLED模块也分享过7针的版本,7针的是基于SPI总线的,手里一直没有四针的,正好备货,顺便淘宝下单买一个:

最近有空,安排一下,也不知道这个网友问题到底解决没有,不过总会有其他需要的人,今天分享一下,拿到一个新的模块,我们应该怎么做?

官方资料获取

总不能无中生有吧,所以我们第一步还是去寻找一下这个模块的数据手册,一般淘宝店家的商品介绍页都会有对应模块的资料的,我们去找一下,即使这家店铺没提供,我们也可以去有这个产品的淘宝的其他店铺去找一下,一般情况下都会找到资料的。

在这个商品介绍页的末尾有这么一行小字提供了资料:

我们下载下来,去看看里面都有啥?

数据手册、例程、原理图这些都有了,基本够用了。

通过这个模块的商品详情页,我们还能得到如下有用信息:

OLED屏幕参数:

  • 点阵:128*64点阵(可以显示4行,每行8个汉字或者16个字符)
  • 驱动IC:SSD1306
  • 供电电压:3.3V或5V

接口定义

程序移植

店家已经提供了Demo,我们没有必要重复造轮子,我们只需要对这个程序进行移植即可。

选一个最接近咱们开发环境的例程,解压后如下图所示:

OLED初始化

IIC总线只需要2个GPIO,我们首先要修改这两个引脚的初始化代码,将两个GPIO修改为实际使用的引脚。

void OLED_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能PC端口时钟

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;     //PC6,7 OUT推挽输出
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7);       //PC6,7 OUT  输出高

 delay_ms(200);
 OLED_WR_Byte(0xAE,OLED_CMD); //--turn off oled panel
 OLED_WR_Byte(0x00,OLED_CMD); //---set low column address
 OLED_WR_Byte(0x10,OLED_CMD); //---set high column address
 OLED_WR_Byte(0x40,OLED_CMD); //--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
 OLED_WR_Byte(0x81,OLED_CMD); //--set contrast control register
 OLED_WR_Byte(0xCF,OLED_CMD);  // Set SEG Output Current Brightness
 OLED_WR_Byte(0xA1,OLED_CMD); //--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
 OLED_WR_Byte(0xC8,OLED_CMD); //Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
 OLED_WR_Byte(0xA6,OLED_CMD); //--set normal display
 OLED_WR_Byte(0xA8,OLED_CMD); //--set multiplex ratio(1 to 64)
 OLED_WR_Byte(0x3f,OLED_CMD); //--1/64 duty
 OLED_WR_Byte(0xD3,OLED_CMD); //-set display offset Shift Mapping RAM Counter (0x00~0x3F)
 OLED_WR_Byte(0x00,OLED_CMD); //-not offset
 OLED_WR_Byte(0xd5,OLED_CMD); //--set display clock divide ratio/oscillator frequency
 OLED_WR_Byte(0x80,OLED_CMD); //--set divide ratio, Set Clock as 100 Frames/Sec
 OLED_WR_Byte(0xD9,OLED_CMD); //--set pre-charge period
 OLED_WR_Byte(0xF1,OLED_CMD); //Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
 OLED_WR_Byte(0xDA,OLED_CMD); //--set com pins hardware configuration
 OLED_WR_Byte(0x12,OLED_CMD);
 OLED_WR_Byte(0xDB,OLED_CMD); //--set vcomh
 OLED_WR_Byte(0x40,OLED_CMD); //Set VCOM Deselect Level
 OLED_WR_Byte(0x20,OLED_CMD); //-Set Page Addressing Mode (0x00/0x01/0x02)
 OLED_WR_Byte(0x02,OLED_CMD); //
 OLED_WR_Byte(0x8D,OLED_CMD); //--set Charge Pump enable/disable
 OLED_WR_Byte(0x14,OLED_CMD); //--set(0x10) disable
 OLED_WR_Byte(0xA4,OLED_CMD); // Disable Entire Display On (0xa4/0xa5)
 OLED_WR_Byte(0xA6,OLED_CMD); // Disable Inverse Display On (0xa6/a7) 
 OLED_WR_Byte(0xAF,OLED_CMD); //--turn on oled panel
 
 OLED_WR_Byte(0xAF,OLED_CMD);  //display ON
 OLED_Clear();
 OLED_Set_Pos(0,0);
}  

修改GPIO高低电平操作的宏定义

除了初始化部分,一般为了方便设置GPIO的高低电平,一般还有对这两个引脚操作的宏定义需要修改,具体位置如下:

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_7)//CLK IIC接口的时钟信号
#define OLED_SCLK_Set() GPIO_SetBits(GPIOC,GPIO_Pin_7)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_6)//SDA IIC接口的数据信号
#define OLED_SDIN_Set() GPIO_SetBits(GPIOC,GPIO_Pin_6)

修改工程设置

因为原工程使用的主芯片为STM32F103ZET6,而我们核心板使用的芯片是STM32F103RET6,所以我们要对该工程进行修改,具体设置如下动图所示:

编译、下载、运行

移植后实际硬件连接如下:

我们对程序进行编译、下载、运行,看看运行后是否可以正常显示预设的内容。

运行之后的结果如下:

结果展示

这么顺利?直接就显示出内容了,这么简单,我的网文就要到此结束了吗?

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 2
关注 56
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧