|
求助!一开始写了有文本的程序但屏幕一直是亮着的条纹。根据AI建议后写了个全亮程序,结果一半全亮,另一半跟二维码一样花屏,分辨率128x64,到底咋回事 /*
include "ssd1306.h"include "i2c.h"uint8_t OLED_Buffer[OLED_BUFFER_SIZE]; static const uint8_t Font6x8[96][6] = {
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_Clear(); OLED_Update(); } void OLED_Clear(void) { for(int i=0;i<OLED_BUFFER_SIZE;i++) {
} } void OLED_Update(void) { for(uint8_t page=0;page<8;page++) {
} } 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) {
} } 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++) {
} buf[len]='\0'; OLED_ShowString(x,y,buf); } /*
ifndef __SSD1306_Hdefine __SSD1306_Hinclude "main.h"include <stdint.h>include <string.h>define OLED_ADDR 0x78extern I2C_HandleTypeDef hi2c1; define OLED_WIDTH 128define OLED_HEIGHT 64define 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 / /**
*/ / 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 GNUCdefine PUTCHAR_PROTOTYPE int __io_putchar(int ch)elsedefine PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)endifPUTCHAR_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 / /**
*/ 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);
/ USER CODE END WHILE / / USER CODE BEGIN 3 / } / USER CODE END 3 / } /**
*/ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters
*/ 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_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 / /**
*/ 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/**
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 /
|
是不是配置哪里还不对?
STM32F103RCT6断电以后,ADC会漏电
程序不能仿真,下载后不能运行。无报错无警告
STM32F103 RTC 休眠唤醒后 读到的时间不对
STM32F103的串口1(PA9/10)映射到PB6/7
简单平稳过度-回顾2025&说说我心中的ST中文论坛
Error in final launch sequence: Failed to execute MI command: target remote localhost:61234
基于STM32F103的HAL库实现USB(HID) OTA升级
STM32F103C8T6单片机通过PA4、PA5、PB10、PB11接口与单个74HC595D连接,然后通过CAN发报0x87,74HC595D输出脚Q1和Q5是常高电平,但连接多个74HC595D时,Q1和Q5波形不正常,为什么会出现方波?
STM32的内部Flash操作是不是优先级最高?
微信公众号
手机版
控制的区域问题,尝试多写一点,起始位置可能又偏移

[md]从截图上看,OLED_WriteCmd()及I2C通讯应该不是问题,问题很可能就在OLED_Init()函数上,好象是显存地址设置不正确。建议找到显示屏厂家或供应商提供的示例代码再试试。
是的,硬件没问题,我换了两块OLED和核心板结果都一样;I2C通信也没问题;分辨率没问题;程序我根据AI建议检查了OLED_WriteCmd(uint8_t cmd),OLED_Init(void)和OLED_Update(void)等都没问题,哎,谢谢您的评论!
使用不同顔色依次进行清屏操作,看看效果。如果正常显示的话,则表明驱动程序没有问题,重点检查写字符的函数。
如果有逻辑分析仪,可以抓取相关引脚的时序,看看时序会不会有问题。
程序代码的分辨率 没有覆盖到屏幕分辨率;分辨率设置不匹配
再调试一下程序,看看送出去的全亮的内容是否有缺少。
最好附上图片和代码
都是128x64
已附上ssd1306.c ssd1306.h main.c和图片,求指点!
[md]感谢指点!我来试试
感谢指点!线没问题,但写了I2C的扫描程序后,在串口调试助手并没有打印出我写的文本,我再试试
[md]好的,感谢指点!
很可能是初始化没有设置好,对照数据手册或用官方提供的初始化程序试试。
大概率程序问题