标识符重命名:字库引脚宏改ROM_前缀(ROM_CLK/DI/DO/CS),屏幕只留OLED_I2C_ADDR;对应原理图OLED_SCL/OLED_SDA命名

This commit is contained in:
helei 2026-09-20 11:12:43 +08:00
parent 9bf407396f
commit ce0b1bd48a
1 changed files with 29 additions and 28 deletions

View File

@ -1,8 +1,9 @@
/* oled.c - 128x64 OLED(SSD1306, I2C) + 晶联讯 GB2312 字库 IC(SPI) 驱动 /* oled.c - 128x64 OLED(SSD1306, I2C) + 晶联讯 GB2312 字库 IC(SPI) 驱动
* : I2C , EEPROM I2C 线(SCL=PB5 SDA=PB4), RST ; * : I2C ( OLED_SCL/OLED_SDA), EEPROM I2C 线
* (SCL=PB5 SDA=PB4, iic.h), RST ; OLED_I2C_ADDR=0x78;
* 24C02 storage_lock() * 24C02 storage_lock()
* : SPI, W25Q64 线(CLK=PB6 DI=PB7 DO=PB9), CS2=PC12 ; * : SPI, W25Q64 线(ROM_CLK=PB6 ROM_DI=PB7 ROM_DO=PB9), ROM_CS=PC12 ;
* DO(PB9) (W25Q64_Init ), storage_lock Flash */ * ROM_DO(PB9) (W25Q64_Init ), storage_lock Flash */
#include "oled.h" #include "oled.h"
#include "qrcodegen.h" #include "qrcodegen.h"
@ -10,19 +11,19 @@
#include "app_loop.h" /* storage_lock/unlock */ #include "app_loop.h" /* storage_lock/unlock */
#include <string.h> #include <string.h>
#define OLED_CLK_PORT GPIOB #define ROM_CLK_PORT GPIOB
#define OLED_CLK_PIN GPIO_PIN_6 /* 字库 CLK, 与 W25Q64 CLK 共线 */ #define ROM_CLK_PIN GPIO_PIN_6 /* 字库 CLK, 与 W25Q64 CLK 共线 */
#define OLED_MOSI_PORT GPIOB #define ROM_DI_PORT GPIOB
#define OLED_MOSI_PIN GPIO_PIN_7 /* 字库 DI, 与 W25Q64 DI 共线 */ #define ROM_DI_PIN GPIO_PIN_7 /* 字库 DI, 与 W25Q64 DI 共线 */
#define OLED_FSO_PORT GPIOB #define ROM_DO_PORT GPIOB
#define OLED_FSO_PIN GPIO_PIN_9 /* 字库 DO(FSO), 与 W25Q64 DO 共线, 恒为输入 */ #define ROM_DO_PIN GPIO_PIN_9 /* 字库 DO(FSO), 与 W25Q64 DO 共线, 恒为输入 */
#define OLED_CS2_PORT GPIOC #define ROM_CS_PORT GPIOC
#define OLED_CS2_PIN GPIO_PIN_12 #define ROM_CS_PIN GPIO_PIN_12
#define lcd_mosi(a) HAL_GPIO_WritePin(OLED_MOSI_PORT, OLED_MOSI_PIN, (GPIO_PinState)(a)) #define rom_di(a) HAL_GPIO_WritePin(ROM_DI_PORT, ROM_DI_PIN, (GPIO_PinState)(a))
#define lcd_clk(a) HAL_GPIO_WritePin(OLED_CLK_PORT, OLED_CLK_PIN, (GPIO_PinState)(a)) #define rom_clk(a) HAL_GPIO_WritePin(ROM_CLK_PORT, ROM_CLK_PIN, (GPIO_PinState)(a))
#define rom_cs2(a) HAL_GPIO_WritePin(OLED_CS2_PORT, OLED_CS2_PIN, (GPIO_PinState)(a)) #define rom_cs(a) HAL_GPIO_WritePin(ROM_CS_PORT, ROM_CS_PIN, (GPIO_PinState)(a))
#define ROM_OUT HAL_GPIO_ReadPin(OLED_FSO_PORT, OLED_FSO_PIN) #define ROM_DO_READ HAL_GPIO_ReadPin(ROM_DO_PORT, ROM_DO_PIN)
static uint8_t s_row = 0; /* 当前页地址16px 行 × 2 */ static uint8_t s_row = 0; /* 当前页地址16px 行 × 2 */
static uint8_t s_col = 0; /* 当前列(像素) */ static uint8_t s_col = 0; /* 当前列(像素) */
@ -39,11 +40,11 @@ static void oled_gpio_init(void)
/* 屏幕 I2C 不占 GPIO; 字库 CLK(PB6)/DI(PB7) 与 W25Q64 共线(其 Init 已配为输出), /* 屏幕 I2C 不占 GPIO; 字库 CLK(PB6)/DI(PB7) 与 W25Q64 共线(其 Init 已配为输出),
* DO(PB9) ( Init ), CS2(PC12), */ * DO(PB9) ( Init ), CS2(PC12), */
HAL_GPIO_WritePin(OLED_CS2_PORT, OLED_CS2_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(ROM_CS_PORT, ROM_CS_PIN, GPIO_PIN_SET);
g.Mode = GPIO_MODE_OUTPUT_PP; g.Mode = GPIO_MODE_OUTPUT_PP;
g.Pull = GPIO_PULLUP; g.Pull = GPIO_PULLUP;
g.Speed = GPIO_SPEED_FREQ_LOW; g.Speed = GPIO_SPEED_FREQ_LOW;
g.Pin = OLED_CS2_PIN; HAL_GPIO_Init(OLED_CS2_PORT, &g); g.Pin = ROM_CS_PIN; HAL_GPIO_Init(ROM_CS_PORT, &g);
} }
/*==== SSD1306 I2C 传输(与 EEPROM 共用软件 I2C 总线) ====*/ /*==== SSD1306 I2C 传输(与 EEPROM 共用软件 I2C 总线) ====*/
@ -177,7 +178,7 @@ void oled_init(void)
{ {
HAL_Delay(400); /* 等屏幕/字库上电稳定(I2C 屏无 RST 脚, 靠上电延时) */ HAL_Delay(400); /* 等屏幕/字库上电稳定(I2C 屏无 RST 脚, 靠上电延时) */
oled_gpio_init(); oled_gpio_init();
rom_cs2(1); rom_cs(1);
oled_write(0, 0xAE); /* display off */ oled_write(0, 0xAE); /* display off */
oled_write(0, 0x20); /* 寻址模式 */ oled_write(0, 0x20); /* 寻址模式 */
oled_write(0, 0x10); /* 水平寻址 */ oled_write(0, 0x10); /* 水平寻址 */
@ -241,10 +242,10 @@ static void display_graphic_8x16(uint8_t page, uint8_t column, const uint8_t *dp
static void rom_write_byte(uint8_t dat) static void rom_write_byte(uint8_t dat)
{ {
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
lcd_mosi(dat & 0x80); rom_di(dat & 0x80);
dat <<= 1; dat <<= 1;
lcd_clk(0); rom_clk(0);
lcd_clk(1); rom_clk(1);
} }
} }
@ -252,12 +253,12 @@ static void rom_write_byte(uint8_t dat)
static uint8_t rom_read_byte(void) static uint8_t rom_read_byte(void)
{ {
uint8_t ret = 0; uint8_t ret = 0;
lcd_clk(1); rom_clk(1);
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
lcd_clk(0); rom_clk(0);
ret <<= 1; ret <<= 1;
if (ROM_OUT) ret |= 1; if (ROM_DO_READ) ret |= 1;
lcd_clk(1); rom_clk(1);
} }
return ret; return ret;
} }
@ -266,14 +267,14 @@ static uint8_t rom_read_byte(void)
static void rom_read_n(uint8_t ah, uint8_t am, uint8_t al, uint8_t *buf, uint8_t len) static void rom_read_n(uint8_t ah, uint8_t am, uint8_t al, uint8_t *buf, uint8_t len)
{ {
storage_lock(); /* 与 W25Q64 共用 SPI 三线, 与 Flash 读写互斥 */ storage_lock(); /* 与 W25Q64 共用 SPI 三线, 与 Flash 读写互斥 */
rom_cs2(0); rom_cs(0);
lcd_clk(0); rom_clk(0);
rom_write_byte(0x03); /* 读指令 */ rom_write_byte(0x03); /* 读指令 */
rom_write_byte(ah); rom_write_byte(ah);
rom_write_byte(am); rom_write_byte(am);
rom_write_byte(al); rom_write_byte(al);
for (uint8_t i = 0; i < len; i++) buf[i] = rom_read_byte(); for (uint8_t i = 0; i < len; i++) buf[i] = rom_read_byte();
rom_cs2(1); rom_cs(1);
storage_unlock(); storage_unlock();
} }