I2C并口-----PCF8574

今天把PCF8574调出来了。  感觉对I2C的认识更加深刻了。对于读字节和写字节的时序及方法都是差不多了  基本上是没差。  起初我还想多了  想着如何看时序图里的读时序操作,还有读时序的最后一个1怎么写始终不确定 (后来发现那个1是不用写的  ) 还有对读和写的时序中数据的处理  直接写地址后就能传输数据了,    尤其是读时序中的数据 输入数据1后 响应再数据4.想了很久。其实不是什么特别的东西  就是要读什么数据直接读就行了。   其实我为什么会有这些问题  其实是一起读写的时候专门把这2个编成了2个函数  弄的我一直在想这2个函数怎么写   其实这是我的思维太固定的原因。  要输入或者输出数据的话  直接在主函数里读或写就行了  而且读和写就是读字节的读写函数。  其实很简单 是自己想复杂了。        以后还要多读读文档  熟悉读文档然后熟悉程序的书写。   以下是我的PCF8574的程序大家可以多多参考下 我是通过调P2口的各个IO口得电平高低来控制  PCF8574上的8个IO口的电平高低  然后再P3口读出来。   另外要说的一点是  你手上拿到的PCF8574 的A0,A1,A2都给低电平的话是可以的而且一般都是这么给的  但地址的高四位如果0x40不行的话  可以试试0x70  因为你手中的8574很有可能是8574A  虽然芯片上写的是8574   以下是我的程序。
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^0;
sbit scl=P1^1;

void init();
void delay()
{
	_nop_();_nop_();
}
/*	
void delay1(uchar m)
{
	uchar x,y;
	for(x=m;x>0;x--)
		for(y=110;y>0;y--);
}				 */

void start()
{
	sda=1;
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	sda=0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	
	scl=0;
	_nop_();
	_nop_();		
}

void stop()
{
	sda=0;
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	sda=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}


void ack()
{
	sda=0;
	_nop_();
	_nop_();
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	scl=0;
	_nop_();
	_nop_();
}	
 /*
void noack()
{
	sda=1;
	_nop_();
	_nop_();
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();

	scl=0;
	_nop_();
	_nop_();
}				*/

void iicwr(uchar dat)
{
	uchar i;
	scl=0;
//	_nop_();
	for(i=0;i<8;i++)
	{
		if(dat&0x80)
		{
			sda=1;
		}
		else
		{
			sda=0;
		}
		dat=dat<<1;
		delay();
		scl=1;
		delay();
		delay();
		_nop_();
		_nop_();
		scl=0;
		delay();
	}
	scl=1;
	_nop_();
	_nop_();
	sda=1;
	_nop_();
	_nop_();
}


uchar iicre()
{
	uchar i,dat;
	scl=0;	
	_nop_();
	_nop_();
	sda=1;
	_nop_();
	_nop_();
	for(i=0;i<8;i++)
	{	 
		scl=0;
		_nop_();
		_nop_(); 
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		scl=1;
		_nop_();
		_nop_();
		dat=dat<<1;
		if(sda)
		{
			dat++;
		}
		scl=0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
	return  dat;	
}
						  
void  init()
{
	sda=1;
	scl=1;
	P2=0Xaa;
}
	  
void main()
{
    init();
//	start();
//	iicwr(0x41);
//	ack();
///	P2=iicre();
//	ack();
/*	iicwr(0x40);
	ack();
	iicwr(0x55);
	ack();	   */

	start();
  	iicwr(0x71);
	ack();
	P3=iicre();
	ack();
	stop();
	while(1);
  
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值