函数的隐式声明和类型冲突 - AVR

Implicit declaration of function and conflicting type - AVR

这是我的第一个 AVR 程序。构建时,代码显示错误: 'Encode' 的类型冲突 'Encode'

的隐式声明

我写了下面的代码:

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
   SegDataDDR = 0xFF;
   SegCntrlDDR = 0xF3;
   SegCntrlPort = 0xF3;
   SegDataPort = 0x00;
   unsigned char adc_value;
   float volt = adc_value/1023;
   int temp = floor(volt*10 + 0.5);

   SegDataPort = Encode(temp1%10);

   //^^^^ implicit declaration of 'Encode' 

   SegCntrlPort = ~0x01;
   SegDataPort = Encode((temp1/10)%10);
   SegCntrlPort = ~0x02;
   SegDataPort = Encode(temp1/100);
   SegCntrlPort = ~0x04;
}

unsigned char Encode(int digit)
{
   unsigned char val;
   switch(digit)
   {
      case 0 : Val = 0b00111111;
      case 1 : val = 0b00000110;

      /// so on till case 9
   }
   return val;
}

我正在使用 ATmega16 作为微控制器。我还添加了更多的库,例如 floor 函数的数学等。我已经尝试将 int 更改为 unsigned int、unsigned char 和其他,但它仍然无法正常工作并显示相同的错误。 请帮助我。

implicit declaration of 'Encode'

C 中,函数需要在使用(调用)之前 声明定义

或者

  • Encode()函数的定义移到main()
  • 之前
  • main()前向Encode()添加前向声明。

也就是说,floor() 是一个函数,在 math.h 中定义并在 math 库中定义。要使用它,您需要在编译时 #include <math.h> 和 link 以及 -lm


关于这里使用的程序逻辑,

unsigned char adc_value;
float volt = adc_value/1023;
int temp = floor(volt*10 + 0.5);

问题很大,因为

  1. adc_value 未初始化使用,导致 undefined behaviour.
  2. adc_valuechar 类型。将其除以 1023 的值将始终得到 0 的结果,因为除法将作为 整数除法 而不会 产生一个float结果本身,如你所料。

我的建议,将该代码块更改为

int adc_value = <some value to initialize>;  //or some input function
float volt = (float)adc_value/1023;          //enforce floating point division
int temp = floor(volt*10 + 0.5);

第一个错误:

 unsigned char adc_value;
 float volt = adc_value/1023;

您将 adc_value 定义为 unsigned char 并在下一行中尝试将其除以 1023 并将结果分配给 float 类型变量。你不能用 C 语言来做这些。 (此外,您没有为 adc_value 分配任何值!它将是零或随机值)

第二个错误:

您的第二个问题是您在 main() 中调用后定义了 Encode 函数。您必须将整个函数移动到 main() 函数之前,或者仅将其原型添加到 main() 函数之前。

即在main()

之前添加unsigned char Encode(int digit);

口渴错误:

您试图将一些值分配给您使用 #define:

声明的那些变量
#define SegDataPort PORTC
#define SegDataPin PINC
#define SegDataDDR DDRC

#define SegCntrlPort PORTD
#define SegCntrlPin PIND
#define SegCntrlDDR DDRD

int main(void)
{
   SegDataDDR = 0xFF;
   SegCntrlDDR = 0xF3;
   SegCntrlPort = 0xF3;
   SegDataPort = 0x00;
   .
   .
   .

这也是违法的。那些用 #define 定义的变量是常量,您不能尝试在程序主体中更改它们。