这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 休闲专区 » 我爱工作 » 测试IICLCD过程中的调试记录(一)

共1条 1/1 1 跳转至

测试IICLCD过程中的调试记录(一)

专家
2023-10-17 14:36:33     打赏

  今天,为了测试芯圣单片机的IIC通讯机能,把深藏许久,都已落灰的IIC LCD1602取了出来。仅仅是为了利用HC18M003驱动液晶显示。在记忆里,这块IIC LCD1602好像在51 单片机下就没成功过,但在Arduino下是可以正常驱动的。当时因为种种并不算理由的理由,就放弃了继续在51单片机下的调试。今天,为了调试HC18M003的IIC功能,不得不再次把IIC LCD1602拿了出来,实际上,测试HC18M003的IIC,应该是可以用其它IIC存储芯片来进行的。不过嘛,既然开了头,那就坚持一下吧。

  为了保证程序能正常,我首先使用51单片机编程、测试。程序本身是没有编译错误了,但是已执行起来就不正常了,看代码没有任何毛病。然后转入Arduino环境。在Arduino环境下要是用IIC功能的话,需要安装“LiquidCrystal_I2C”库。

图片2.png

  安装完这个库,无论你是用ESP8266也好,Arduino UNO R3也好,都可以进行测试了。我用的是ESP8266模块,ESP-12E的那种。

图片3.png

与IIC LCD1602的接线方式为:

图片4.png

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单片测试时的波形进行对比,查找问题点。

  以下是采集到的波形:

图片5.png

  这是一个完整的显示周期的波形,包括了指令和字符‘A’的信息。因为使用IIC通讯,因此是可以分析出对应的通信数据的。

在程序的主循环中,只有两条指令:

lcd.setCursor(0,0);

lcd.print("A");

在波形上看,根据IIC的通讯协议,可以看出,好像有四组IIC通讯过程。

第一组:

图片6.png

第二组:

图片7.png

第三组:

图片8.png

第四组:

图片9.png

这四组从波形上看,很相似。

52单片机下运行的波形:

图片10.png

一个周期内的波形为:

图片11.png

放大看:

图片12.png

  可以看到SCL的波形有规律在红色标记的地方,是有残缺的,这个应该是在每发送完一个字节数据的时候,没有设置延迟导致的。波形对应上也不完全一致,说明处理是有问题的。后面我们可以根据正常处理下的波形来调整51单片机程序即可。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]