5329|9

241

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【HC32F460开发板测评】06.模拟I2C实现OLED显示 [复制链接]

 
 

HC32F460开发板搭载了一块0.91寸的OLED液晶显示屏,分辨率达到了128*32像素;OLED的通讯接口为I2C,SCL和SDA分别连接在了PD0和PD1这两个端口引脚上;本篇主要是通过模拟I2C的操作方式来实现对OLED液晶屏的显示演示;掌握OLED显示、模拟I2C及时序、以及针对模拟I2C所实现的数据结构。

 

硬件原理图:

OLED头文件:

  • /*******************************************************************************
  • * @file OLED.h
  • * @author xld0932
  • * [url=home.php?mod=space&uid=252314]@version[/url] V1.00
  • * [url=home.php?mod=space&uid=311857]@date[/url] 31-Mar-2021
  • * [url=home.php?mod=space&uid=159083]@brief[/url] ......
  • *******************************************************************************/
  • /* Define to prevent recursive inclusion -------------------------------------*/
  • #ifndef __OLED_H__
  • #define __OLED_H__
  • #ifdef __cplusplus
  • extern "C" {
  • #endif
  • #undef EXTERN
  • #ifdef __OLED_C__
  • #define EXTERN
  • #else
  • #define EXTERN extern
  • #endif
  • /* Includes ------------------------------------------------------------------*/
  • #include "config.h"
  • /* Exported constants --------------------------------------------------------*/
  • #define OLED_I2C_ADDRESS 0x78
  • #define OLED_I2C_TIMEOUT 1000
  • /* Exported types ------------------------------------------------------------*/
  • /* Exported macro ------------------------------------------------------------*/
  • /* Exported functions --------------------------------------------------------*/
  • EXTERN void OLED_Init(void);
  • EXTERN void OLED_Demo(void);
  • #ifdef __cplusplus
  • }
  • #endif
  • #endif
  • /******************* (C) COPYRIGHT 2021 *************************END OF FILE***/

 

OLED源文件:

