STC——IIC外设使用及模拟IIC

1、使用配置流程

IIC协议描述

  • 初始化iic
    将EAXFR(P_SW2最高位)置1
    设置iic脚
    配置I2CCFG寄存器,主机模式使能IIC及速度
    清0 I2CMSST寄存器
    将EAXFR(P_SW2最高位)清0
  • 写、读等

2、相关寄存器

  • 外设端口切换控制寄存器 2
    在这里插入图片描述
  • IIC 配置寄存器
    在这里插入图片描述
  • I 2 C 主机控制寄存器
    在这里插入图片描述在这里插入图片描述
  • I2C 状态寄存器
    在这里插入图片描述
  • I 2 C 数据寄存器
    在这里插入图片描述

3、代码

IIC初始化

void  iic_init(IICN_enum iic_n,uint32 wait_time)
{
	scl_pin = scl_pin;
	sda_pin = sda_pin;
	
    P_SW2 |= 1<<7;	//将EAXFR寄存器置1,这样才能使用特殊功能寄存器为扩展SFR,访问逻辑地址位于 XDATA 区域
	
	P_SW2 &= ~(0x03<<4);	//清除引脚切换位
    switch(iic_n)	
    {
    case IIC_1:
        P_SW2 |= (0x00<<4);	//SCL:P1.5	SDA:P1.4
        break;
    case IIC_2:
        P_SW2 |= (0x01<<4);	//SCL:P2.5	SDA:P2.4
        break;
    case IIC_3:
        P_SW2 |= (0x02<<4);	//SCL:P7.7	SDA:P7.6
        break;
    case IIC_4:
        P_SW2 |= (0x03<<4);	//SCL:P3.2	SDA:P3.3
        break;
    }
	

    I2CCFG |= 1<<6;		//主机模式
    I2CCFG |= 1<<7;		//使能IIC
    I2CCFG |= wait_time;//速度设置为等待wait_time*2+1个时钟
    I2CMSST = 0x00;		//主机状态寄存器
	
	P_SW2 &= ~(1<<7);	
}

4、GPIO模拟IIC

使用模拟IIC,往OLED屏写数据

#include "stc15.h"

// ------------------------------------------------------------
// IO口模拟I2C通信
// SCL接P1^3
// SDA接P1^2
// ------------------------------------------------------------
sbit SCL=P1^3; //串行时钟
sbit SDA=P1^2; //串行数据

#define high 1
#define low 0

//IIC 起始信号
void IIC_Start()
{
   SCL = high;		
   SDA = high;
   SDA = low;
   SCL = low;
}
//IIC 终止信号
void IIC_Stop()
{
   SCL = low;
   SDA = low;
   SCL = high;
   SDA = high;
}
// 通过I2C总线写一个字节
void Write_IIC_Byte(unsigned char IIC_Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)			//发送8次,也就是8位1个字节
	{
		if(IIC_Byte & 0x80)	//判断最高位是0还是1
			SDA=high;					//1就置高电平
		else
			SDA=low;					//0就清0
		SCL=high;						//时钟置1,读取SDA数据
		SCL=low;						//拉低时钟,切换SDA数据,等待发下一位
		IIC_Byte<<=1;				//左移1位,发送第下位
	}
	SDA=1;								//释放数据线,等待低电平应答信号
	SCL=1;								//拉高等待应答信号,
	i=0;
	while((SDA==1)&&(i<250))i++;//等待应答,250个cpu时钟周期
	SCL=0;								//拉低时钟,等待下一次发送
}

/*********************OLED写数据************************************/ 
void OLED_WrDat(unsigned char IIC_Data)
{
	IIC_Start();										//起始信号
	Write_IIC_Byte(0x78);						//OLED默认地址0x78
	Write_IIC_Byte(0x40);			//写数据
	Write_IIC_Byte(IIC_Data);
	IIC_Stop();
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dz小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值