0

这是我的第一个 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 作为微控制器。我还添加了更多的库,例如用于地板函数的数学等。我尝试将 int 更改为 unsigned int、unsigned char 等,但它仍然无法正常工作并显示相同的错误。请帮我。

4

2 回答 2

2

“编码”的隐式声明

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

任何一个

  • Encode()函数的定义移到前面main()
  • Encode()在before中添加前向声明main()

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


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

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

问题很大,因为

  1. adc_value未初始化使用,这会导致 未定义的行为
  2. adc_value是类型char。将它除以一个值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);
于 2015-06-02T06:45:03.467 回答
0

第一个错误:

 unsigned char adc_value;
 float volt = adc_value/1023;

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

第二个错误:

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

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

口渴误区:

您尝试为您声明的那些变量分配一些值#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是常量,您不能尝试在程序主体中更改它们。

于 2015-06-02T06:45:11.993 回答