【问题标题】:redeclaration of function errors in C (microcontroller)C(微控制器)中函数错误的重新声明
【发布时间】:2015-11-13 09:09:37
【问题描述】:

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

  • 关闭端口 B 的 LED

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

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

  • 将端口 B 上的所有 LED 点亮 0-31 秒(由开关设置)。

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

我的两个函数是Hexled(读取 Hex 开关输入并在 7 段上显示)和wait(创建延迟)。

当我编译代码时,我收到 4 个错误:

'pointer expected' 在我的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++);
             } 
         }  
   }

【问题讨论】:

  • 请编辑您的帖子并修正缩进。
  • 没有C/C++语言!

标签: c embedded microcontroller 68hc12


【解决方案1】:

hexled 的函数定义缺少参数类型 - 更改:

void hexled(a,b) //* HEXLED function definition

到:

void hexled(unsigned char a, unsigned char b) //* HEXLED function definition

您尝试在hexled() 中使用switchdata 的方式也有些奇怪。这是一个全局的unsigned char,但是当你这样做时,你正试图像使用数组或指针一样使用它,例如

   *PORTA = switchdata [b] & 0b00010000;

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

【讨论】:

  • 这已经奏效了!是因为在函数定义中我需要显示参数的类型吗?谢谢
  • 是的,你把它写给wait(),但不知怎么写错了hexled()
  • 不过将其声明为数组并没有多大意义。
  • @Lundin:是的,我刚刚更新了答案 - OP 似乎试图在代码的不同点以不同的方式使用 switchdata
  • @PaulR switchdata 是我对端口 H 的输入,并带有掩码 0b00010000 以便仅读取位 0-4,因此位 4 就像一个开/关开关。
【解决方案2】:

代码中的错误/问题:

  • /* 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)
  • ab 都不是数组,将它们中的任何一个用作数组都没有任何意义。您所有包含 [ ] 的代码都没有任何意义。你想达到什么目的,位掩码?
  • 您似乎在读取开关,但没有实现信号去抖动,因此您的与开关相关的程序行为将是随机的。
  • 您的等待函数可能什么都不做并得到优化。至少,您需要将所有循环迭代器变量声明为volatile。然而,更好的做法是使用片上定时器。检查 ECT 或 RTI 计时器。

【讨论】:

  • 我想将端口 A 指定为我从端口 H 的开关输入与我的掩码相加的任何内容。我对包含 [ ] 的所有代码感到非常困惑,您提到的很多观点都非常有帮助,但其他一些我对您在说什么知之甚少。我对 C 微控制器没有太多经验。不过,我很感激你的观点。
猜你喜欢
  • 2010-11-19
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多