代码:
```css
;;*******************I2C 启动条件*********************;是一个时间段
I2C_START:
BSF PBD,I2C_SDA ;set PB.7位为1
BCF PBD,I2C_SCL ;set PB.6位为0
NOP ;一个指令的周期,如果频率改变就需要增加相应的NOP指令
NOP
NOP
;该开始的时候,SDA和SCL都是的高电平
BSF PBD,I2C_SDA ;拉高电平SDA
NOP
NOP
NOP
NOP
NOP
BSF PBD,I2C_SCL ;拉高电平SCL
NOP
NOP
NOP
NOP
NOP
BCF PBD,I2C_SDA ;连续几个高电平之后,然后I2C_SDA拉低数据总线之后,开始传输
NOP
NOP
NOP
NOP
NOP
BCF PBD,I2C_SCL ;因为SCL的上升沿来检测SDA的电平高低,因此最后需要将的SCL电平拉低,才可以实现的电平检测
RET
;;********************I2C 停止条件*********************
I2C_STOP:
;结束的时候的SCL是高电平,SDA拉高表示结束信号
BCF PBD,I2C_SDA ;首先拉低SDA,持续若5个周期后,
NOP
NOP
NOP
NOP
NOP
BSF PBD,I2C_SCL ;拉高电平SCL5个周期 ;在SCL高电平的时候 进行拉高SDA,并不表示数据
NOP
NOP
NOP
NOP
NOP
BSF PBD,I2C_SDA ;在在SCL高电平的时候,进行拉高SDA,并不表示数据,而是表示的数据停止
NOP
NOP
NOP
NOP
NOP
BCF PBD,I2C_SCL ;拉低SCL线???(我认为应该可以忽略)
RET ;子程序返回指令
说明:
GPB的引脚6和7分别设置为SCL和SDA线,要想传输数据就需要我们通过的软件改变的,这两个线电平的高低来进行数据的传输。由IIc通信的基本知识我们知道,IIC传输分为的起始位、通信位以及结束位。现在我们主要讲一下我对该程序(起始位和结束位)理解。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191030142340736.jpg)
1、起始位:
首先SDA和SCL线初始应**为高电平**,因此刚开始应该分别拉高SDA和SCL的电平。首先拉高SDA有以下两种情况:
(我的理解)SCL是低电平,拉高SDA(上升沿的时候),表示的实际上是一个的1的数据的传输,但是还未检测到开始信号,因此可以判定不是的有效数据。然后拉高SCL线,经过5个周期之后,程序拉低了SDA表示一个开始位。因为数据的触发应该是在SCL为低电平的时候,检测SDA变化(上升沿或者下降沿),上升沿表示的1,下降沿表示0。
2、结束位:
数据的结束的时候应该是**SCL是高电平**,SDA从低电平上拉为高电平:
首相拉低SDA电平,然后的拉高SCL电平,在SCL为高电平时候,拉低或拉高的SDA不表示数据,因此在SCL为高电平的时拉高SDA表示的数据的结束。