Переопределение ошибок функций в 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.
Другие вопросы по тегам