首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过I2C将数据写入16x2LCD的协议

通过I2C将数据写入16x2LCD的协议
EN

Stack Overflow用户
提问于 2017-06-29 23:32:40
回答 1查看 819关注 0票数 2

我是新的电子,并完成了一个教程,如何操作16x2字符液晶显示器通过I2C在Arduino使用I2C。一切运行良好,但我有一个问题,低水平的互动之间的I2C和液晶显示器。查看库的源代码,我注意到当编写一个4位的咬口(LiquidCrystal_I2C::write4bits)时,该代码首先将该代码写入I2C扩展程序(LiquidCrystal_I2C::expanderWrite),然后在触发启用位时再次写入。为什么第一个expanderWrite是必需的?为什么write4bits不能直接调用pulseEnable (设置了黑灯位)?

我相信这是有原因的,因为我检查了其他库,如RPLCD,并看到了类似的模式。有人能指点我吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-01 01:13:14

数据表中我发现液晶显示要求在通信协议中有特定的定时。在启用行的上升边缘,寄存器选择和读/写行必须已经确定为tsu1 (100 On )。在启用线的下降边缘,数据必须已经为tsu2 (60 On )解决了。通过编写_data,他们也在编写RS和R/W线,因为它们是_data的较低的一小部分。

这篇文章非常彻底地涵盖了这个主题。

代码语言:javascript
运行
复制
//**** From LiquidCrystal_I2C.h
// flags for backlight control
#define LCD_BACKLIGHT 0x08
#define LCD_NOBACKLIGHT 0x00

#define En B00000100  // Enable bit
#define Rw B00000010  // Read/Write bit
#define Rs B00000001  // Register select bit
//              ^--------Backlight bit defined above
//          ^^^^---------Data bits

//**** From LiquidCrystal_I2C.cpp
void LiquidCrystal_I2C::write4bits(uint8_t value) {
    expanderWrite(value);
    pulseEnable(value);
}

void LiquidCrystal_I2C::expanderWrite(uint8_t _data){
    Wire.beginTransmission(_addr);
    Wire.write((int)(_data) | _backlightval);
    Wire.endTransmission();
}

void LiquidCrystal_I2C::pulseEnable(uint8_t _data){
    expanderWrite(_data | En);  // En high
    delayMicroseconds(1);       // enable pulse must be >450ns

    expanderWrite(_data & ~En); // En low
    delayMicroseconds(50);      // commands need > 37us to settle
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44836514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档