PCF8574T和PCF8574AT用出来的那点事
液晶显示一般用到4根或者是8根的数据线,这样的方式会占用较多的I/O口,影响微处理器的使用。PCF8574和PCF8574AT这两种芯片都是IIC芯片,可以将并行的八根数据线转换只用两根数据线进行控制,减少了I/O口的使用,提高所使用微处理器的控制能力,用到的这两种芯片组成的模块是由于不同的批次购买,不能正常的使用,最后才发现的。
通过查这两种芯片的数据手册发现,这两芯片的地址是不一样的:
如上图所示,其中a是PCF8574T的地址,b是PCF8574AT的地址
从购买到的两种的模块来看,默认的A2、A1、A0是不接的状态,处于高电平,这样就可以计算出来PCF8574T的八位二进制数01001110,地址是0x4e;PCF8574AT的八位二进制数01111110,地址是0x7e。
知道了这个区别就很容易的解决原有程序无法控制另一个模块的运行的事情了。将其中的地址宏定义为一个变量,修改宏定义就可以更改所有的变量。
其中还有一个问题是,第二次购买的模块在使用过程中会受电压限制,当电压低于某一个值时,液晶显示会出现不正常,出现乱码,无法按照既定的程序来运行,这个问题在以前的没有遇到…猜测可能是新的模块的问题。
两种模块控制的代码部分:
#include"1602.h"
#include <STC12C5A.H>
#define adress_1602 0x4e //0x7e(PCF8574AT) 0x4e(PCF8574T)
bit ack1;
sbit SCL = P3^7;//定义两个数据端口
sbit SDA = P3^6;
unsigned char LCD_data=0x08;
/*-----------------------------------------------
名称:LCD1602
修改:无
内容:通过标准程序静态显示字符
引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=