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

新手求助STM32c8t6 0.96寸4针脚OLED 屏幕一半亮一半花屏。

[复制链接]
0.2000 提问时间:2026-4-16 00:34 / 未解决

求助!一开始写了有文本的程序但屏幕一直是亮着的条纹。根据AI建议后写了个全亮程序,结果一半全亮,另一半跟二维码一样花屏,分辨率128x64,到底咋回事

/*

  • ssd1306.c
  • Created on: Mar 24, 2026
  • Author: Administrator */

include "ssd1306.h"

include "i2c.h"

uint8_t OLED_Buffer[OLED_BUFFER_SIZE];

static const uint8_t Font6x8[96][6] = {

    {0x00,0x00,0x00,0x00,0x00,0x00},  // 空格

    {0x00,0x5F,0x00,0x00,0x00,0x00},  // !

    {0x03,0x00,0x03,0x00,0x00,0x00},  // "

    {0x24,0x7E,0x24,0x7E,0x24,0x00},  // #

    {0x24,0x2B,0x6A,0x12,0x00,0x00},  // $

    {0x46,0x29,0x10,0x48,0x32,0x00},  // %

    {0x36,0x49,0x55,0x22,0x50,0x00},  // &

    {0x03,0x00,0x00,0x00,0x00,0x00},  // '

    {0x1C,0x22,0x41,0x00,0x00,0x00},  // (

    {0x41,0x22,0x1C,0x00,0x00,0x00},  // )

    {0x14,0x08,0x3E,0x08,0x14,0x00},  // *

    {0x08,0x08,0x3E,0x08,0x08,0x00},  // +

    {0x80,0x60,0x00,0x00,0x00,0x00},  // ,

    {0x08,0x08,0x08,0x08,0x08,0x00},  // -

    {0x60,0x60,0x00,0x00,0x00,0x00},  // .

    {0x20,0x10,0x08,0x04,0x02,0x00},  // /

    {0x3E,0x41,0x41,0x41,0x3E,0x00},  // 0

    {0x00,0x42,0x7F,0x40,0x00,0x00},  // 1

    {0x62,0x51,0x49,0x49,0x46,0x00},  // 2

    {0x21,0x41,0x49,0x4D,0x33,0x00},  // 3

    {0x18,0x14,0x12,0x7F,0x10,0x00},  // 4

    {0x27,0x45,0x45,0x45,0x39,0x00},  // 5

    {0x3C,0x4A,0x49,0x49,0x30,0x00},  // 6

    {0x01,0x71,0x09,0x05,0x03,0x00},  // 7

    {0x36,0x49,0x49,0x49,0x36,0x00},  // 8

    {0x06,0x49,0x49,0x29,0x1E,0x00},  // 9

    {0x36,0x36,0x00,0x00,0x00,0x00},  // :

    {0x36,0x36,0x60,0x00,0x00,0x00},  // ;

    {0x08,0x14,0x22,0x41,0x00,0x00},  // <

    {0x14,0x14,0x14,0x14,0x14,0x00},  // =

    {0x41,0x22,0x14,0x08,0x00,0x00},  // >

    {0x02,0x01,0x59,0x06,0x02,0x00},  // ?

    {0x3E,0x41,0x5D,0x59,0x4E,0x00},  // @

    {0x7C,0x12,0x11,0x12,0x7C,0x00},  // A

    {0x7F,0x49,0x49,0x49,0x36,0x00},  // B

    {0x3E,0x41,0x41,0x41,0x22,0x00},  // C

    {0x7F,0x41,0x41,0x41,0x3E,0x00},  // D

    {0x7F,0x49,0x49,0x41,0x41,0x00},  // E

    {0x7F,0x09,0x09,0x01,0x01,0x00},  // F

    {0x3E,0x41,0x49,0x49,0x7A,0x00},  // G

    {0x7F,0x08,0x08,0x08,0x7F,0x00},  // H

    {0x00,0x41,0x7F,0x41,0x00,0x00},  // I

    {0x20,0x40,0x41,0x3F,0x01,0x00},  // J

    {0x7F,0x08,0x14,0x22,0x41,0x00},  // K

    {0x7F,0x40,0x40,0x40,0x40,0x00},  // L

    {0x7F,0x02,0x04,0x02,0x7F,0x00},  // M

    {0x7F,0x04,0x08,0x10,0x7F,0x00},  // N

    {0x3E,0x41,0x41,0x41,0x3E,0x00},  // O

    {0x7F,0x09,0x09,0x09,0x06,0x00},  // P

    {0x3E,0x41,0x51,0x21,0x5E,0x00},  // Q

    {0x7F,0x09,0x19,0x29,0x46,0x00},  // R

    {0x26,0x49,0x49,0x49,0x32,0x00},  // S

    {0x01,0x01,0x7F,0x01,0x01,0x00},  // T

    {0x3F,0x40,0x40,0x40,0x3F,0x00},  // U

    {0x07,0x18,0x60,0x18,0x07,0x00},  // V

    {0x3F,0x40,0x38,0x40,0x3F,0x00},  // W

    {0x63,0x14,0x08,0x14,0x63,0x00},  // X

    {0x03,0x04,0x78,0x04,0x03,0x00},  // Y

    {0x61,0x59,0x49,0x4D,0x43,0x00},  // Z

    {0x7F,0x41,0x41,0x00,0x00,0x00},  // [

    {0x02,0x04,0x08,0x10,0x20,0x00},  // 反斜杠

    {0x41,0x41,0x7F,0x00,0x00,0x00},  // ]

    {0x04,0x02,0x01,0x02,0x04,0x00},  // ^

    {0x80,0x80,0x80,0x80,0x80,0x00},  // _

    {0x01,0x02,0x00,0x00,0x00,0x00},  // `

    {0x20,0x54,0x54,0x54,0x78,0x00},  // a

    {0x7F,0x44,0x44,0x44,0x38,0x00},  // b

    {0x38,0x44,0x44,0x44,0x20,0x00},  // c

    {0x38,0x44,0x44,0x44,0x7F,0x00},  // d

    {0x38,0x54,0x54,0x54,0x18,0x00},  // e

    {0x08,0x7E,0x09,0x01,0x02,0x00},  // f

    {0x18,0xA4,0xA4,0xA4,0x7C,0x00},  // g

    {0x7F,0x04,0x04,0x04,0x78,0x00},  // h

    {0x00,0x44,0x7D,0x40,0x00,0x00},  // i

    {0x40,0x80,0x84,0x7D,0x00,0x00},  // j

    {0x7F,0x10,0x28,0x44,0x00,0x00},  // k

    {0x00,0x41,0x7F,0x40,0x00,0x00},  // l

    {0x7C,0x04,0x18,0x04,0x78,0x00},  // m

    {0x7C,0x04,0x04,0x04,0x78,0x00},  // n

    {0x38,0x44,0x44,0x44,0x38,0x00},  // o

    {0xFC,0x24,0x24,0x24,0x18,0x00},  // p

    {0x18,0x24,0x24,0x24,0xFC,0x00},  // q

    {0x7C,0x08,0x04,0x04,0x08,0x00},  // r

    {0x48,0x54,0x54,0x54,0x20,0x00},  // s

    {0x04,0x3F,0x44,0x40,0x20,0x00},  // t

    {0x3C,0x40,0x40,0x40,0x3C,0x00},  // u

    {0x0C,0x30,0x40,0x30,0x0C,0x00},  // v

    {0x3C,0x40,0x30,0x40,0x3C,0x00},  // w

    {0x44,0x28,0x10,0x28,0x44,0x00},  // x

    {0x1C,0xA0,0xA0,0xA0,0x7C,0x00},  // y

    {0x44,0x64,0x54,0x4C,0x44,0x00},  // z

    {0x08,0x36,0x41,0x41,0x00,0x00},  // {

    {0x00,0x77,0x00,0x00,0x00,0x00},  // |

    {0x41,0x41,0x36,0x08,0x00,0x00},  // }

    {0x08,0x04,0x08,0x10,0x08,0x00},  // ~

};

