搬运说明:本文是本人在24年4月CSDN上发布的,现全文搬运至博客园,图片水印暂未去除,并删除原CSDN博文。
本文简要说明了带I2C协议的LCD12864屏幕的使用经验与教训,特别是厂家说明书说法有误或未提及的内容。文末也提供一个本人编写的STC89C52单片机读取SHT30温湿度传感器并显示在LCD12864屏幕上的例程,这两个模块都是I2C通信的。
目录
0.概况
1.I2C地址
2.隐藏指令
3.字符串显示指令的结尾问题
4.图片下载器使用
5.使用例程
6.小结
0.概况
X宝上卖带I2C通信的带中文字库的LCD12864液晶屏的店铺很少,源头厂家似乎都是深圳Raylid,型号是RSCG12864B。并且内建Flash,可以长期存储若干张图片(具体多少还没详细测试,至少6张没问题),有一定的可玩性。图片下载需要用到原厂的“图片下载器”,实物图如下。
我买的店铺提供了原厂说明书,他们的技术网站提供了些资料;原厂官网资料也很少,其它的资料基本就没了。在调试使用时遇到不少问题,简要总结以下,和大家分享。
X宝店铺的技术网站(https://www.yuque.com/ultirobot/arduino/fybqqke17ox2rtm9)
厂家官网(http://www.raylid.cn/)
1.I2C地址
说明书第7小节指出这块I2C屏幕支持通过广播地址0x00发送指令,实测也是没问题的。
当时我考虑到I2C总线上挂载众多模块时,广播地址也许会有冲突或者不好使的时候,就拼命想知道器件的唯一地址。问店铺客服,他们也只知道广播地址。后来仔细阅读说明书第7小节关于数据包格式的内容,发现厂家给的图片中提到了器件地址的前5bit都是1,再结合A1、A0两个自定义地址引脚就可以知道完整的I2C地址。出厂时A1=A0=1,因此向I2C LCD屏幕写入指令的地址就是0b1111 1110,也就是0xfe。
2.隐藏指令
使用过程中还发现说明书未提到的隐藏指令:
① 显示出厂预置的版本信息的0x00指令
注意,这里说的是指令,而不是广播地址0x00。也就是说通过I2C总线发送0x00(广播地址) 0x00(指令),即发送2次0x00,屏幕就会以最大亮度显示型号、版本信息,可用于初步判断屏幕好坏。
② 和图片下载有关0xc0 00 0c命令
原厂图片下载器板卡上用了CH340芯片,所以我想它和我另外购买的USB转I2C调试器功能应该差不多。通过逻辑分析仪监测,图片下载器向LCD屏幕传输图片时的关键指令是0xc0 00 0c,这条指令后紧跟着就是1KB×n的图片数据。不接屏幕下载器,用USB转I2C调试器,手动发送这条命令也是可以让LCD进入图片下载模式的。(下图第一行0x13 80是设置屏幕亮度,第二行0xc0 00 0c是启动图片下载指令,从第3行以后的N多行是图片数据,这里的图片数据就是Image2Lcd软件生成bin文件的十六进制数据)
3.字符串显示指令的结尾问题
根据说明书,0x24~0x28是显示ASCII/汉字的指令,这几条命令表示字体大小不同,命令格式均为0x2?后紧跟字符十六进制数据,最后发送一个结尾符号。重点来了,坑爹的中文说明书说每条字符串显示指令以0x0d作为结尾符号。
例如,我从USB转I2C调试器,多次发送显示“ABC”的指令(0xfe 24 41 42 43,多次发送时屏幕光标自动往后移动)。不写结尾符号时,会发现两次之间多了一个$符号,它对应的ASCII码就是0x24,也就是说不写结尾符号,屏幕就一直处于显示字符串的指令中,后续发送的所有命令或数据都将被视为是字符串的组成数据。
如果我发送中文说明书要求的0x0d结尾符号,就会发现两次之间不仅多了一个$符号,还多了一个空格(或者是无法显示的ASCII字符)。一查ASCII码表,0x0d对应的字符就是无法显示的。
最终是查询英文说明书,发现上面写的是以字符串显示指令以0x00结尾!!!一试果然就正常,多次发送时不会有多于符号或空格了。说好的中国人不骗中国人的呀,厂家也太坑了吧!
4.图片下载器使用
这个下载器是脱机下载的,也就是说通过厂家的上位机软件,是把图片数据下载到板卡的存储空间里面了。
上位机传输图片时,可以接OR不接屏幕在下载器上。得按RESET按钮,使下载器进入接收数据的状态,再去点击下载。
下载器脱机使用时也是从USB取电,此时下载器和屏幕连接好,先按RESET,再按ENTER,就开始从下载器向屏幕传输图片数据。原厂说明书没有讲清楚脱机下载步骤。另外根据说明书,下载器的ON/OFF开关不是指打开或关闭下载器,而是批量连续下载和单次下载的选择,批量下载是指有很多片屏幕,都需要下载同样的图片文件;单次下载是指向单块屏幕传输完成图片文件后,ENTER键成为浏览图片的功能键,按一下ENTER,屏幕就循环显示内置Flash中的一张图片,按顺序显示。
5.使用例程
实验案例中,将这块LCD12864屏幕和SHT30温湿度传感器,挂载到同一条I2C总线上,另外还有一块常规并口驱动的LCD1602。在LCD1602上显示温湿度,在I2C LCD12864上显示温度。
调试时发现I2C LCD12864总是显示不正常。一部分原因是上面第3条提到的字符串显示指令结尾的问题,在找到正确的结尾数据后关于字符串的显示基本正常了。除此之外,还有其它未知的错误,导致I2C屏幕有时错误显示出厂信息,屏幕处于最大亮度,而且多余信息不会消除掉,也就是下图所示的样子。结合第2条所述,我猜应该是I2C屏幕从I2C总线上错误地收到了0x00指令,这是显示出厂信息的指令。用逻辑分析仪观察,也确实看到了向I2C LCD屏幕(地址0xfe)写入00命令。最后也不知道怎么的,在主程序中交换了SHT30的初始化函数和I2C LCD的初始化函数,即先初始化I2C LCD,延时一段时间后初始化SHT30,问题似乎就解决了。
另外,本人菜鸟,非电子专业科班,暂时不会画电路原理图,各位如果照着例程做,看程序注释应该能明白接线图。使用的是最常规的STC89C52RC单片机,工作在6T模式下。
6.小结
上面提到的几点仅为本人在实验使用时遇到的波折,仅供各位参考,欢迎讨论指导。关于这块屏幕的中英文说明书、图片下载器说明书、使用例程的源代码文件都打包在这里了。