这是我的第一个AVR计划。构建时,代码显示错误: “编码”的冲突类型 隐含声明'编码'
我写了以下代码:
#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和其他,但它仍然无法正常工作并显示相同的错误。 请帮帮我。
答案 0 :(得分:2)
隐含声明'编码'
在C
中,函数在被使用(被调用)之前需要声明或定义。
无论
Encode()
main()
函数的定义
Encode()
之前向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);
非常有问题,因为
adc_value
未经初始化使用,会导致undefined behaviour。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);
答案 1 :(得分:0)
第一个错误:
unsigned char adc_value;
float volt = adc_value/1023;
您将adc_value
定义为unsigned 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
这也是非法的。那些用#recents ul {
position:absolute;
}
定义的变量是常量,你不能试图在程序体中更改它们。