static void OLED_WriteCmd(uint8_t cmd)

{

uint8_t buffer[2]={0x00,cmd};

HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, buffer, 2, 100); }

static void OLED_WriteData(uint8_t data)

{

uint8_t buffer[2]={0x40,data};

HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, buffer, 2, 100); }

void OLED_Init(void)

{

HAL_Delay(200); // 等待上电稳定

OLED_WriteCmd(0xAE);  // 关闭显示

OLED_WriteCmd(0x20);  // 设置内存寻址模式

OLED_WriteCmd(0x00);  // 00=水平寻址模式

OLED_WriteCmd(0xB0);  // 设置页面起始地址

OLED_WriteCmd(0xC8);  // 设置COM扫描方向(上下翻转)

OLED_WriteCmd(0x00);  // 设置低列起始地址

OLED_WriteCmd(0x10);  // 设置高列起始地址

OLED_WriteCmd(0x40);  // 设置起始行

OLED_WriteCmd(0x81);  // 设置对比度

OLED_WriteCmd(0xFF);  // 对比度值(0-255,FF最亮)

OLED_WriteCmd(0xA1);  // 设置段重映射(左右翻转)

OLED_WriteCmd(0xA6);  // 正常显示(A7为反色显示)

OLED_WriteCmd(0xA8);  // 设置复用率

OLED_WriteCmd(0x3F);  // 复用率值(64行)

OLED_WriteCmd(0xD3);  // 设置显示偏移

OLED_WriteCmd(0x00);  // 偏移值

OLED_WriteCmd(0xD5);  // 设置显示时钟分频

OLED_WriteCmd(0xF0);  // 分频值

OLED_WriteCmd(0xD9);  // 设置预充电周期

OLED_WriteCmd(0x22);  // 预充电值

OLED_WriteCmd(0xDA);  // 设置COM引脚硬件配置

OLED_WriteCmd(0x12);  // 配置值

OLED_WriteCmd(0xDB);  // 设置VCOMH电压

OLED_WriteCmd(0x20);  // 电压值

OLED_WriteCmd(0x8D);  // 设置电荷泵

OLED_WriteCmd(0x14);  // 使能电荷泵(关键!)

OLED_WriteCmd(0xAF);  // 开启显示

OLED_Clear();

OLED_Update(); }

