今天,为了测试芯圣单片机的IIC通讯机能,把深藏许久,都已落灰的IIC LCD1602取了出来。仅仅是为了利用HC18M003驱动液晶显示。在记忆里,这块IIC LCD1602好像在51 单片机下就没成功过,但在Arduino下是可以正常驱动的。当时因为种种并不算理由的理由,就放弃了继续在51单片机下的调试。今天,为了调试HC18M003的IIC功能,不得不再次把IIC LCD1602拿了出来,实际上,测试HC18M003的IIC,应该是可以用其它IIC存储芯片来进行的。不过嘛,既然开了头,那就坚持一下吧。
为了保证程序能正常,我首先使用51单片机编程、测试。程序本身是没有编译错误了,但是已执行起来就不正常了,看代码没有任何毛病。然后转入Arduino环境。在Arduino环境下要是用IIC功能的话,需要安装“LiquidCrystal_I2C”库。
安装完这个库,无论你是用ESP8266也好,Arduino UNO R3也好,都可以进行测试了。我用的是ESP8266模块,ESP-12E的那种。
与IIC LCD1602的接线方式为:
SCL接D1,SDA接D2
程序代码为:
#include <Wire.h> #include <LiquidCrystal_I2C.h> //引用I2C库 // 接线方法 // SCL -- D1 // SDA -- D2 // VCC - 5V // GND //设置LCD1602设备地址,这里的地址是0x3F,一般是0x20,或者0x27,具体看模块手册 LiquidCrystal_I2C lcd(0x27,16,2); void setup() { lcd.init(); // 初始化LCD lcd.backlight(); //设置LCD背景等亮 } void loop() { lcd.setCursor(0,0); lcd.print("A"); delay(10); }
特别说明一下,为了追踪波形,特意只是让LCD周期显示字符‘A’,这样可以和51单片测试时的波形进行对比,查找问题点。
以下是采集到的波形:
这是一个完整的显示周期的波形,包括了指令和字符‘A’的信息。因为使用IIC通讯,因此是可以分析出对应的通信数据的。
在程序的主循环中,只有两条指令:
lcd.setCursor(0,0);
lcd.print("A");
在波形上看,根据IIC的通讯协议,可以看出,好像有四组IIC通讯过程。
第一组:
第二组:
第三组:
第四组:
这四组从波形上看,很相似。
52单片机下运行的波形:
一个周期内的波形为:
放大看:
可以看到SCL的波形有规律在红色标记的地方,是有残缺的,这个应该是在每发送完一个字节数据的时候,没有设置延迟导致的。波形对应上也不完全一致,说明处理是有问题的。后面我们可以根据正常处理下的波形来调整51单片机程序即可。