STC89C52RC软件IIC驱动

本驱动能产生20-40KHz左右的IIC时钟。(11.0592MHz晶振)

若不加延时,可能出现问题。

接收部分未进行测试,发送已经测试完毕。

my_iic.h

#include "regx52.h"

#define uint16_t  unsigned short int
#define uint8_t unsigned char

sbit SCL=P1^4;
sbit SDA=P1^5;

#define SCL_0 (SCL=0)
#define SCL_1 (SCL=1)

#define SDA_0 (SDA=0)
#define SDA_1 (SDA=1)

//void myiic_init();

void IIC_Master_Transmit_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress,uint8_t Data);
void IIC_Master_Transmit_1Byte(uint8_t Slave_Address,uint8_t Data);
void IIC_Master_Transmit(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length);

uint8_t IIC_Master_Receive_1Byte(uint8_t Slave_Address);
void IIC_Master_Receive(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length);
uint8_t IIC_Master_Receive_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress);

my_iic.c

#include "regx52.h"
#include "my_iic.h"


static void IIC_Delay()
{
	int i=0;
	for (;i<1;i++);
}

static void IIC_Start()
{
	SCL_1;
	SDA_1;
	//IIC_Delay();
	SDA_0;
}

static void IIC_Sr()
{
	
	SCL_0;
	SDA_1;
	IIC_Delay();
	SCL_1;
	IIC_Delay();
	SDA_0;
}

static void IIC_Stop()
{
	SCL_0;
	SDA_0;
	SCL_1;
	SDA_0;
	SDA_1;
}


static void IIC_Send(uint8_t Data)
{
	int i=0;
	for (i;i<8;i++)
	{
		SCL_0;
		IIC_Delay();
		if (Data&0x80)
			SDA_1;
		else
			SDA_0;
		SCL_1;
		Data=Data<<1;
	}
}

static uint8_t IIC_Receive(void)
{
	int i,Receive_Data=0;
	
	for(i=0;i<8;i++)
	{
		SCL_0;
		IIC_Delay();
		SCL_1;
		if (SDA==1)
			Receive_Data|=1;
		else 
			Receive_Data|=0;
		Receive_Data<<1;
	}
	return Receive_Data;
}

static void IIC_Wait_Ack(void)
{
	#ifdef IIC_DEBUG
	
	SCL_0;
	IIC_Delay();
	SDA_0;
	SCL_1;
	IIC_Delay();
	#else
	uint8_t i=0;
	SCL_0;
	IIC_Delay();
	SCL_1;
	while (SDA!=0)
	{
		i++;
		if (i==255)
		{
			break;
		}
	}
	#endif
}

static void IIC_Ack(uint8_t Status)
{
	
	SCL_0;
	if (Status!=0)
		SDA_0;
	else
		SDA_1;
	SCL_1;
	IIC_Delay();
	SCL_0;
	
}



void IIC_Master_Transmit_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress,uint8_t Data)
{
	IIC_Start();
	IIC_Send(Slave_Address);
	IIC_Wait_Ack();
	IIC_Send(MemAddress);
	IIC_Wait_Ack();
	IIC_Send(Data);
	IIC_Wait_Ack();
	IIC_Stop();
}
void IIC_Master_Transmit_1Byte(uint8_t Slave_Address,uint8_t Data)
{
	IIC_Start();
	IIC_Send(Slave_Address);
	IIC_Wait_Ack();
	IIC_Send(Data);
	IIC_Wait_Ack();
	IIC_Stop();
	
}

void IIC_Master_Transmit(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length)
{
	IIC_Start();
	IIC_Send(Slave_Address);
	IIC_Wait_Ack();
	IIC_Send(MemAddress);
	IIC_Wait_Ack();
	while(length--)
	{
		IIC_Send(*Data++);
		IIC_Wait_Ack();
	}
	IIC_Stop();
	
}

uint8_t IIC_Master_Receive_1Byte(uint8_t Slave_Address_r)
{
	uint8_t Data_Temp=0;
	
	IIC_Start();
	IIC_Send(Slave_Address_r|0x01);
	IIC_Wait_Ack();
	Data_Temp=IIC_Receive();
	IIC_Ack(0);
	IIC_Stop();
	return Data_Temp;
}


void IIC_Master_Receive(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length)
{
	IIC_Start();
	IIC_Send(Slave_Address);
	IIC_Wait_Ack();
	IIC_Send(MemAddress);
	IIC_Wait_Ack();
	IIC_Sr();
	IIC_Send(Slave_Address|0x01);
	IIC_Wait_Ack();
	while (length--)
	{
		*Data++=IIC_Receive();
		if (length!=0)
			IIC_Ack(1);
		else 
			IIC_Ack(0);
		
	}
	IIC_Stop();
}

