digger63 发表于 2026-5-30 20:44:53

字模数据导出到EEPROM,节省程序空间

最近让豆包帮我搞了个Python程序,可以将各个字模数据导出为BIN和HEX文件,然后再上传到STC ISP软件的EEPROM里。

这样可以让程序通过IAP读写函数调用字模数据,这样可以节省几K的程序空间。
运行方法:
dos窗口走到fonts.py文件路径后运行
python .\fonts.py

运行后会提示各字模数组的起始地址和长度。

ISP软件里点击“打开EEPROM文件”按钮,选择font_all.bin或font_all.hex均可。

我程序里的IAP读函数(示例):

uint8 IAP_ReadByte(uint16 addr) {
uint8 dat;
IAP_CONTR = 0x80;// 使能IAP
IAP_TPS = 12;      // 设置等待参数(12MHz)
IAP_CMD = 1;       // 设置IAP读命令
IAP_ADDRH = addr >> 8;
IAP_ADDRL = addr & 0xFF;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
dat = IAP_DATA;
IAP_Idle();
return dat;
}



// 显示标准8x16字符
void OLED_ShowChar(uint8 x, uint8 y, uint8 chr) {
unsigned char c = 0, i = 0;
    unsigned long base_addr;// 32位地址,和你大数字格式保持一致
c = chr - ' ';
base_addr = 0x02C0;

OLED_Set_Pos(x, y);
for (i = 0; i < 8; i++)
    OLED_WR_Byte( IAP_ReadByte(base_addr + (uint16)c * 16 + i), OLED_DATA );
OLED_Set_Pos(x, y + 1);
for (i = 0; i < 8; i++)
      OLED_WR_Byte( IAP_ReadByte(base_addr + (uint16)c * 16 + i + 8), OLED_DATA );
}


在显示某字符函数里先定义
base_addr = 0x02C0;//字模起始地址
然后OLED_WR_Byte( IAP_ReadByte(base_addr + (uint16)c * 16 + i), OLED_DATA );

附上PY程序,里面的字模数组替换为自己需要的就行,注意字模数组要放在程序的两个""" 字符串中间:
"""
字模数组
"""

狂热主宰 发表于 2026-5-30 22:40:51

常用eeprom存储参数

digger63 发表于 2026-6-1 19:18:21

又让豆包改进了一下,将程序与数组分开了,数组名作为命令行参数传递给程序。

使用举例:
python fonts.py oledfont.h 0x0100
程序后面跟字模名称,可以再跟偏移量(可选):

输出文件:

[*]oledfont.hex (EEPROM烧录文件)
[*]oledfont.map (地址对照表)


页: [1]
查看完整版本: 字模数据导出到EEPROM,节省程序空间