Переопределение ошибок функций в C (микроконтроллер)
Я программирую микроконтроллер HC6812, и мне нужно использовать 2 функции в C, чтобы:
выключить светодиоды в порту B
Считать входные биты переключателя 0-4 на PTH (порт H)
отображать значение переключателя на 7-сегментном дисплее в порту A.
Зажгите все светодиоды на порте B в течение 0-31 секунд, установленных переключателями.
Наконец выключите все светодиоды в порту B.
Мои две функции Hexled
(чтобы прочитать ввод шестнадцатеричного переключателя и отобразить на 7 сегменте) и wait
(создать задержку) .
Когда я компилирую код, я получаю 4 ошибки:
"Указатель ожидается" встречается дважды в моем Hexled
определение функции
конфликтующие объявления аргументов для функции Hexled
'
'ошибка объявления Hexled
'
Я понимаю, что с функциями в C/C++ нам нужен прототип функции, определение функции и в основном цикле мы вызываем эту функцию. Я не понимаю, что я сделал неправильно, и хотел бы поучиться на этом, я пытался исследовать многочисленные веб-страницы по программированию на C.
#include <stdio.h>
void wait(int);
void hexled (unsigned char,unsigned char);
unsigned char switchdata;
unsigned char a;
unsigned char b;
unsigned char mask;
unsigned char index;
unsigned char index1;
/******************* Declare the port addresses **********************/
unsigned char *PORTA = (unsigned char *)0x0000;
unsigned char *DDRA = (unsigned char *)0x0002;
unsigned char *PORTB = (unsigned char *)0x0001;
unsigned char *DDRB = (unsigned char *)0x0003;
unsigned char *PTH = (unsigned char *)0x0260;
unsigned char *DDRH = (unsigned char *)0x0262;
unsigned char *PERH = (unsigned char *)0x0264;
unsigned char LED_data[16] = {0x3F,
0x6,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x7,
0x7F,
0x6F,
0x77,
0x7C,
0x39,
0x5E,
0x79,
0x71}; // LED output
int main(void)
{
/******************* Set up I/O ports********************************/
*DDRH = 0x00; /* make Port H an input port */
*PERH = 0xFF; /* enable Port H */
*DDRA = 0xFF; /* make Port A an output port */
*DDRB = 0xFF; /* make Port B an output port */
/******************* Main loop ***************************************/
*PORTB = 0xFF;
mask = 0b00001111;
switchdata = *PTH & mask;
switchdata = *PORTA;
index = (switchdata & 0b00010000);
index1 = (switchdata | mask);
hexled(index,index1);
*PORTB = 0X00;
wait(31);
*PORTB = 0xFF;
asm ("swi");
return 0;
}
// ***************************HEX FUNCTION**********************************
void hexled(a,b) //* HEXLED function definition
{
if (a)
{
*PORTA = switchdata [b] & 0b00010000;
}
else
{
*PORTA = switchdata [b] | mask;
}
}
// ***************************DELAY FUNCTION************************************
void wait(int seconds) //*WAIT function defintion
{
int x,y,z;
for (x=0; x<seconds; x++)
{
for (y=0; y<=100; y++)
{
for (z=0; z<=2000; z++);
}
}
}
2 ответа
Ваше определение функции для hexled
отсутствует тип параметра - изменить:
void hexled(a,b) //* HEXLED function definition
чтобы:
void hexled(unsigned char a, unsigned char b) //* HEXLED function definition
Также есть что-то странное в том, как вы пытаетесь использовать switchdata
внутри hexled()
, Это глобальный unsigned char
но вы пытаетесь использовать его как массив или указатель, когда вы делаете, например,
*PORTA = switchdata [b] & 0b00010000;
Может быть, вы можете объяснить, что вы на самом деле пытаетесь сделать здесь, и что a
а также b
означать? (Профессиональный совет: использование более значимых имен параметров может быть хорошей идеей.)
Ошибки / проблемы в вашем коде:
/* enable Port H */
комментарий должен сказатьenable pull-up Port H
,switchdata = *PORTA;
не имеет смысла читать порт, который установлен как выходной. Также он не будет работать на HC12: некоторые порты имеют входной регистр, где вы можете прочитать состояние контактов, но PORTA не является одним из них.- Вы используете множество глобальных переменных, которые должны были быть объявлены локально в main() или как
static
, LED_data
должен быть объявлен какconst
так что он выделяется во флеше.- Вы возвращаетесь из main(), который не имеет никакого смысла в автономной реализации, такой как эта. Это приведет к сбою вашей программы.
- Для чего нужно программное прерывание и где оно обрабатывается? Если оставить не обработанным, ваша программа потерпит крах.
- Синтаксис для определения функции в C должен быть
void hexled (unsigned char a, unsigned char b)
, - ни
a
ниb
являются массивами, и нет никакого смысла использовать любой из них в качестве массивов. Весь ваш код, содержащий[ ]
не имеет никакого смысла. Чего ты хочешь добиться, немного маскируясь? - Похоже, вы читаете переключатели, но не реализуете отбой сигнала, поэтому поведение вашей программы, связанное с переключателями, будет случайным.
- Ваша функция ожидания может ничего не делать и оптимизироваться. Как минимум, вы должны объявить все переменные итератора цикла как
volatile
, Однако лучше использовать встроенные таймеры. Проверьте таймеры ECT или RTI.