从零到一:LCD1602液晶显示实战指南(I2C驱动与自定义字符)

📅 2026/7/16 2:28:01
从零到一:LCD1602液晶显示实战指南(I2C驱动与自定义字符)
1. LCD1602与I2C模块的完美组合第一次用LCD1602做项目时最头疼的就是要接16根线。后来发现I2C转接板这个神器接线数量直接降到4根简直像发现了新大陆。这个蓝色的小板子通过PCF8574T芯片把并行信号转成串行信号不仅省IO口还能避免接错线的尴尬。I2C版本的LCD1602背面多了个4针接口SDA数据线接开发板I2C的SDA引脚SCL时钟线接SCL引脚VCC电源正极5VGND地线实测ESP32开发板的接线方案ESP32引脚 LCD1602 I2C模块 GPIO21 - SDA GPIO22 - SCL 5V - VCC GND - GND安装驱动库时推荐用LiquidCrystal_I2C这个库对新手特别友好。在Arduino IDE里安装时要注意不同厂商的I2C模块地址可能不同常见的有0x27和0x3F两种。如果屏幕没显示可以运行I2C扫描程序确认地址#include Wire.h void setup() { Wire.begin(); Serial.begin(115200); } void loop() { byte error, address; for(address1; address127; address) { Wire.beginTransmission(address); error Wire.endTransmission(); if(error0) { Serial.print(Found at 0x); Serial.println(address,HEX); } } delay(5000); }2. 温湿度项目的实战开发最近用DHT11传感器搭配LCD1602做了个温湿度监测器发现几个实用技巧。首先是显示布局优化16x2的屏幕要合理分配空间第一行Temp: 25.6℃ Hum:60%第二行滚动显示2024-03-15 14:30自定义字符功能在这里特别有用因为标准字符集里没有℃符号。通过CGRAM可以自己设计这个符号byte degreeChar[8] { B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000 }; lcd.createChar(0, degreeChar); // 使用时 lcd.write(byte(0));实际开发中遇到的坑DHT11读取间隔要大于2秒否则数据不准屏幕刷新频率建议500ms一次太频繁会闪烁I2C通信失败时检查上拉电阻通常需要4.7KΩ对比度调节电位器要慢慢调突然变化可能导致花屏完整示例代码#include LiquidCrystal_I2C.h #include DHT.h LiquidCrystal_I2C lcd(0x27,16,2); DHT dht(4, DHT11); void setup() { lcd.init(); lcd.backlight(); dht.begin(); // 创建摄氏度符号 byte customChar[8] { /*同上*/ }; lcd.createChar(0, customChar); } void loop() { float h dht.readHumidity(); float t dht.readTemperature(); lcd.setCursor(0,0); lcd.print(Temp:); lcd.print(t,1); lcd.write(0); // 显示℃ lcd.print( Hum:); lcd.print(h,0); lcd.print(%); delay(1000); }3. 自定义字符设计进阶技巧LCD1602的CGRAM可以存储8个5x8点阵的自定义字符每个字符用8字节表示。设计时有个小窍门用Excel表格来规划点阵。把单元格设置成正方形涂色表示亮起的像素。比如设计一个WiFi信号图标byte wifiChar[8] { B00000, B01110, B10001, B00000, B00100, B01010, B00000, B00100 };实际项目中我常用这些特殊字符电池图标满电/低电量蓝牙符号信号强度条箭头指示符简单进度条存储技巧CGRAM地址从0x40开始每个字符占8字节。写入时要注意lcd.command(0x40); // 从CGRAM首地址开始 for(int i0; i8; i) { lcd.write(wifiChar[i]); } // 使用时 lcd.write(0); // 显示第一个自定义字符一个实用的调试方法先用串口打印出设计好的字符点阵确认无误再烧录void printCharPattern(byte charData[8]) { for(int i0; i8; i) { for(int j4; j0; j--) { Serial.print(bitRead(charData[i], j) ? ■ : □); } Serial.println(); } }4. 项目优化与常见问题解决做了十几个LCD1602项目后总结出这些优化经验电源处理单独给背光供电引脚15、16加装100μF电容滤波防闪烁3.3V系统要确认模块支持否则需要电平转换显示优化使用lcd.noDisplay()临时关闭显示长文本滚动显示时先清空再写入重要信息用lcd.blink()让光标闪烁提示常见故障排查屏幕只亮背光无字符检查I2C地址是否正确调节对比度电位器确认初始化代码已执行显示乱码检查电源电压是否稳定降低I2C通信速率重新插拔接线排除接触不良字符显示不全检查自定义字符是否超出CGRAM容量确认DDRAM地址设置正确避免频繁清屏导致残影一个实用的调试函数可以显示所有内置字符void showAllChars() { for(int i0; i256; i) { lcd.clear(); lcd.print(Code:); lcd.print(i); lcd.setCursor(0,1); lcd.write(i); delay(500); } }最后分享一个项目中的真实案例曾用LCD1602做停车场车位显示系统通过自定义字符设计了车辆图标和数字组合显示效果比纯文字直观很多。关键是要在有限的点阵中抓住特征比如车顶的弧线用三个点表示就能让人一眼认出是车。