void OLED_Clear(void)

{

for(int i=0;i<OLED_BUFFER_SIZE;i++)

{

OLED_Buffer[i]=0;

} }

void OLED_Update(void)

{

for(uint8_t page=0;page<8;page++)

{

OLED_WriteCmd(0xB0 + page);

OLED_WriteCmd(0x00);

OLED_WriteCmd(0x10);

HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, &OLED_Buffer[page * 128], 128, 100);

} }

void OLED_ShowChar(uint8_t x, uint8_t y, char ch)

{

uint8_t i;

uint16_t offset;

if(x>122) return;

if(y>7) return;

if(ch<32||ch>127) ch=32;

offset=(ch-32)*6;

for(i=0;i<6;i++) {

OLED_Buffer[y*128+x+i]=Font6x8[offset+i]; }

}

void OLED_ShowString(uint8_t x, uint8_t y, char* str)

{

while(*str)

{

OLED_ShowChar(x, y, *str);

x += 6;

if(x > 122)

{

    x = 0;

    y++;

    if(y > 7) break;

}

str++;

} }

void OLED_ShowNum(uint8_t x, uint8_t y,uint32_t num,uint8_t len)

{

char buf[12];

uint8_t i;

uint32_t divisor=1;

for(i=1;i<len;i++)divisor *=10;

for(i=0;i<len;i++)

{

uint8_t digit=(num/divisor)%10;

buf[i]=digit+'0';

divisor/=10;

}

buf[len]='\0';

OLED_ShowString(x,y,buf); }

/*

  • ssd1306.h
  • Created on: Mar 24, 2026
  • Author: Administrator */

ifndef __SSD1306_H

define __SSD1306_H

include "main.h"

include <stdint.h>

include <string.h>

