Nebula Pi评测报告IIC 通信AT24C256·

Nebula Pi 开发板评测报告(十一)——IIC通信及AT24C256功能测试

ii11nnocent

ii11nnocent

99 0

IIC总线通信是一种重要的通信方式,使用下列程序可以将写入AT24C256中的数据显示到LCD1602上:

IIC.h:

#ifndef _IIC_H
#define _IIC_H

#include "reg52.h"
#include "intrins.h"


sbit SCL=P0^1;
sbit SDA=P0^2;

void iic_delay(void);
void IIC_Start(void); 	
void IIC_Stop(void);

bit IIC_WriteByte(unsigned char dat);
unsigned char ReadByte(void);
unsigned char ReadByteN(void);

#endif

IIC.c:

#include "IIC.h"


/**********延时函数,i=1时延时1ms**********/
void iic_delay(void)
{
	_nop_();_nop_();_nop_();_nop_();_nop_();
}

/************IIC起始信号************/
void IIC_Start(void)
{
  SCL = 0;
  SDA = 1;		//SCL低电平时拉高SDA,为起始信号做准备
  iic_delay();			
  SCL = 1;		//拉高SCL,延时
  iic_delay();	
  SDA = 0;		//拉低SDA,延时
  iic_delay();	
  SCL = 0;		//拉低SCL
}

/************IIC停止信号*************/
void IIC_Stop(void)
{
  SCL = 0;
  SDA = 0;		//SCL低电平时拉低SDA,为停止信号做准备
  iic_delay();			
  SCL = 1;		//拉高SCL,延时
  iic_delay();	
  SDA = 1;		//拉低SDA,延时
  iic_delay();	
  SCL = 0;		//拉低SCL
}


/*********写入一个字节数据*********/
bit IIC_WriteByte(unsigned char dat)
{
	bit ack;	//位定义应答位
	unsigned char mask;	
	
	for(mask=0x80;mask!=0;mask>>=1)	//高位到低位依次传输
	{
		if( (mask&dat) == 0 )	SDA = 0;
		else									SDA = 1;
		
		iic_delay();
		SCL = 1;
		iic_delay();
		SCL = 0;						//SCL由高变低完成一位的传送		
	}
	
	SDA = 1;
	iic_delay();
	SCL = 1;
	ack = SDA;
	iic_delay();
	SCL = 0;
	
	return ack;	//返回0表示写入成功,返回1表示写入失败	
	
}

/********接收一个字节数据********/
unsigned char ReadByte(void)
{
	unsigned char mask;
	unsigned char dat;

	SDA = 1;	 //将SDA拉高,设置数据线为输入方式
	for(mask=0x80;mask!=0;mask>>=1)
	{
		iic_delay();
		SCL = 1; 				
		if(SDA == 0)	dat&=~mask;		//SDA为0时,dat的对应位清零
		else					dat|=mask;		//SDA不为零时,dat的对应位置1
		iic_delay();
		SCL = 0;
	}
	SDA = 0;
	iic_delay();
	SCL = 1;
	iic_delay();
	SCL = 0;		

	return dat;
}

unsigned char ReadByteN(void)
{
	unsigned char mask;
	unsigned char dat;

	SDA = 1;	 					//将SDA拉高,设置数据线为输入方式
	for(mask=0x80;mask!=0;mask>>=1)
	{
		iic_delay();
		SCL = 1; 				
		if(SDA == 0)	dat&=~mask;		//SDA为0时,dat的对应位清零
		else					dat|=mask;		//SDA不为零时,dat的对应位置1
		iic_delay();
		SCL = 0;
	}
	SDA = 1;
	iic_delay();
	SCL = 1;
	iic_delay();
	SCL = 0;		

	return dat;
}

main.c:

#include "reg52.h"  
#include "LCD1602.H"  
#include "IIC.h"  
#include "AT24CXX.h"  
  
unsigned char t[10];  
unsigned char d;  
  
void delay_ms(unsigned int k)  
{  
    unsigned int i,j;  
    for(i=k;i>0;i--)  
    {  
        for(j=78;j>0;j--);  
    }  
  
}  
  
void main(void)  
{  
    LCD_Init();             //LCD初始化  
    LCD_WriteString(1,1,"AT24C256");  
    WriteByte_AT24C256(0x08,123);           //写数据  
    delay_ms(10);  
    d = ReadByte_AT24C256(0x08);            //读数据  
      
    t[0] = d/100+'0';  
    t[1] = (d/10)%10+'0';  
    t[2] = d%10+'0';                                    //分离数据  
      
    LCD_WriteString(2,1,t);  
          
    while(1)  
    {  
        ;  
    }  
}

所属系列

从当前文章继续阅读它所在合集中的前后内容。

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人