#ifndef MAIN_C
时间: 2024-08-29 10:02:21 浏览: 30
#ifndef 是预处理器指令,用于在 C 或 C++ 编程语言中防止宏定义重复。当程序中包含某个头文件(如 "main.c" 中的 "header.h")时,如果该头文件还没有对该标识符 (如 "MAIN_C") 定义过,那么 #ifndef 命令会开启它的内容。一旦这个条件满足(即该标识符未被定义),预处理器会包含头文件内的代码。当再次包含同一个头文件时,因为标识符已经被定义过了,#ifndef 命令将忽略其后的代码,避免多次定义带来的问题。
相关问题
#ifndef _MAIN_C
#ifndef _MAIN_C 是一个条件编译指令,用于在编译过程中判断是否已经定义了 _MAIN_C 宏。如果没有定义,则编译下面的代码块,否则跳过。
这个指令通常用于防止头文件的重复包含,以避免编译错误。在一个程序中,如果多个源文件都包含了同一个头文件,就可能导致重复定义的问题。通过使用条件编译指令,可以确保头文件只被编译一次。
在 C 语言中,通常会在头文件的开头使用 #ifndef _HEADER_H 和 #define _HEADER_H 来定义一个宏,然后在文件的结尾使用 #endif 来结束条件编译块。
#ifndef __IIC_H #define __IIC_H #include "usart.h" //IO·½ÏòÉèÖà #define SDA_IN() {GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=(u32)8<<8;} #define SDA_OUT() {GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=(u32)3<<8;}改为在stm32g070xx单片机的代码
当然,下面是在stm32g070xx单片机的代码:
```c
#ifndef __IIC_H
#define __IIC_H
#include "main.h"
// IIC GPIO定义
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SCL_PORT GPIOB
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_SDA_PORT GPIOB
// IIC读写方向
#define I2C_DIRECTION_TRANSMITTER 0
#define I2C_DIRECTION_RECEIVER 1
// IIC读写返回值
#define I2C_ACK 1
#define I2C_NACK 0
// IIC初始化
void I2C_Init(void);
// IIC开始信号
void I2C_Start(void);
// IIC停止信号
void I2C_Stop(void);
// IIC发送数据
void I2C_SendByte(uint8_t byte);
// IIC接收数据
uint8_t I2C_ReceiveByte(uint8_t ack);
// IIC等待应答信号
uint8_t I2C_WaitAck(void);
// IIC发送应答信号
void I2C_SendAck(uint8_t ack);
// SDA口设置为输入模式
#define SDA_IN() {I2C_SDA_PORT->MODER &= ~(GPIO_MODER_MODE7_Msk);\
I2C_SDA_PORT->MODER |= (GPIO_MODER_MODE7_0);}
// SDA口设置为输出模式
#define SDA_OUT() {I2C_SDA_PORT->MODER &= ~(GPIO_MODER_MODE7_Msk);\
I2C_SDA_PORT->MODER |= (GPIO_MODER_MODE7_0);\
I2C_SDA_PORT->OTYPER &= ~(GPIO_OTYPER_OT7_Msk);}
#endif
```
这段代码包含了IIC通信所需的宏定义和函数声明,同时也包含了GPIO的定义。在初始化函数中,需要初始化IIC的GPIO口为推挽输出模式,并将SCL和SDA口拉高。在发送数据时需要先发送起始信号,然后发送数据,最后发送停止信号。在接收数据时需要等待应答信号,然后接收数据,最后发送应答信号。在SDA_IN和SDA_OUT宏定义中,SDA口的设置也做了相应的修改。