From 1198ca67639bcda87264f6fe02385c294f33d55c Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 22 Aug 2026 20:01:47 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20OLED=E9=98=B2=E7=83=A7=E5=B1=8F?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=E5=8A=A0=E5=A4=A7=E5=88=B00~24px,=E6=8C=89?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=AE=BD=E5=BA=A6=E8=87=AA=E5=8A=A8=E9=92=B3?= =?UTF-8?q?=E4=BD=8D,=E5=B7=A6=E4=BE=A7=E8=85=BE=E7=A9=BA=E5=88=97?= =?UTF-8?q?=E5=85=A8=E6=B8=85=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- V1.5/STM32F103_App1/HardWare/OLED/oled.c | 12 ++++++++++++ V1.5/STM32F103_App1/HardWare/OLED/oled.h | 3 ++- V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c | 9 ++++++--- V1.5/版本说明.md | 1 + 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/V1.5/STM32F103_App1/HardWare/OLED/oled.c b/V1.5/STM32F103_App1/HardWare/OLED/oled.c index 7527e97..fa7877f 100644 --- a/V1.5/STM32F103_App1/HardWare/OLED/oled.c +++ b/V1.5/STM32F103_App1/HardWare/OLED/oled.c @@ -287,6 +287,18 @@ void oled_xoff(uint8_t px) s_col += px; } +/*==== ıؿȣ/ȫ 16pxASCII 8px ====*/ +uint8_t oled_text_w(const char *s) +{ + const uint8_t *p = (const uint8_t *)s; + uint32_t w = 0; + while (*p) { + if (p[0] >= 0xa1 && p[1] >= 0xa1) { w += 16; p += 2; } + else { w += 8; p += 1; } + } + return (uint8_t)(w > 128 ? 128 : w); +} + /*==== ʾؿȣ 128px ÿո루ϴݣ====*/ void oled_print_line(const char *s) { diff --git a/V1.5/STM32F103_App1/HardWare/OLED/oled.h b/V1.5/STM32F103_App1/HardWare/OLED/oled.h index 824a465..7ba2a69 100644 --- a/V1.5/STM32F103_App1/HardWare/OLED/oled.h +++ b/V1.5/STM32F103_App1/HardWare/OLED/oled.h @@ -13,7 +13,8 @@ void oled_init(void); /* GPIO + void oled_clear(void); /* ȫ */ void oled_off(void); /* ʾ0xAEϵǰ */ void oled_locate(uint8_t row, uint8_t col8); /* λrow 0~3col8 Ϊ 8 صλ 0~15 */ -void oled_xoff(uint8_t px); /* ڵǰл px أƫã */ +void oled_xoff(uint8_t px); +uint8_t oled_text_w(const char *gbk_str); /* ıؿȣ16/ASCII8 */ /* ڵǰл px أƫã */ void oled_print(const char *gbk_str); /* ӵǰλʾ GBK ַ */ void oled_print_line(const char *gbk_str); /* ʾ 128px ÿո븲Ǿ */ diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index 1091f44..91a26d1 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -247,9 +247,12 @@ void app_oled_presched_tick(void) /* дһУƫƣдոڳУٴƫƴд */ static void oled_row(uint8_t row, uint8_t xoff, const char *s) { + /* ݿǯλݿƣ֤ұ߽ */ + uint8_t w = oled_text_w(s); + if (xoff > 0 && (uint16_t)xoff + w > 128) xoff = 128 - w; if (xoff) { oled_locate(row, 0); - oled_print(" "); /* ڳУֹ */ + for (uint8_t c = 0; c < xoff; c += 8) oled_print(" "); /* ڳУ */ oled_locate(row, 0); } oled_locate(row, 0); @@ -260,8 +263,8 @@ static void oled_row(uint8_t row, uint8_t xoff, const char *s) static void oled_home_refresh(uint32_t up_ms) { char buf[24]; - /* ÿ 10s һˮƽƫƣ0/2/4px */ - uint8_t xoff = (uint8_t)((HAL_GetTick() / 10000u) % 3u) * 2u; + /* ÿ 10s һˮƽƫƣ0~24pxݿԶǯλ */ + uint8_t xoff = (uint8_t)((HAL_GetTick() / 10000u) % 5u) * 6u; if (g_net_mqtt_ready) { /*---- ----*/ diff --git a/V1.5/版本说明.md b/V1.5/版本说明.md index 9634577..b369b77 100644 --- a/V1.5/版本说明.md +++ b/V1.5/版本说明.md @@ -201,3 +201,4 @@ 根治字节中断+软件超时方案的丢帧/停摆问题;实测秒回/慢回全部一次成功。 过程:DWT 硬件观察点抓到合法写点无误,定位为原中断接收路径在特定时序下字节丢失 - 恢复 OLED 防烧屏像素偏移(每10s 右移 0/2/4px),并修复左侧残留(移位前先写空格清腾空列) +- OLED 偏移幅度加大到 0~24px(5 档),按内容宽度自动钳位不越界,左侧腾空列全量清空