define OLED_ADDR 0x78

extern I2C_HandleTypeDef hi2c1;

define OLED_WIDTH 128

define OLED_HEIGHT 64

define OLED_BUFFER_SIZE (OLED_WIDTH*OLED_HEIGHT/8)

extern uint8_t OLED_Buffer[OLED_BUFFER_SIZE];

void OLED_Init(void);

void OLED_Clear(void);

void OLED_Update(void);

void OLED_ShowChar(uint8_t x, uint8_t y, char ch);

void OLED_ShowString(uint8_t x, uint8_t y, char* str);

void OLED_ShowNum(uint8_t x, uint8_t y,uint32_t num,uint8_t len);

endif

/ USER CODE BEGIN Header /

/**


  • @file : main.c
  • @brief : Main program body

  • @attention
  • Copyright (c) 2026 STMicroelectronics.
  • All rights reserved.
  • This software is licensed under terms that can be found in the LICENSE file
  • in the root directory of this software component.
  • If no LICENSE file comes with this software, it is provided AS-IS.

*/

/ USER CODE END Header /

/ Includes ------------------------------------------------------------------/

include "main.h"

include "i2c.h"

include "usart.h"

include "gpio.h"

/ Private includes ----------------------------------------------------------/

/ USER CODE BEGIN Includes /

/ USER CODE END Includes /

/ Private typedef -----------------------------------------------------------/

/ USER CODE BEGIN PTD /

/ USER CODE END PTD /

/ Private define ------------------------------------------------------------/

/ USER CODE BEGIN PD /

/ USER CODE END PD /

/ Private macro -------------------------------------------------------------/

/ USER CODE BEGIN PM /

/ USER CODE END PM /

/ Private variables ---------------------------------------------------------/

/ USER CODE BEGIN PV /

/ USER CODE END PV /

/ Private function prototypes -----------------------------------------------/

void SystemClock_Config(void);

/ USER CODE BEGIN PFP /

/ USER CODE END PFP /

/ Private user code ---------------------------------------------------------/

/ USER CODE BEGIN 0 /

include <stdio.h>

ifdef GNUC

define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

else

define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

endif

PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

return ch; }

include "ssd1306.h"

extern uint8_t OLED_Buffer[1024];

/ USER CODE END 0 /

/**

  • @brief The application entry point.
  • @retval int

*/

int main(void)

{

/ USER CODE BEGIN 1 /

/ USER CODE END 1 /

/ MCU Configuration--------------------------------------------------------/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. /

HAL_Init();

/ USER CODE BEGIN Init /

/ USER CODE END Init /

/ Configure the system clock /

SystemClock_Config();

/ USER CODE BEGIN SysInit /

/ USER CODE END SysInit /

/ Initialize all configured peripherals /

MX_GPIO_Init();

MX_I2C1_Init();

MX_USART1_UART_Init();

/ USER CODE BEGIN 2 /

HAL_Delay(1000);

OLED_Init();

for(int i=0;i<1024;i++)

{

OLED_Buffer[i]=0xFF; }

OLED_Update();

HAL_Delay(2000);

OLED_Clear();

OLED_Update();

OLED_Clear();

OLED_ShowString(0, 4, "OK");

OLED_Update();

/ USER CODE END 2 /

/ Infinite loop /

/ USER CODE BEGIN WHILE /

while (1)

{

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

      HAL_Delay(500);

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 / }

/ USER CODE END 3 /

}

/**

  • @brief System Clock Configuration
  • @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the RCC Oscillators according to the specified parameters

  • in the RCC_OscInitTypeDef structure.

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler(); }

/** Initializes the CPU, AHB and APB buses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                      |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler(); }

}

/ USER CODE BEGIN 4 /

/ USER CODE END 4 /

/**

  • @brief This function is executed in case of error occurrence.
  • @retval None

*/

void Error_Handler(void)

{

/ USER CODE BEGIN Error_Handler_Debug /

/ User can add his own implementation to report the HAL error return state /

__disable_irq();

while (1)

{

}

/ USER CODE END Error_Handler_Debug /

}

