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; } +/*==== 文本像素宽度:汉字/全角 16px,ASCII 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~3,col8 为 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 @@ 鏍规不瀛楄妭涓柇+杞欢瓒呮椂鏂规鐨勪涪甯/鍋滄憜闂锛涘疄娴嬬鍥/鎱㈠洖鍏ㄩ儴涓娆℃垚鍔熴 杩囩▼锛欴WT 纭欢瑙傚療鐐规姄鍒板悎娉曞啓鐐规棤璇紝瀹氫綅涓哄師涓柇鎺ユ敹璺緞鍦ㄧ壒瀹氭椂搴忎笅瀛楄妭涓㈠け - 鎭㈠ OLED 闃茬儳灞忓儚绱犲亸绉伙紙姣10s 鍙崇Щ 0/2/4px锛夛紝骞朵慨澶嶅乏渚ф畫鐣欙紙绉讳綅鍓嶅厛鍐欑┖鏍兼竻鑵剧┖鍒楋級 +- OLED 鍋忕Щ骞呭害鍔犲ぇ鍒 0~24px锛5 妗o級锛屾寜鍐呭瀹藉害鑷姩閽充綅涓嶈秺鐣岋紝宸︿晶鑵剧┖鍒楀叏閲忔竻绌