今天,为了测试芯圣单片机的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单片机程序即可。
我要赚赏金
