c - 引用结构中的变量

标签 c avr atmel atmelstudio

我最近开始对 AVR 微 Controller 进行编程,以此作为提高我的 C 编程能力的一种方式。现在我正在尝试检查两个按钮的状态,这是我在 main.c 文件开头执行的操作。我将它们放入一个单独的 C 文件中,并尝试调用此函数。

我有两个问题:

第一个与头文件和 .c 文件有关。我已经阅读了几个如何编写头文件并链接它们的示例,但这对我来说似乎违反直觉。头文件调用其对应的c文件中的函数,对应的c文件和主文件都包含该头文件。头文件如何调用.c文件中的函数,但c文件必须包含头文件?

第二个问题是关于在结构中引用变量。我已经按照示例创建了一个结构,但我不确定如何在 main.c 文件中调用它。我的代码如下:

这是我的头文件:

//Check_Touch_Inputs.h

#ifndef Check_Touch_Inputs_H_
#define Check_Touch_Inputs_H_

int Check_Touch_Inputs(uint8_t topPadState, bottomPadState);

#endif

这是我对应的C文件:

//Check_Touch_Inputs.c

#include <avr/io.h>
#include "Check_Touch_Inputs.h"

struct touchPads{
    uint8_t topPadState, bottomPadState;
}

struct touch    Pads padStates(){
    struct touchPads result;

    if (PINC & 1<<PC1)
    {
        result.topPadState = 1;
    }
    else
    {
        result.topPadState = 0;
    }

    if (PINC & 1<<PC3)
    {
        result.bottomPadState = 1;
    }
    else
    {
        result.bottomPadState = 0;
    }

    return result;
}

最后,这是我尝试返回主文件中的按钮状态。我知道这是错误的并且失败了:

    uint8_t topPadState = Check_Touch_Inputs(topPadState);
    uint8_t bottomPadState = Check_Touch_Inputs(bottomPadState);

非常感谢您的帮助。抱歉,如果这些是初学者问题。这些问题可能已经有了答案,但我没有找到真正满足我理解的答案。

最佳答案

首先,您关于 .h 和 .c 文件之间存在差异的概念是不正确的。

用 C 编写的程序由许多文本文件组成,这些文本文件被单独编译为对象文件。 对象文件由实现各个函数的代码和全局符号表组成。

为了链接到函数(符号),您必须拥有它的原型(prototype)。由于历史原因,原型(prototype)在 .h 文件中定义,可编译文本放在 .c 文件中。您通常将 .h 包含在相应的 .c 文件中,以检查您的实现是否与原型(prototype)匹配。

你的第二个问题:你必须定义你的结构:

结构触摸板{ uint8_t topPadState,bottomPadState; }

在.h文件中,以便在main中定义该类型的变量。

关于c - 引用结构中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26114154/

相关文章:

c - avr-libc 上的 fprintf() 立即崩溃

C 内存缓冲区破坏微 Controller 内存分配 - Atmel ATxmega

gcc - 一个人如何颠倒 "int"值的低 8 位的顺序并保持高 8 位不变?

检查两个文件是否相同

c# - C++ AVR 附加到 const char *

c - 这两个来自 C if 语句的 MIPS 转换是否等效?

c - 未知传感器值校准

Cortex M0+中断 sleep 后返回线程模式错误位置

c++ - 追踪连接的像素

c - atomic.h 中的操作似乎是非原子的