If you're writing C code for 51 microcontrollers or STM32 and want consistent embedded style, this handles the grunt work. It generates project structures, driver templates for peripherals like LCD1602 and DS1302, and reformats code to match patterns extracted from 302 source files in a popular Chinese embedded C textbook. Defaults to snake_case naming but switches to camelCase if you ask. The real value is in the specifics: it knows timer compensation tricks, interrupt flag patterns, and key debouncing with shift registers. Best for educational projects or small bare-metal firmware where you want readable, consistent code without fighting style decisions every time you add a UART driver.
npx -y skills add plugins-world/pw-skills --skill pw-embedded-c-style --agent claude-codeInstalls into .claude/skills of the current project.
嵌入式 C 代码风格助手, 基于《手把手教你学51单片机》302 个 .c 文件和 66 个 .h 文件的代码风格分析。
默认命名风格: 蛇形命名 (snake_case)
默认命名风格: 蛇形命名 (snake_case)
如需使用驼峰命名,请在指令中明确说明 "使用驼峰命名"。
# 基础示例 (默认蛇形命名)
/pw-embedded-c-style 创建一个 LED 闪烁的项目
# 带外设的项目
/pw-embedded-c-style 创建一个带 LCD1602 显示和按键输入的项目
# 指定芯片
/pw-embedded-c-style 为 STM32F103 创建一个串口通信项目
# 明确指定使用驼峰命名
/pw-embedded-c-style 使用驼峰命名创建一个定时器项目
# 优化代码风格 (默认蛇形命名)
/pw-embedded-c-style 帮我优化这段按键扫描代码
# 重构模块
/pw-embedded-c-style 将这段代码重构为独立的驱动模块
# 添加注释
/pw-embedded-c-style 为这段定时器配置代码添加规范注释
# 使用驼峰命名优化
/pw-embedded-c-style 使用驼峰命名优化这段代码
# 生成特定外设驱动
/pw-embedded-c-style 生成 DS1302 实时时钟驱动模板
# 生成通信协议
/pw-embedded-c-style 生成串口通信的收发缓冲区实现
默认风格: 蛇形命名 (snake_case)
// 函数: 蛇形命名
void config_timer0(unsigned int ms);
void lcd_write_cmd(unsigned char cmd);
void init_ds1302(void);
// 变量: 蛇形命名
unsigned char flag_500ms = 0;
unsigned char cnt_rxd = 0;
// 宏/常量: 全大写下划线
#define SYS_MCLK (11059200/12)
#define LCD1602_RS P1^0
// sbit: 全大写或蛇形
sbit LED = P0^0;
sbit EN_LED = P1^4;
备选风格: 驼峰命名 (camelCase/PascalCase)
用户明确要求时使用此风格:
// 函数: 大驼峰
void ConfigTimer0(unsigned int ms);
void LcdWriteCmd(unsigned char cmd);
void InitDS1302(void);
// 变量: 小驼峰
unsigned char flag500ms = 0;
unsigned char cntRxd = 0;
// 宏/常量: 全大写下划线 (相同)
#define SYS_MCLK (11059200/12)
#define LCD1602_RS P1^0
// sbit: 全大写或大驼峰
sbit LED = P0^0;
sbit ENLED = P1^4;
单文件项目
#include <reg52.h>
// 宏定义
// sbit 定义
// 全局变量
// 函数声明
void main() { }
// 函数实现
// 中断函数
多文件项目
config.h - 全局配置 (类型定义、系统参数、IO 定义)
module.h - 模块头文件 (结构体、extern 声明、函数声明)
module.c - 模块实现 (#define _MODULE_C)
main.c - 主程序
定时器配置
void config_timer0(unsigned int ms)
{
unsigned long tmp;
tmp = 11059200 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 12;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
中断服务函数
void interrupt_timer0() interrupt 1
{
static unsigned char tmr_500ms = 0;
TH0 = T0RH;
TL0 = T0RL;
if (++tmr_500ms >= 50)
{
tmr_500ms = 0;
flag_500ms = 1;
}
}
标志位驱动
bit flag_500ms = 0;
// 中断中设置
flag_500ms = 1;
// 主循环检测
while (1)
{
if (flag_500ms)
{
flag_500ms = 0;
// 执行任务
}
}
按键消抖
void key_scan(void)
{
static unsigned char keybuf[4] = {0xFF, 0xFF, 0xFF, 0xFF};
keybuf[i] = (keybuf[i] << 1) | KEY_IN[i];
if ((keybuf[i] & 0x0F) == 0x00)
key_sta[i] = 0; // 稳定按下
}
查表法
unsigned char code led_char[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
P0 = led_char[num];
/* 文件头注释 */
/*
*******************************************************************************
* 文件名称: main.c
* 描 述: 功能描述
* 版本号: v1.0.0
*******************************************************************************
*/
/* 函数注释 */
void lcd_show_str(unsigned char x, unsigned char y,
unsigned char *str, unsigned char len)
// 行内注释
EA = 1; // 使能总中断
config_timer0(10); // 配置 T0 定时 10ms
默认使用蛇形命名 (snake_case):
使用驼峰命名 (camelCase/PascalCase) 的场景:
重要原则: 整个项目必须统一命名风格
问题 1: 定时器不准确
// 错误: 未考虑指令周期补偿
tmp = 65536 - tmp;
// 正确: 加上补偿值
tmp = 65536 - tmp;
tmp = tmp + 12; // 补偿中断响应延迟
问题 2: 按键抖动
// 错误: 直接读取按键状态
if (KEY == 0) { /* 处理 */ }
// 正确: 使用移位寄存器消抖
keybuf = (keybuf << 1) | KEY;
if ((keybuf & 0x0F) == 0x00) { /* 稳定按下 */ }
问题 3: 全局变量冲突
// 错误: 多个模块使用相同变量名
unsigned char flag; // 在多个 .c 文件中定义
// 正确: 使用模块前缀或 static
static unsigned char uart_flag; // 仅本文件可见
extern unsigned char g_system_flag; // 全局共享
基于《手把手教你学51单片机》实际教学项目:
用户需求: "创建一个 LED 每秒闪烁的程序"
助手输出:
用户需求: "创建一个带 LCD1602 显示温度和按键调节的项目"
助手输出:
用户需求: "优化这段串口接收代码"
助手操作:
基于实际教学项目总结, 注重实用性和可读性。默认使用蛇形命名风格, 符合嵌入式 C 项目规范。
cursor/plugins
metabase/metabase
metabase/metabase
telagod/code-abyss
github/awesome-copilot
DietrichGebert/ponytail