我正在编程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++);
}
}
}
答案 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;
也许您可以解释一下您在这里尝试做什么,以及a
和b
表示什么? (专业提示:使用更有意义的参数名称可能是一个好主意。)
答案 1 :(得分:1)
代码中的错误/问题:
/* enable Port H */
评论应该说enable pull-up Port H
。switchdata = *PORTA;
读取设置为输出的端口没有意义。此外,它不适用于HC12:某些端口有一个输入寄存器,您可以在其中读取引脚状态,但PORTA不是其中之一。static
本地声明。LED_data
应声明为const
,以便在Flash中分配。void hexled (unsigned char a, unsigned char b)
。a
和b
都不是数组,将它们中的任何一个用作数组都没有任何意义。包含[ ]
的所有代码都没有任何意义。你想要实现什么,比特掩盖?volatile
。然而,使用片上定时器是更好的做法。查看ECT或RTI计时器。