2014-09-30 42 views
0

我最近已经开始编程AVR微控制器,以提高我的C编程能力。现在我试图检查两个按钮的状态,我在我的main.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); 

非常感谢您的任何帮助。对不起,如果这些是初学者的问题。这些问题可能已经得到解答,但我没有遇到真正满足我理解的答案。

+0

那么,在你的函数参数列表中,你不能像自由声明那样结合类型。即'uint8_t topPadState,bottomPadState'应该是'uint8_t topPadState,uint8_t bottomPadState'(假设你打算传递两个参数,尽管根据你的使用片段来判断,这不是一个安全的选择)。 – WhozCraig 2014-09-30 06:34:28

+0

我想调用函数padStates,并让它返回包含两个状态的结构。每个状态都是1或0,因此输入uint_8。我以为我可以做一个单行声明,因为我'uint8_t topPadState,bottomPadState'? – 2014-09-30 13:55:30

回答

0

首先,你对.h和.c文件有区别的概念是不正确的。

我编写的一个程序由多个文本文件组成,它们分别编译为对象文件。 对象文件由实现各个函数的代码和全局符号表组成。

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

你秒的问题:你必须确定你的结构:

struct touchPads{ uint8_t topPadState, bottomPadState; }

在.h文件

,才能在主定义类型的变量。

+0

谢谢。我如何调用这个函数并让它返回这个结构,然后让我访问它在main.c文件中返回的内容? – 2014-09-30 13:58:55

+0

主要定义一个变量'struct touchPad Pad'。设置Pad = padStates() – Steen 2014-10-01 07:22:01