完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` 本帖最后由 xble 于 2016-3-4 08:33 编辑 LCD1602液晶屏非常流行,据说最初是HD44780控制器,后来的IC也都与之保持一致。市场上的产品有很多,我使用的是下面的器件。 虽然1602也称之为液晶,不过与目前常用的PC显示器有本质的区别,下图特性介绍表示它TN/STN模式,与之对应的tft模式。
上面是这款芯片的时序图,如果想真正的掌握一款芯片,读懂其时序图是非常重要的途径之一,另外一个就源代码+打印信息,还有一个就是示波器。 图上有很多小的说明:Tc Tpw等等。对照下图我们很容易了解到一些细节,当然LCD1602的时序图还很简单,那么时序图负责的器件会让我们这些软件出身的人看了头疼,毕竟我们自己画板子和上示波器的机会比较少。 接下来就是初始化的步骤如下图。其实图里面已经写的很清楚,要注意下面两点即可: [size=10.5000pt]1.不同的器件初始化流程可能不同; [size=10.5000pt]2.左边最后一步其实一个不定项,可以按照自己的需求修改,这也是新手容易疑惑的地方。
接下来是器件的COMMAND介绍,结合源代码理解这些命令是一个不错的方法。 注意: 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 下面该说说PCF8574,可以简单的理解他就是一个i2c器件,连接CPU和LCD1602. 通过上图我们可以得到其I2C地址:0x27(0100111)。要注意最后那位表示读或者写。=0时代表写操作。 下图是LCD1602和PCF8574的连接示意图:RS is instruction/data register selection. RW is read/write selection. E is enable signal(edge triggering). BL is back light control. D4-D7 are data bits. 下面是源代码和一些疑惑标注。 #include #include "libfahw-pcf8574.h" #include "libfahw-filectl.h" #include "libfahw-i2c.h" #include "includes/i2c-dev.h" #include "common.h" static unsigned char RS = 0x01; //static unsigned char RW = 0x02; static unsigned char En = 0x04; static unsigned char BL = 0x08;任何写状态都设置背光 //写命令和数据后就会把En拉高和拉低,确认其就是LCD的E信号线。 static int pulseEnable(int devFD, unsigned char data) { clearLastError(); if (I2CWriteByte(devFD, (data | En), 0) == -1) { return -1; } usleep(1); if (I2CWriteByte(devFD, (data & ~En), 0) == -1) { return -1; } return 0; } // 写四位指令 EXPORT int pcf8574WriteCmd4(int devFD, unsigned char command) { clearLastError(); if (I2CWriteByte(devFD, command | BL, 0) == -1) { return -1; } if (pulseEnable(devFD, command | BL) == -1) { setLastError("Fail to pulseEnable"); return -1; } return 0; } // 写八位指令 EXPORT int pcf8574WriteCmd8(int devFD, unsigned char command) { clearLastError(); unsigned char command_H = command & 0xf0; unsigned char command_L = (command << 4) & 0xf0; if (pcf8574WriteCmd4(devFD, command_H) == -1) { setLastError("Fail to write cmd high 4bit"); return -1; } if (pcf8574WriteCmd4(devFD, command_L) == -1) { setLastError("Fail to write cmd low 4bit"); return -1; } return 0; } // 写四位数据,RS区分写命令还是写数据。 EXPORT int pcf8574WriteData4(int devFD, unsigned char data) { clearLastError(); if (I2CWriteByte(devFD, (data | RS | BL), 0) == -1) { return -1; } if (pulseEnable(devFD, (data | RS | BL)) == -1) { return -1; } return 0; } // 写八位数据 EXPORT int pcf8574WriteData8(int devFD, unsigned char data) { clearLastError(); unsigned char data_H = data & 0xf0; unsigned char data_L = (data << 4) & 0xf0; if (pcf8574WriteData4(devFD, data_H) == -1) { setLastError("Fail to write dat low 4bit"); return -1; } if (pcf8574WriteData4(devFD, data_L) == -1) { setLastError("Fail to write dat low 4bit"); return -1; } return 0; } EXPORT int pcf8574Init() { clearLastError(); int devFD; if ((devFD = openHW(I2C0_PATH, O_RDWR)) < 0) { setLastError("Fail to open I2C device pcf8574"); return -1; } else { if (setI2CSlave(devFD, PCF8574_ADDRESS) < 0) { setLastError("Fail to set pcf8574 I2C slave address"); closeHW(devFD); return -1; } } return devFD; } EXPORT void pcf8574DeInit(int devFD) { clearLastError(); closeHW(devFD); } // 在第y行第x个显示字符 EXPORT int LCD1602DispChar(int devFD, unsigned char x, unsigned char y, unsigned char data) { clearLastError(); unsigned char addr; if (y == 0) addr = 0x80 + x; else addr = 0xc0 + x; if (pcf8574WriteCmd8(devFD, addr) == -1) { setLastError("Fail to write cmd 8bit"); return -1; } if (pcf8574WriteData8(devFD, data) == -1) { setLastError("Fail to write data 8bit"); return -1; } return 0; } // 在第y行第x个开始写字符串 EXPORT int LCD1602DispStr(int devFD, unsigned char x, unsigned char y, char *str) { clearLastError(); unsigned char addr; addr = ((y + 2) * 0x40) + x; if (pcf8574WriteCmd8(devFD, addr) == -1) { setLastError("Fail to write cmd 8bit"); return -1; } while (*str != ' |