在C中作为指针传递预定义变量

在C中作为指针传递预定义变量,c,pointers,embedded,pic,mplab,C,Pointers,Embedded,Pic,Mplab,我试图用C编写一个PIC程序,它所做的是打开一系列8个LED(如骑士LED照明:D)。我已经创建了电路设计,并用一个简单的c程序进行了测试,该程序可以设置灯光的状态,并且可以正常工作。现在我想简化我的代码 因此,我创建了两个函数,用于延迟和获取LED所需的十六进制值。这两种方法是这样的 #define MAX 8 #define LEFT 1 #define RIGHT 2 #define BOTH 0 void delay_ms(int ms) { while(ms > 0)

我试图用C编写一个PIC程序,它所做的是打开一系列8个LED(如骑士LED照明:D)。我已经创建了电路设计,并用一个简单的c程序进行了测试,该程序可以设置灯光的状态,并且可以正常工作。现在我想简化我的代码

因此,我创建了两个函数,用于延迟和获取LED所需的十六进制值。这两种方法是这样的

#define MAX 8
#define LEFT 1
#define RIGHT 2
#define BOTH 0

void delay_ms(int ms) {
    while(ms > 0)
        ms--;
}

int getHex(int delay, int dir, int *pin) {
    int hex[] = {0x01, 0x02, 0x04, 0x10, 0x20, 0x40, 0x80};

    if (dir == RIGHT) {
        for (int i = 0; i < MAX; i++)
        {
            *pin = hex[i];
            delay_ms(delay);
        }
    } else if( dir == LEFT ) {
        for (int i = MAX - 1; i == 0; i--)
        {
            pin = hex[i];
            delay_ms(delay);
        }
    }
}
我试图做的是将
PORTB
预定义变量作为指向函数的指针传递,以便使用正确的十六进制值设置它。但是当我使用MPLAB IDE编译时,我得到以下警告:

Warning [357] D:\...\main.c; 24.13 illegal conversion of integer to pointer
Warning [357] D:\...\main.c; 37.22 illegal conversion of integer to pointer
当添加程序hex并在Proteus 8中运行时,不会发生任何事情,并出现以下警告

[PIC16 MEMORY]PC=0x03AF. Attempt to write unimplemented memory location 0x0087 with 0x01 ignored
[PIC16 MEMORY]PC=0x03AF. Attempt to write unimplemented memory location 0x0087 with 0x02 ignored
[PIC16 MEMORY]PC=0x03AF. Attempt to write unimplemented memory location 0x0087 with 0x04 ignored

错误中的最终十六进制值与我试图设置为
PORTB
值的十六进制值相对应。我做错了什么。。请提供帮助。

有几种方法可以声明此类预定义寄存器。我不知道Mplab是如何做到的,但最常见的方法是:

#define PORTB (*(volatile uint8_t*)0x1234)
其中0x1234是该寄存器的硬件地址。此宏直接访问寄存器,但左侧的
*
使其成为一个宏,这样您就可以像使用普通变量而不是指针一样使用该宏


如果是这种情况,则需要将
&PORTB
传递给需要指针的函数。

将getHex方法定义更改为此

int getHex(int delay, int dir, int *pin) {
    int hex[] = {0x01, 0x02, 0x04, 0x10, 0x20, 0x40, 0x80};

    if (dir == RIGHT) {
        for (int i = 0; i < MAX; i++)
        {
            *pin = hex[i];
            delay_ms(delay);
        }
    } else if( dir == LEFT ) {
        for (int i = MAX - 1; i == 0; i--)
        {
            *pin = hex[i];
            delay_ms(delay);
        }
    }
}

&42
毫无意义。值没有地址。请显示
PORTB
的定义我在网上找到了它,这将重命名
PORTB
<代码>静态易失性无符号字符LCDOUT@(无符号)&PORTB这是编译器的一些扩展;这不是标准的扩展名
@
非标准扩展名通常表示“将此变量分配到(@)此地址”。
int getHex(int delay, int dir, int *pin) {
    int hex[] = {0x01, 0x02, 0x04, 0x10, 0x20, 0x40, 0x80};

    if (dir == RIGHT) {
        for (int i = 0; i < MAX; i++)
        {
            *pin = hex[i];
            delay_ms(delay);
        }
    } else if( dir == LEFT ) {
        for (int i = MAX - 1; i == 0; i--)
        {
            *pin = hex[i];
            delay_ms(delay);
        }
    }
}
getHex(2000, RIGHT, &PORTB);