ifdef USE_FULL_ASSERT

/**

  • @brief Reports the name of the source file and the source line number
  • where the assert_param error has occurred.
    • @param file: pointer to the source file name
    • @param line: assert_param error line source number
    • @retval None */

void assert_failed(uint8_t *file, uint32_t line)

{

/ USER CODE BEGIN 6 /

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) / / USER CODE END 6 */

}

endif / USE_FULL_ASSERT /

b1c91ba005bf90b8def9d1fd7be4d915.jpg

收藏 评论17 发布时间:2026-4-16 00:34

举报

17个回答
qintian0303 回答时间:2026-4-16 09:57:48

控制的区域问题,尝试多写一点,起始位置可能又偏移1-副本.jpg1.jpg

老牛洋车 回答时间:2026-4-17 07:57:34

0.2000 发表于 2026-4-17 00:45
是的,硬件没问题,我换了两块OLED和核心板结果都一样;I2C通信也没问题;分辨率没问题;程序我根据A ...

[md]从截图上看,OLED_WriteCmd()及I2C通讯应该不是问题,问题很可能就在OLED_Init()函数上,好象是显存地址设置不正确。建议找到显示屏厂家或供应商提供的示例代码再试试。

0.2000 回答时间:2026-4-17 00:45:41

zhoupxa 发表于 2026-4-16 22:49
大概率程序问题

是的,硬件没问题,我换了两块OLED和核心板结果都一样;I2C通信也没问题;分辨率没问题;程序我根据AI建议检查了OLED_WriteCmd(uint8_t cmd),OLED_Init(void)和OLED_Update(void)等都没问题,哎,谢谢您的评论!

老牛洋车 回答时间:2026-4-16 07:40:22

使用不同顔色依次进行清屏操作,看看效果。如果正常显示的话,则表明驱动程序没有问题,重点检查写字符的函数。

如果有逻辑分析仪,可以抓取相关引脚的时序,看看时序会不会有问题。

A0dy 回答时间:2026-4-16 09:42:48

程序代码的分辨率 没有覆盖到屏幕分辨率;分辨率设置不匹配

butterflyspring 回答时间:2026-4-16 09:45:07
建议先检查一下连接线,看看是否有连接异常。最好看看信号是否都有。

再调试一下程序,看看送出去的全亮的内容是否有缺少。

CM_STM32 回答时间:2026-4-16 12:54:08

最好附上图片和代码

0.2000 回答时间:2026-4-16 13:27:52

A0dy 发表于 2026-4-16 09:42
程序代码的分辨率 没有覆盖到屏幕分辨率;分辨率设置不匹配

都是128x64

0.2000 回答时间:2026-4-16 13:45:11

CM_STM32 发表于 2026-4-16 12:54
最好附上图片和代码

已附上ssd1306.c ssd1306.h main.c和图片,求指点!

0.2000 回答时间:2026-4-16 13:46:10

老牛洋车 发表于 2026-4-16 07:40
使用不同顔色依次进行清屏操作,看看效果。如果正常显示的话,则表明驱动程序没有问题,重点检查写字符 ...

[md]感谢指点!我来试试

0.2000 回答时间:2026-4-16 13:50:36

butterflyspring 发表于 2026-4-16 09:45
建议先检查一下连接线,看看是否有连接异常。最好看看信号是否都有。</p>
<p>再调试一下程序,看看送出去的全亮的 ...

感谢指点!线没问题,但写了I2C的扫描程序后,在串口调试助手并没有打印出我写的文本,我再试试

0.2000 回答时间:2026-4-16 13:51:09

qintian0303 发表于 2026-4-16 09:57
控制的区域问题,尝试多写一点,起始位置可能又偏移![1-副本.jpg](data/attachment/forum/202604/16/09 ...

[md]好的,感谢指点!

老牛洋车 回答时间:2026-4-16 14:58:32

很可能是初始化没有设置好,对照数据手册或用官方提供的初始化程序试试。

zhoupxa 回答时间:2026-4-16 22:49:01

大概率程序问题

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