Это моя первая программа для 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 и другие, но он все еще не работает и показывает ту же ошибку.
Пожалуйста, помогите мне.
неявное объявление Encode
В 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
используется неинициализированный, что приводит к неопределенное поведение.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);
Первая ошибка:
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
, являются постоянными, и вы не должны пытаться изменить их в теле программы.