还是那一句,实在用不了keil , 但是很多例子和代码都是使用keil写的,而且很多源代码都不是utf8编码的,打开直接乱码,也手动转过一些,多了就烦了,这里把转换逻辑写了一个工具,方便自己,方便大家。
源代码在 https://github.com/aerror2/keil51_to_sdcc
功能特性
🔄 语法转换
- SFR 声明转换:
sfr P0 = 0x80;
→__sfr __at(0x80) P0;
- SBIT 声明转换:
sbit P00 = P0^0;
→__sbit __at(0x80) P00;
- XDATA 声明转换:
*(unsigned char volatile xdata *)
→*(volatile __xdata unsigned char *)
- 中断函数转换:
void func() interrupt 1
→void func() __interrupt(1)
- 位类型转换:
bit
→__bit
- NOP 指令转换:
_nop_()
→__asm NOP __endasm
🧠 智能寄存器地址解析
- 自动从源文件中提取寄存器地址定义
- 支持扫描包含的头文件以获取完整的寄存器映射
- 内置常用 8051 寄存器地址作为后备
- 动态计算位地址 (基址 + 位偏移)
📝 代码增强
- 自动添加 SDCC 兼容的头文件
- 增强中文注释,添加英文翻译
- 处理 NOP 宏定义中的逗号操作符
- 提供详细的转换统计信息
📁 批量处理和项目管理
- 批量转换: 支持整个目录及子目录的递归转换
- Keil 项目解析: 自动解析 .Uv2/.uvproj/.uvprojx 项目文件
- Makefile 生成: 为每个项目生成 SDCC 兼容的 Makefile
- 多项目支持: 为包含多个项目的目录生成独立的 Makefile
- 智能路径处理: 自动调整源文件的相对路径
🔤 编码转换和处理
- 多编码支持: 自动检测和转换 UTF-8、GBK、GB2312、GB18030 等编码
- 编码预处理: 批量将项目文件转换为 UTF-8 编码
- 智能编码检测: 使用 chardet 库进行高精度编码识别
- 备份保护: 转换前自动创建原文件备份
🛡️ 错误处理
- 支持多种文件编码 (UTF-8, GBK, GB2312, GB18030)
- 完善的异常处理和错误报告
- 输入文件验证
- 转换结果验证
安装要求
- Python 3.6+
- chardet (用于文件编码检测)
安装依赖
# 使用 pip 安装依赖
pip install -r requirements.txt
# 或者直接安装 chardet
pip install chardet>=5.0.0
使用方法
基本用法
# 转换单个文件
python3 convert_keil51_to_sdcc.py input_file.h
# 指定输出文件
python3 convert_keil51_to_sdcc.py input_file.h -o output_file.h
批量转换和 Makefile 生成
# 批量转换整个目录(包括子目录)
python3 convert_keil51_to_sdcc.py /path/to/keil_project_directory
# 转换目录并生成 SDCC Makefile
python3 convert_keil51_to_sdcc.py /path/to/keil_project_directory --generate-makefile
# 预处理目录编码(将 GBK/GB2312 转换为 UTF-8)
python3 convert_keil51_to_sdcc.py /path/to/directory --preprocess-encoding