你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G030F6P6基于HAL库模拟IIC驱动1.54寸OLED屏幕

[复制链接]
STMCU小助手 发布时间:2022-11-27 22:00
STM32G030F6P6基于模拟IIC驱动1.54寸OLED屏幕
+ ]2 \3 B2 h8 q( d; \
1 注意事项
2 如何利用STM32G030F6P6驱动OLED显示屏
    2.1*基本配置*
    2.2 *1.54寸OLED端口含义*
    2.3 *1.54寸OLED液晶屏引脚与STM32G030F6P6引脚的硬件连接*
    2.4 *1.54寸OLED液晶屏驱动程序*
3 测试

; G1 \6 c+ Y' o. z( b
  • 注意事项
    4 H  ], w* h, D3 X

    5 F% {" j5 R( ?+ c7 `
      本文使用的自制电路板芯片是“STM32G030F6P6”以及ST-LINK v2下载工具,采用内部高速晶振。不同的SMT32芯片,基本配置都是一样,只需要做稍微的更改即可,后面会提到需要更改哪些地方。
    该程序使用模拟IIC,不是硬件IIC,只需将SCL,SDA对应的STM32G030F6P6引脚设为推挽输出即可,另外注意移植代码时需要修改为对应引脚。
      该程序在CubeMX下完成,该程序基于中景园STM32标准库函数示例程序修改的。标准库函数例程和本案例完整代码工程获取方式为公众号回复IIC驱动获取下载地址。
2 如何利用STM32驱动OLED液晶屏
2.1基本配置
     首先利用CubeMX工具进行基本配置,配置内容主要包括设置PB6、PB7为输出模式;设置PB14和PB13为SWCLK调试接口;设置PA12下拉输输出模式和PA11为上拉输入模式。时钟采用芯片内部高速时钟,部分配置如下图所示。
微信图片_20221126221851.png

9 ]% m$ K# E1 o+ k7 K$ t
微信图片_20221126221848.png
2.2 1.54OLED端口含义
IIC接口的OLED引脚有四脚,如图所示分别为
. y1 s$ o3 Q7 d9 f
微信图片_20221126221844.png

7 o5 t/ u1 l- c) J2 b5 R, [+ @/ p
2.3 1.54OLED液晶屏引脚与STM32引脚的硬件连接
( k& |: i" g# e  P9 f* ]) o
微信图片_20221126221841.png

5 k% O% ~# k3 _
       这里OLED的SCL接STM32的PB7,SDA接单片机的PB9,如果采用模拟IIC,这两个引脚是可以随意改动,只需要在CubeMX上事先配置好对应引脚为OutPut模式。这里接PB9和PB7,因为这两个引脚可以作为硬件IIC使用。

) |8 \6 Y3 Y# w# p. v* d0 u9 L
2.4  1.54寸OLED液晶屏驱动程序
     首先修改oled.c文件,删除#include "delay.h",将u8全部替换为uint8_t;将u16全部替换为uint16_t;修改OLED的初始化函数,删除如下代码,因为初始化已经在主函数通过MX_GPIO_Init()实现。将delay_ms(200)用HAL_Delay(200)替换。
微信图片_20221126221839.png
& W3 U% v$ F7 q- e5 Y( i
           
微信图片_20221126221836.png

0 _  D+ e6 e7 E& M$ `& _: p
  1. <div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//修改之后的OLED的初始化代码</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_Init(void)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_RES_Clr();</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        //delay_ms(200);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        HAL_Delay(200);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_RES_Set();</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xFD,OLED_CMD);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x12,OLED_CMD);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xA0,OLED_CMD);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x00,OLED_CMD);//-not offset</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x12,OLED_CMD);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xBF,OLED_CMD);// Set SEG Output Current Brightness</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x25,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x34,OLED_CMD);//Set VCOM Deselect Level</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_Clear();</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xAF,OLED_CMD);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">}</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">pping RAM Counter (0x00~0x3F)
    : v3 D# q) }1 v# y1 f6 {
  2. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x00,OLED_CMD);//-not offset</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">        OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock</font></font></font></div>
复制代码
7 v7 y4 X9 O/ J8 J  m4 O1 l
: D/ o9 }& H; K
      接下来修改oled.h文件,这里主要是将对连接OLED的SCK和SDA的两个标准库读写操作用HAL库操作。
  1. <div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#ifndef __OLED_H</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define __OLED_H </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">3 ?5 E( F. N8 P# |$ G2 w- f. x5 }3 Z" e
  2. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//#include "stm32f0xx.h"</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">/******1.改为hal库头文件*****/</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#include "stm32g0xx_hal.h"</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//-----------------测试LED端口定义---------------- </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//#define LED_ON        GPIO_ResetBits(GPIOA,GPIO_Pin_15)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//#define LED_OFF       GPIO_SetBits(GPIOA,GPIO_Pin_15)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">
      q: L: ]$ E- z1 `5 \5 j5 J
  3. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//-----------------OLED端口定义---------------- </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">/******2.改为hal对GPIO操作*****/</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//SCL----->PB7</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">//SDA----->PB9</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_SCL_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)//SCL</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_SCL_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">
    % ?0 b& x+ j+ Z& x9 I
  4. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">
    3 u1 [: N% e4 S4 C9 H; q1 Y; {, K
  5. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">
    4 u9 p; S% u0 |; ~. a
  6. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_SDA_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)//DIN</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_SDA_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">5 p2 Y# r7 ]" y  Z$ s
  7. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_RES_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)//RES</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_RES_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">. H. N8 ?1 `- N; \% P
  8. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">( I7 r* Z1 ]: M+ G3 r
  9. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_CMD  0        //写命令</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define OLED_DATA 1        //写数据</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">
    1 P2 d4 ?) V9 l( M
  10. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define uint8_t unsigned char </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define u16 unsigned int</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#define u32 unsigned long</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">1 @: s' [/ E1 ?* A+ ]/ J
  11. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ClearPoint(uint8_t x,uint8_t y);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ColorTurn(uint8_t i);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_DisplayTurn(uint8_t i);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void I2C_Start(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void I2C_Stop(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void I2C_WaitAck(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void Send_Byte(uint8_t dat);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_WR_Byte(uint8_t dat,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_DisPlay_On(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_DisPlay_Off(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_Refresh(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_Clear(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_DrawLine(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_DrawCircle(uint8_t x,uint8_t y,uint8_t r);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t size1,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowChar6x8(uint8_t x,uint8_t y,uint8_t chr,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t size1,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowNum(uint8_t x,uint8_t y,u32 num,uint8_t len,uint8_t size1,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowChinese(uint8_t x,uint8_t y,uint8_t num,uint8_t size1,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ScrollDisplay(uint8_t num,uint8_t space,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowPicture(uint8_t x,uint8_t y,uint8_t sizex,uint8_t sizey,uint8_t BMP[],uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_Init(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">. V$ |* C9 D& M6 M! T
  12. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#endif</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">size1,uint8_t mode);
    $ s* n6 U. s/ m" c1 I1 n
  13. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ScrollDisplay(uint8_t num,uint8_t space,uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_ShowPicture(uint8_t x,uint8_t y,uint8_t sizex,uint8_t sizey,uint8_t BMP[],uint8_t mode);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">void OLED_Init(void);</font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">( k% j) t* T% `4 F, m
  14. </font></font></font></div><div align="left"><font face="Tahoma"><font size="3"><font color="#000000">#endif</font></font></font></div>
复制代码

. i+ w. f5 N/ [- m0 L; ?
转载自:MCU学习笔记
收藏 评论0 发布时间:2022-11-27 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版