1. LCD12864显示屏基础认知
第一次拿到LCD12864这块屏幕时,我盯着密密麻麻的引脚有点发懵。这块看似简单的液晶屏其实藏着不少门道,它最大特点就是能同时显示128x64个像素点,相当于四行汉字或八行英文字符。市面上常见的有带字库和不带字库两种版本,带字库的型号内置了GB2312标准汉字(约8000多个)和ASCII码,而不带字库的就需要我们自己造字了。
引脚功能是首先要攻克的关卡。以常见的ST7920控制器为例,第15脚PSB就是串并口切换的关键——接高电平选择并行模式,接低电平则切换为串行模式。并行模式下需要占用单片机8个IO口(DB0-DB7),但传输速度快;串行模式只需3个引脚(SID、SCLK、CS),特别适合IO资源紧张的场景。实测下来,在12MHz晶振下,并行模式刷新全屏仅需2ms,而串行模式要15ms左右。
屏幕的供电也很有讲究。VDD接5V电源,V0引脚通过10K电位器调节对比度,背光引脚AVDD和KVSS建议串接限流电阻。有次我忘记接限流电阻,屏幕背光半小时后就明显变暗,这个教训让我养成了看手册必查电气参数的习惯。
2. 通信模式切换实战
2.1 硬件连接差异
并行模式接线就像搭积木,DB0-DB7接P0口,RS、RW、E分别接P2.6-P2.7。注意要加上拉电阻(我用的是4.7K排阻),否则会出现数据乱码。而串行模式就清爽多了:SID接P1.0,SCLK接P1.1,CS接P1.2,PSB引脚必须接地。这里有个坑——有些模块的PSB引脚内部没下拉电阻,需要外部接10K电阻到地,否则会通信失败。
两种模式的初始化代码差异很大。并行模式需要严格按照时序操作:
void LcdWriteCmd(uchar cmd) { RS = 0; // 命令模式 RW = 0; // 写入模式 P0 = cmd; EN = 1; _nop_(); // 延时约500ns EN = 0; }而串行模式则要按bit发送:
void SendByteSPI(uchar dat) { uchar i; CS = 1; for(i=0; i<8; i++) { SID = (dat & 0x80) ? 1 : 0; SCLK = 0; dat <<= 1; SCLK = 1; } }2.2 动态切换技巧
项目中有个需求要在运行时切换通信模式。我的解决方案是:
- 硬件上PSB引脚接单片机IO(如P3.2)
- 切换前发送结束指令0x36
- 拉低PSB保持10ms以上
- 重新初始化串行模式
实测发现切换后第一次通信容易失败,后来在初始化前加了50ms延时就稳定了。如果遇到花屏现象,可以尝试先硬件复位(拉低RESET引脚)。
3. 自定义字库开发全流程
3.1 字模提取实战
用PCtoLCD2003软件提取汉字点阵时,建议选择"阴码+逐列式+顺向"模式,这与ST7920的编码规则匹配。取模设置要选16x16点阵,否则显示会错位。有次我误选了16x15格式,结果显示的文字总是少一行像素。
提取后的字模数据要按特定格式存储:
code uchar HZK16_你[] = { 0x10,0x22,0x64,0x00,0xFE,0x02,0x02,0xF2, 0x12,0x12,0xF2,0x02,0x02,0xFE,0x00,0x00, 0x04,0x04,0xFE,0x01,0xFF,0x40,0x40,0x47, 0x44,0x44,0x47,0x40,0x40,0xFF,0x01,0x01 };注意前16字节是上半部分,后16字节是下半部分。我曾把顺序弄反,导致显示的文字上下颠倒。
3.2 字库存储方案
外部Flash存储是最经济的方案。我用W25Q64芯片存储了1000个常用汉字,通过SPI接口读取。关键是要建立索引表:
typedef struct { char word[3]; // GB2312编码 uint16_t addr; // 在Flash中的地址 } HZK_Index;读取时先查索引表,再定位数据。为了加速查询,我把索引表按汉字编码排序,用二分查找法能将查询时间从平均500us降到50us。
4. 高级显示技巧与优化
4.1 动态效果实现
实现文字滚动要注意缓冲区管理。我的方案是开辟双缓冲:
uchar dispBuf[2][128]; // 双缓冲 bit bufFlag = 0; // 当前使用缓冲区标志 void ScrollText() { bufFlag ^= 1; // 在新缓冲区准备数据 for(uchar i=0; i<127; i++) { dispBuf[bufFlag][i] = dispBuf[!bufFlag][i+1]; } // 从右端补充新字符 dispBuf[bufFlag][127] = GetNextChar(); // 整屏刷新 LcdRefresh(); }配合定时器中断,可以实现平滑的横向滚动效果。垂直滚动则要操作DDRAM的行地址寄存器。
4.2 功耗优化策略
在电池供电设备中,我通过以下措施降低功耗:
- 动态调整刷新率(静止画面用1Hz刷新)
- 关闭背光时先清屏再断电
- 串行模式下将时钟线拉低保持
- 进入休眠模式前发送0x08指令
实测这些措施能让整机功耗从15mA降到3mA。有个项目用纽扣电池供电,通过优化实现了半年以上的续航。