uint8_t IIC_Master_Receive_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress)
{
	uint8_t Data_Temp=0;
	IIC_Start();
	IIC_Send(Slave_Address);
	IIC_Wait_Ack();
	IIC_Send(MemAddress);
	IIC_Wait_Ack();
	IIC_Sr();
	IIC_Send(Slave_Address|0x01);
	IIC_Wait_Ack();
	Data_Temp=IIC_Receive();
	IIC_Ack(0);
	IIC_Stop();
	return Data_Temp;
}

### 回答1: STC89C52是一款广泛应用的8位单片机,它具有丰富的外设资源。如果要驱动四脚IIC的OLED显示屏,可以按照以下步骤进行操作: 首先,需要连接STC89C52IIC总线引脚到OLED的SCL和SDA引脚上。SCL引脚用于时钟信号,SDA引脚用于数据信号传输。 在编程方面,需要引入IIC驱动库,例如使用STC官方提供的IIC库函数。 其次,通过相关的代码初始化IIC总线,在STC89C52的头文件中设置相应的寄存器和引脚。 然后,在主程序中编写具体的驱动代码。首先发送OLED显示屏的启动信号,然后通过IIC总线发送指令或数据到OLED屏幕。 在发送数据之前,需要将OLED屏幕的地址发送给IIC总线,可以通过手册或者规格表查找到正确的地址。 在发送指令或数据后,可以选择停止信号或继续发送其他指令或数据。 最后,在循环中不断地更新OLED屏幕的显示内容,可以通过设置每个像素点的亮度来显示文字、图形等。 需要注意的是,具体的驱动方法和代码可能会因为OLED屏幕的型号和制造商而有所不同,所以在编写代码之前,最好查看相关的开发文档和示例代码。 总之,通过STC89C52IIC总线和相应的驱动代码,可以成功驱动四脚IIC的OLED显示屏,并实现各种显示效果。 ### 回答2: STC89C52是一种常用的单片机,而IIC(Inter-Integrated Circuit)是一种串行总线通信协议,经常用于连接微控制器和外部设备。而OLED则是一种有机发光二极管显示技术,具有高对比度、快速响应和低功耗等特点。 要驱动四脚IIC的OLED,我们首先需要连接STC89C52和OLED模块。在STC89C52上,我们需要配置IIC的引脚为SCL(时钟线)和SDA(数据线),然后将其分别连接到OLED模块的对应引脚。同时,还需要给OLED模块供电。 接下来,需要编写程序来控制STC89C52通过IIC协议与OLED进行通信。首先,我们需要通过IIC协议发送控制指令给OLED,包括设置OLED对应的初始化参数和显示选项等。然后,我们可以通过IIC协议发送数据给OLED,实现想要显示的内容,比如文字、图形等。 具体操作过程如下: 1. 配置STC89C52的引脚为IIC功能,并初始化IIC协议。 2. 配置OLED模块,并发送初始化参数和显示选项给OLED。 3. 根据需求,通过IIC协议向OLED发送需要显示的数据。 4. 刷新屏幕,使得OLED显示更新的内容。 通过以上步骤,我们可以实现STC89C52对四脚IIC的OLED的驱动。随着技术的发展,OLED显示技术在各个领域得到广泛应用,比如智能手表、智能手机等。通过掌握STC89C52IIC协议的应用,我们可以开发出更多有创意和实用性的应用。 ### 回答3: STC89C52是一种51系列的单片机,它可以通过I2C(Inter-Integrated Circuit,即IIC)总线驱动OLED(Organic Light-Emitting Diode)显示屏。 首先,我们需要将STC89C52与OLED之间建立有效的I2C通信连接。STC89C52的硬件I2C模块包含SCL(时钟线)和SDA(数据线)两条线路,用于与OLED进行通信。 我们需要先配置STC89C52的I2C模块。通过设置合适的寄存器值,我们可以指定I2C总线的速度、从机地址等参数。然后,我们设计算法来发送数据和命令,实现向OLED发送显示内容。 接下来,将STM89C52连接到OLED的SCL和SDA引脚。SCL与OLED的时钟引脚连接,SDA与OLED的数据引脚连接。这样,STC89C52就可以通过I2C总线与OLED进行通信了。 然后,我们需要编写相应的程序代码来控制STC89C52。通过调用正确的库函数,我们可以发送命令和数据给OLED。例如,我们可以使用库函数向OLED发送显示文本、图像等。 最后,我们需要调试和测试我们的代码。通过在STC89C52上加载程序,并观察OLED是否正确显示内容,我们可以验证驱动是否成功。如果有任何问题,则需要检查硬件连线和程序代码,并进行适当的调整。 总之,通过合理配置STC89C52的I2C模块并编写适当的代码,我们可以顺利驱动四脚I2C的OLED显示屏。这样,我们就可以在STC89C52上通过I2C总线实现图形和文本的显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值