void customSymbol(uint8_t location, uint8_t charmap[]);void Waveshare_LCD1602::customSymbol(uint8_t location, uint8_t charmap[]) { location &= 0x7; // we only have 8 locations 0-7 command(LCD_SETCGRAMADDR | (location << 3)); uint8_t data[9]; data[0] = 0x40; for(int i=0; i<8; i++) { data[i+1] = charmap[i]; } send(data, 9); }
时间: 2025-06-24 14:34:22 浏览: 10
### customSymbol 函数的功能解释
`customSymbol` 函数的主要目的是在液晶显示屏上定义自定义字符。通常,这类函数会涉及对 LCD 控制器内部 CGRAM(Character Generator RAM)的写入操作。通过向 CGRAM 中写入特定的数据序列,可以定义新的字符形状,并将其显示在屏幕上[^1]。
以下是关于 `customSymbol` 函数及其与数组指针结合使用的具体说明:
---
### 1. **CGRAM 的工作原理**
大多数 LCD 显示屏都配备了一块专门用于存储用户定义字符的内存区域,称为 CGRAM。每种字符占用固定的字节数(通常是 5×8 或 8×8 像素)。为了定义一个新的字符,需要将一组二进制数据依次写入到 CGRAM 中。这组数据描述了新字符每一行像素的状态(亮或灭),从而形成所需的图案[^1]。
例如,如果我们要定义一个简单的箭头符号,可能需要准备如下数据:
```c
uint8_t arrow_data[] = {
0b00000,
0b00100,
0b01110,
0b10101,
0b00100,
0b00100,
0b00100,
0b00100
};
```
这里的每一个字节代表一行像素状态,共八行,形成了一个向上箭头的图案。
---
### 2. **customSymbol 函数的设计**
假设我们有一个名为 `customSymbol` 的函数,其作用是接收两个参数:一个是目标地址偏移量(指定 CGRAM 地址),另一个是指向字符数据的数组指针。下面是该函数的一个伪代码实现示例:
```c
void customSymbol(uint8_t addr, const uint8_t *data) {
lcd.setCGRAMAddress(addr); // 设置当前操作的目标为 CGRAM 并定位至指定地址
for (int i = 0; i < 8; ++i) { // 循环发送八个字节的数据
lcd.write(data[i]); // 将数组中的每个字节逐一写入 CGRAM
}
}
```
在此实现中,`addr` 参数决定了新字符存放在 CGRAM 中的具体位置;而 `data` 则是一个指向包含字符定义数据的数组的指针。通过这种方式,我们可以轻松传递不同的图案数据来生成各种自定义符号[^1]。
---
### 3. **数组指针的作用**
在这个上下文中,数组指针扮演着至关重要的角色。它使得程序能够高效地访问和传输大量连续存储的数据。相比于直接硬编码数值列表或将所有数据复制粘贴到函数体内,使用数组指针不仅提高了可读性和灵活性,还减少了重复劳动。
继续上面的例子,当我们希望在同一屏幕上调用多次 `customSymbol` 来创建多个独特图标时,只需简单更改传入的第二个参数即可完成任务,无需重新编写任何其他部分代码。
---
### 4. **Waveshare_LCD1602 自定义符号代码解析**
对于基于 WaveShare 提供的 LCD1602 屏幕驱动库而言,其实现细节可能会稍有不同,但核心理念保持一致。以下是一段典型的初始化流程及调用方法示范:
#### 初始化阶段
首先确保已经正确配置好硬件连接并完成了基础设置步骤,比如启用背光灯、清除现有内容等动作之后再执行后续命令。
```c
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.begin();
lcd.clear();
uint8_t heart_data[] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
customSymbol(0, heart_data);
}
void loop() {}
```
在这里,我们将心形图案定义好了以后交给 `customSymbol` 处理完毕后就可以随时调用了。
#### 实际应用阶段
一旦某个自定义字符成功注册到了 CGRAM 当中,则可以在正常打印字符串的过程中像对待标准 ASCII 字符那样引用它。只需要记住当初赋予它的编号就好啦!
```c
lcd.setCursor(0, 0);
lcd.print((char)0); // 打印刚才建立的心形记号
```
注意这里强制类型转换成 `(char)` 类型是因为最终还是得按照单字节指令的形式传达给底层去解读哦~
---
### 总结
综上所述,借助于数组指针机制配合恰当编写的辅助工具类 API 接口如 `customSymbol()` ,开发者完全可以随心所欲地构建属于自己的个性化视觉元素出来,极大地增强了项目的趣味性和实用性价值所在.
---
阅读全文
相关推荐














