-3

我正在编写一个 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++);
             } 
         }  
   }
4

2 回答 2

1

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

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

至:

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

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

   *PORTA = switchdata [b] & 0b00010000;

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

于 2015-11-13T09:11:39.423 回答
1

代码中的错误/问题:

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