/* * IIC.c * * Created on: 2022年03月12日 * Author: User */ #include static void Start1(void); static void Write1(uint8_t Data); static void ACK1(void); static void Stop1(void); static void Delay1us(); //@20.000MHz IIC_t IIC_1 = { Start1, Write1, ACK1, Stop1}; static void Start1(void) { SCL_1 = HIGH; SDA_1 = HIGH; Delay1us(); //@20.000MHz // 1微秒延时 SDA_1 = LOW; //时钟线高电平 拉低数据线以为传输开始 } static void Write1(uint8_t Data) { uint8_t i = 0; SCL_1 = LOW; //拉低时钟线 数据可以变化 Delay1us(); // 1微秒延时 for (i = 0; i < 8; i++) { if (Data & 0x80) SDA_1 = HIGH; else SDA_1 = LOW; Delay1us(); // 1微秒延时 SCL_1 = LOW; Delay1us(); // 1微秒延时 SCL_1 = HIGH; Delay1us(); // 1微秒延时 SCL_1 = LOW; Data <<= 1; } } static void ACK1(void) { // static uint8_t timeout = 0; SCL_1 = 1; Delay1us(); SCL_1 = 0; // while ((SDA_1) || (timeout <= 10)) // { // timeout++; // } Delay1us(); Delay1us(); SCL_1 = 0; } static void Stop1(void) { SCL_1 = 1; SDA_1 = 0; Delay1us(); SDA_1 = 1; //时钟线高电平时 拉高数据线为停止信号 } static void Delay1us() //@20.000MHz { unsigned char i; _nop_(); _nop_(); i = 5; while (--i) ; }