Let's do 2025第一期 DIY 功率检测与控制系统 过程贴
目的:实现OLED屏幕显示信息### 硬件信息OLED12864 是一个采用SSD1315控制器驱动的 128*64像素的oled屏幕。主要有I2C 与 SPI接口 与MCU进行通信
i2C 的地址是0x78
MCU 使用以下引脚与OLED12864 的I2C 进行连接
AVDD ------------ VCC
GND ------------ GND
D15(PB8) ------------ SCL
D14(PB9) ------------ SDA
### oled 程序编写MCU 使用 模拟i2C 模式与 OLED 进行交互我们将主办方 提供的驱动程序拷贝到我们的工程目录下面
然后将两个目录添加到
set(MX_Include_Dirs ${CMAKE_SOURCE_DIR}/Core/Inc ${CMAKE_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc ${CMAKE_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy ${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Include ${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Include # 添加下面两个目录 ${CMAKE_SOURCE_DIR}/Core/OLED ${CMAKE_SOURCE_DIR}/Core/INA219) set(ssd1306_src ${CMAKE_SOURCE_DIR}/Core/OLED/oled.c ) set(ina219_src ${CMAKE_SOURCE_DIR}/Core/INA219/ina219.c) target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${ssd1306_src}) target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${ina219_src})
在CMakeLists.txt 中加入以上内容
由于提供的历程使用的是stdlib库,我们 将其改成HAL库 主要变更就是 GPIO 函数的初始化 ,还有延时函数的一些改动。
#define IIC_SCL_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET) #define IIC_SCL_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET) #define IIC_SDA_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET) #define IIC_SDA_H HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET) #define IIC_SDA_READ() HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)
主要实现的函数,屏幕初始化,显示数字,字符串,汉字,图片等等
void OLED_Show_Power_Info(void); void OLED_Show_Threshold_Info(void); void OLED_ClearPoint(uint8_t x, uint8_t y); void OLED_ColorTurn(uint8_t i); void OLED_DisplayTurn(uint8_t i); void I2C_Start(void); void I2C_Stop(void); void I2C_WaitAck(void); void Send_Byte(uint8_t dat); void OLED_WR_Byte(uint8_t dat, uint8_t mode); void OLED_DisPlay_On(void); void OLED_DisPlay_Off(void); void OLED_Refresh(void); void OLED_Clear(void); void OLED_DrawPoint(uint8_t x, uint8_t y); void OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); void OLED_DrawCircle(uint8_t x, uint8_t y, u8 r); void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t size1); void OLED_ShowString(uint8_t x, u8 y, uint8_t *chr, uint8_t size1); void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, u8 len, uint8_t size1); void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t num, uint8_t size1); void OLED_ShowFloatNum(u8 x, u8 y, float num, u8 size1); void OLED_ScrollDisplay(uint8_t num, uint8_t space); void OLED_WR_BP(uint8_t x, u8 y); void OLED_ShowPicture(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[]); void OLED_Init(void);
总结通过实验,了解了IIC设备与屏幕的通信过程。抓包的过程中OLED的 delay 采用循环_nop来实现 始终较硬件I2C的精度差一些 。实际使用过程目前还没出现问题后续继续实现I2C对 INA219的控制