在OLED源文件的代码实现中,包括了模拟I2C的数据结构体、模拟I2C的时序控制、模拟I2C的读写操作、OLED的初始化和显示实现;

  • /*******************************************************************************
  • * @file OLED.c
  • * @author xld0932
  • * @version V1.00
  • * @date 31-Mar-2021
  • * @brief ......
  • *******************************************************************************/
  • /* Define to prevent recursive inclusion -------------------------------------*/
  • #define __OLED_C__
  • /* Includes ------------------------------------------------------------------*/
  • #include "OLED.h"
  • /* Private typedef -----------------------------------------------------------*/
  • typedef struct
  • {
  • en_port_t SCL_PORT;
  • en_pin_t SCL_PIN;
  • en_port_t SDA_PORT;
  • en_pin_t SDA_PIN;
  • uint32_t TIME;
  • } sI2C_TypeDef;
  • /* Private define ------------------------------------------------------------*/
  • /* Private macro -------------------------------------------------------------*/
  • #define sI2C_SCL_H(sI2C) PORT_SetBits( sI2C->SCL_PORT, sI2C->SCL_PIN)
  • #define sI2C_SCL_L(sI2C) PORT_ResetBits(sI2C->SCL_PORT, sI2C->SCL_PIN)
  • #define sI2C_SDA_H(sI2C) PORT_SetBits( sI2C->SDA_PORT, sI2C->SDA_PIN)
  • #define sI2C_SDA_L(sI2C) PORT_ResetBits(sI2C->SDA_PORT, sI2C->SDA_PIN)
  • #define sI2C_SCL_GET(sI2C) PORT_GetBit(sI2C->SCL_PORT, sI2C->SCL_PIN)
  • #define sI2C_SDA_GET(sI2C) PORT_GetBit(sI2C->SDA_PORT, sI2C->SDA_PIN)
  • /* Private variables ---------------------------------------------------------*/
  • sI2C_TypeDef sI2C_OLED =
  • {
  • PortD, Pin00,
  • PortD, Pin01,
  • 1
  • };
  • /* Private variables ---------------------------------------------------------*/
  • /* 数据水平, 字节垂直, 单色, 48*16, 勾选字节内像素数据反序 & 高位在前 */
  • const unsigned char gImage_OK[96] = { /* 0X32,0X01,0X00,0X30,0X00,0X10, */
  • 0X00,0XF0,0X08,0X04,0X02,0X00,0X20,0X20,0X20,0X20,0X20,0X00,0X00,0X80,0X80,0X00,
  • 0X00,0X00,0XC0,0X20,0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X20,0XC0,0X00,0X00,0X00,
  • 0X80,0X80,0X00,0X00,0X20,0X20,0X20,0X20,0X20,0X00,0X02,0X04,0X08,0XF0,0X00,0X00,
  • 0X00,0X0F,0X10,0X20,0X40,0X00,0X04,0X04,0X04,0X04,0X04,0X00,0X00,0X01,0X01,0X00,
  • 0X00,0X00,0X03,0X04,0X08,0X08,0X04,0X03,0X04,0X08,0X08,0X04,0X03,0X00,0X00,0X00,
  • 0X01,0X01,0X00,0X00,0X04,0X04,0X04,0X04,0X04,0X00,0X40,0X20,0X10,0X0F,0X00,0X00,
  • };
  • const unsigned char gImage_ERROR[96] = { /* 0X32,0X01,0X00,0X30,0X00,0X10, */
  • 0X00,0XF0,0X08,0X04,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X30,0X60,0XC0,
  • 0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,
  • 0X60,0X30,0X10,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X04,0X08,0XF0,0X00,0X00,
  • 0X00,0X0F,0X10,0X20,0X40,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X18,0X0C,0X06,
  • 0X03,0X01,0X00,0X00,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X00,0X00,0X01,0X03,0X06,
  • 0X0C,0X18,0X10,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X40,0X20,0X10,0X0F,0X00,0X00,
  • };
  • const unsigned char gImage_Heart01[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0X80,0X80,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X80,0X80,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0XF8,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,
  • 0XF8,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0X40,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0F,0X1F,0X3F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X3F,0X1F,0X07,0X03,0X00,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,
  • 0X03,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart02[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XE0,0XE0,0XE0,0XE0,0XE0,0XC0,0XC0,0X80,0X00,
  • 0X00,0X00,0X80,0XC0,0XC0,0XE0,0XE0,0XE0,0XE0,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
  • 0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,
  • 0X00,0X00,0X00,0X01,0X07,0X1F,0X3F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X03,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,0X07,0X0F,
  • 0X0F,0X0F,0X07,0X03,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart03[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XC0,0XE0,0XE0,0XE0,0XC0,0XC0,0X80,0X80,0X00,
  • 0X00,0X00,0X80,0XC0,0XC0,0XC0,0XE0,0XE0,0XC0,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
  • 0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X70,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X07,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X03,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X03,0X07,0X0F,
  • 0X0F,0X07,0X07,0X03,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart04[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0X80,0X00,0X00,
  • 0X00,0X00,0X80,0X80,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X70,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
  • 0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X03,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X01,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X07,
  • 0X0F,0X07,0X03,0X03,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart05[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0XC0,0XE0,0XF0,0XF0,0XF8,0XF8,0XF8,0XF8,0XF8,0XF0,0XF0,0XE0,0XC0,0X80,
  • 0X00,0X80,0XC0,0XE0,0XF0,0XF0,0XF8,0XF8,0XF8,0XF8,0XF8,0XF0,0XF0,0XE0,0XC0,0X00,
  • 0X38,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0X00,0X03,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X07,0X01,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X07,0X0F,0X1F,0X1F,0X3F,
  • 0X3F,0X3F,0X1F,0X0F,0X0F,0X07,0X07,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart06[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X80,0XC0,0XE0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XE0,0XE0,0XC0,0X00,
  • 0X00,0X80,0XC0,0XE0,0XE0,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XE0,0XE0,0XC0,0X00,0X00,
  • 0X00,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
  • 0X00,0X00,0X03,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X07,0X03,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X07,0X0F,0X1F,0X1F,
  • 0X3F,0X1F,0X0F,0X0F,0X07,0X03,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart07[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X80,0XC0,0XE0,0XE0,0XE0,0XF0,0XF0,0XF0,0XE0,0XE0,0XC0,0X80,0X00,
  • 0X00,0X00,0X80,0XC0,0XE0,0XE0,0XF0,0XF0,0XF0,0XE0,0XE0,0XC0,0X80,0X00,0X00,0X00,
  • 0X00,0X00,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X78,0X00,
  • 0X00,0X00,0X01,0X07,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X03,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,0X07,0X0F,0X1F,
  • 0X1F,0X0F,0X0F,0X07,0X03,0X03,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart08[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XE0,0XE0,0XE0,0XE0,0XE0,0XC0,0XC0,0X80,0X00,
  • 0X00,0X00,0X80,0XC0,0XC0,0XE0,0XE0,0XE0,0XE0,0XC0,0XC0,0X80,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
  • 0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,
  • 0X00,0X00,0X00,0X01,0X07,0X1F,0X3F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X03,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,0X07,0X0F,
  • 0X0F,0X0F,0X07,0X03,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • const unsigned char gImage_Heart09[128] = { /* 0X32,0X01,0X00,0X20,0X00,0X20, */
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0XC0,0XC0,0X80,0X80,0X80,0X00,0X00,
  • 0X00,0X00,0X00,0X80,0X80,0X80,0XC0,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X70,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
  • 0XFC,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X03,0X0F,0X1F,0X3F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X01,0X00,0X00,0X00,0X00,
  • 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,
  • 0X07,0X03,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  • };
  • /* Private function prototypes -----------------------------------------------*/
  • /* Private functions ---------------------------------------------------------*/
  • /* Exported variables --------------------------------------------------------*/
  • /* Exported function prototypes ----------------------------------------------*/
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * [url=home.php?mod=space&uid=1020061]@attention[/url] *******************************************************************************/
  • void sI2C_SDA_SetDirection(sI2C_TypeDef *sI2C, uint8_t Dir)
  • {
  • stc_port_init_t stcPortInit;
  • MEM_ZERO_STRUCT(stcPortInit);
  • if(Dir)
  • {
  • }
  • else
  • {
  • stcPortInit.enPinMode = Pin_Mode_Out;
  • stcPortInit.enExInt = Enable;
  • stcPortInit.enPullUp = Enable;
  • }
  • PORT_Init(sI2C->SDA_PORT, sI2C->SDA_PIN, &stcPortInit);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void sI2C_SCL_SetDirection(sI2C_TypeDef* sI2C, uint8_t Dir)
  • {
  • stc_port_init_t stcPortInit;
  • MEM_ZERO_STRUCT(stcPortInit);
  • if(Dir)
  • {
  • }
  • else
  • {
  • stcPortInit.enPinMode = Pin_Mode_Out;
  • stcPortInit.enExInt = Enable;
  • stcPortInit.enPullUp = Enable;
  • }
  • PORT_Init(sI2C->SCL_PORT, sI2C->SCL_PIN, &stcPortInit);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void sI2C_GenerateStart(sI2C_TypeDef* sI2C)
  • {
  • sI2C_SDA_H(sI2C);
  • sI2C_SCL_H(sI2C);
  • sI2C_SDA_L(sI2C);
  • sI2C_SCL_L(sI2C);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void sI2C_GenerateStop(sI2C_TypeDef* sI2C)
  • {
  • sI2C_SDA_L(sI2C);
  • sI2C_SCL_H(sI2C);
  • sI2C_SDA_H(sI2C);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • uint8_t sI2C_GetACK(sI2C_TypeDef* sI2C)
  • {
  • uint8_t ack = 0;
  • sI2C_SDA_H(sI2C);
  • sI2C_SDA_SetDirection(sI2C, 1);
  • sI2C_SCL_H(sI2C);
  • ack = sI2C_SDA_GET(sI2C);
  • sI2C_SCL_L(sI2C);
  • sI2C_SDA_SetDirection(sI2C, 0);
  • return ack;
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void sI2C_Write(sI2C_TypeDef* sI2C, uint8_t Data)
  • {
  • for(uint8_t i = 0; i < 8; i++)
  • {
  • if((Data << i) & 0x80) sI2C_SDA_H(sI2C);
  • else sI2C_SDA_L(sI2C);
  • sI2C_SCL_H(sI2C);
  • sI2C_SCL_L(sI2C);
  • }
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void sI2C_Configure(sI2C_TypeDef* sI2C, uint8_t Addr)
  • {
  • sI2C_SDA_SetDirection(sI2C, 0);
  • sI2C_SCL_SetDirection(sI2C, 0);
  • sI2C_SCL_H(sI2C);
  • sI2C_SDA_H(sI2C);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void sI2C_WriteByte(sI2C_TypeDef* sI2C, uint8_t Address, uint8_t Data)
  • {
  • sI2C_GenerateStart(sI2C);
  • sI2C_Write(sI2C, OLED_I2C_ADDRESS);
  • if(sI2C_GetACK(sI2C))
  • {
  • sI2C_GenerateStop(sI2C); return;
  • }
  • sI2C_Write(sI2C, Address);
  • if(sI2C_GetACK(sI2C))
  • {
  • sI2C_GenerateStop(sI2C); return;
  • }
  • sI2C_Write(sI2C, Data);
  • if(sI2C_GetACK(sI2C))
  • {
  • sI2C_GenerateStop(sI2C); return;
  • }
  • sI2C_GenerateStop(sI2C);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_WriteCMD(uint8_t Command)
  • {
  • sI2C_WriteByte(&sI2C_OLED, 0x00, Command);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_WriteDAT(uint8_t Data)
  • {
  • sI2C_WriteByte(&sI2C_OLED, 0x40, Data);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_InitI2C(void)
  • {
  • sI2C_Configure(&sI2C_OLED, OLED_I2C_ADDRESS);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_InitCFG(void)
  • {
  • Ddl_Delay1ms(0x400);
  • OLED_WriteCMD(0xAE);
  • OLED_WriteCMD(0x40);
  • OLED_WriteCMD(0xB0);
  • OLED_WriteCMD(0xC8);
  • OLED_WriteCMD(0x81);
  • OLED_WriteCMD(0xFF);
  • OLED_WriteCMD(0xA1);
  • OLED_WriteCMD(0xA6);
  • OLED_WriteCMD(0xA8);
  • OLED_WriteCMD(0x1F);
  • OLED_WriteCMD(0xD3);
  • OLED_WriteCMD(0x00);
  • OLED_WriteCMD(0xD5);
  • OLED_WriteCMD(0xF0);
  • OLED_WriteCMD(0xD9);
  • OLED_WriteCMD(0x22);
  • OLED_WriteCMD(0xDA);
  • OLED_WriteCMD(0x02);
  • OLED_WriteCMD(0xDB);
  • OLED_WriteCMD(0x49);
  • OLED_WriteCMD(0x8D);
  • OLED_WriteCMD(0x14);
  • OLED_WriteCMD(0xAF);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_SetPosition(uint8_t x, uint8_t y)
  • {
  • OLED_WriteCMD(0xB0 + y);
  • OLED_WriteCMD(((x & 0xF0) >> 4) | 0x10);
  • OLED_WriteCMD(((x & 0x0F) >> 0) | 0x00);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_Clear(uint8_t Data)
  • {
  • uint8_t x = 0, y = 0;
  • for(y = 0; y < 4; y++)
  • {
  • OLED_SetPosition(0, y);
  • for(x = 0; x < 128; x++)
  • {
  • OLED_WriteDAT(Data);
  • }
  • }
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_DrawImage(uint8_t StartX, uint8_t StartY, uint8_t Width, uint8_t Height, const uint8_t *ImageData)
  • {
  • uint8_t x = 0, y = 0;
  • for(y = 0; y < Height / 8; y++)
  • {
  • OLED_SetPosition(StartX, StartY + y);
  • for(x = 0; x < Width; x++)
  • {
  • OLED_WriteDAT(*ImageData++);
  • }
  • }
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_Init(void)
  • {
  • OLED_InitI2C();
  • OLED_InitCFG();
  • OLED_Clear(0x00);
  • }
  • /*******************************************************************************
  • * @brief
  • * @param
  • * @retval
  • * @attention
  • *******************************************************************************/
  • void OLED_Demo(void)
  • {
  • for(uint32_t i = 0; i < 5; i++)
  • {
  • OLED_DrawImage(40, 1, 48, 16, gImage_OK);
  • Ddl_Delay1ms(1000);
  • OLED_DrawImage(40, 1, 48, 16, gImage_ERROR);
  • Ddl_Delay1ms(1000);
  • }
  • for(uint32_t i = 0; i < 10000; i++)
  • {
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart01); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart02); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart03); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart04); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart05); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart06); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart07); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart08); Ddl_Delay1ms(200);
  • OLED_DrawImage(48, 0, 32, 32, gImage_Heart09); Ddl_Delay1ms(200);
  • }
  • }
  • /******************* (C) COPYRIGHT 2021 *************************END OF FILE***/

 

运行视频效果:


 

 

工程源代码:

Project_OLED.zip (841.52 KB, 下载次数: 118)

 

 

 

最新回复

老铁,下载的工程文件编译的时候提示没有hc32f46x.h这个头文件   详情 回复 发表于 2024-10-12 19:29

赞赏

2

查看全部赞赏

点赞(1) 关注
个人签名We are a team and we work as a team !
 
 

回复
举报

693

帖子

7

TA的资源

版主

沙发
 

666

 
 
 

回复

1930

帖子

2

TA的资源

版主

板凳
 

不错不错,感谢分享!

 
 
 

回复

7793

帖子

2

TA的资源

五彩晶圆(高级)

4
 

自编字库,好家伙。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

5
 

楼主 i2c读的函数怎么写啊!

点评

有附件上传工程源码的呀  详情 回复 发表于 2022-8-17 21:25
 
 
 

回复

241

帖子

0

TA的资源

纯净的硅(初级)

6
 
121315L 发表于 2022-8-17 11:14 楼主 i2c读的函数怎么写啊!

有附件上传工程源码的呀

点评

我看了,没找到读的IIC函数。  详情 回复 发表于 2022-8-18 15:09
个人签名We are a team and we work as a team !
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

7
 
xld0932 发表于 2022-8-17 21:25 有附件上传工程源码的呀

我看了,没找到读的IIC函数。

点评

硬件I2C操作EEPROM的操作,有读有写的操作  详情 回复 发表于 2022-8-19 12:58
OLED操作只需要写,为什么要读?读什么?  详情 回复 发表于 2022-8-19 12:57
 
 
 

回复

241

帖子

0

TA的资源

纯净的硅(初级)

8
 
121315L 发表于 2022-8-18 15:09 我看了,没找到读的IIC函数。

OLED操作只需要写,为什么要读?读什么?

个人签名We are a team and we work as a team !
 
 
 

回复

241

帖子

0

TA的资源

纯净的硅(初级)

9
 
121315L 发表于 2022-8-18 15:09 我看了,没找到读的IIC函数。

硬件I2C操作EEPROM的操作,有读有写的操作

个人签名We are a team and we work as a team !
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

老铁,下载的工程文件编译的时候提示没有hc32f46x.h这个头文件

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 6

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表