重新声明C(微控制器)中的功能错误

时间:2015-11-13 09:09:38

标签: c embedded microcontroller 68hc12

我正在编程HC6812微控制器,我需要在C中使用2个函数:

  • 关闭端口B上的LED

  • 读取PTH(端口H)上的开关输入位0-4

  • 在端口A的7段显示屏上显示开关值。

  • 点亮端口B上的所有LED指示灯,持续0-31秒。

  • 最后关闭B口的所有LED。

我的两个函数是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 个答案:

答案 0 :(得分:1)

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;

也许您可以解释一下您在这里尝试做什么,以及ab表示什么? (专业提示:使用更有意义的参数名称可能是一个好主意。)

答案 1 :(得分:1)

代码中的错误/问题:

  • /* enable Port H */评论应该说enable pull-up Port H
  • switchdata = *PORTA;读取设置为输出的端口没有意义。此外,它不适用于HC12:某些端口有一个输入寄存器,您可以在其中读取引脚状态,但PORTA不是其中之一。
  • 您正在使用许多全局变量,这些变量应该在main()或static本地声明。
  • LED_data应声明为const,以便在Flash中分配。
  • 你是从main()返回的,这在像这样的独立实现中没有任何意义。它会导致程序崩溃。
  • 什么是软件中断以及处理的位置?如果未处理,您的程序将崩溃。
  • C中函数定义的语法应为void hexled (unsigned char a, unsigned char b)
  • ab都不是数组,将它们中的任何一个用作数组都没有任何意义。包含[ ]的所有代码都没有任何意义。你想要实现什么,比特掩盖?
  • 您似乎正在阅读切换但未实现信号去抖动,因此与切换相关的程序行为将是随机的。
  • 您的等待功能可能无能为力并得到优化。至少,您需要将所有循环迭代器变量声明为volatile。然而,使用片上定时器是更好的做法。查看ECT或RTI计时器。