4.3 const 数组查表法(嵌入式常用技巧)
单片机的 CPU 通常很慢(几十到几百 MHz),算复杂数学公式(比如 sin、cos、sqrt)会很费时。
解决方案:提前算好,存成数组,直接查表。
// 比如:把 0°~90° 的 sin 值每隔 1° 算好,存在 Flash 里
// const 的意思是:这个数组不会变,存在单片机的Flash(只读空间)里
const int sin_table[] = {
0, 17, 34, 52, 69, // 0~4°
87, 104, 121, 139, 156, // 5~9°
173, 190, 207, 224, 241, // 10~14°
258, 275, 292, 309, 325, // 15~19°
342, 358, 374, 390, 406, // 20~24°
// ... 一直算到 90°
};
// 使用时——不需要运算,直接查!
int angle = 30;
int sin_30 = sin_table[angle]; // 瞬间拿到结果 ✅
// 而不是:int sin_30 = (int)(sin(30 * 3.14 / 180) * 1000); // 慢 ❌
查表法的好处: - 速度极快(一次数组访问,不需要任何计算) - 代码简单、容易理解 - 非常适合:温度转换表、7段数码管显示码、PWM控制曲线
// 数码管显示:0~9 对应哪几段LED点亮
const unsigned char seg_code[] = {
0x3F, // 0 → 二进制 0011 1111
0x06, // 1 → 0000 0110
0x5B, // 2 → 0101 1011
0x4F, // 3 → 0100 1111
0x66, // 4 → 0110 0110
0x6D, // 5 → 0110 1101
0x7D, // 6 → 0111 1101
0x07, // 7 → 0000 0111
0x7F, // 8 → 0111 1111
0x6F, // 9 → 0110 1111
};
int num = 4;
HAL_GPIO_WritePin(GPIOA, seg_code[num], GPIO_PIN_SET); // 直接显示数字 4