在C中作为指针传递预定义变量
我试图用C编写一个PIC程序,它所做的是打开一系列8个LED(如骑士LED照明:D)。我已经创建了电路设计,并用一个简单的c程序进行了测试,该程序可以设置灯光的状态,并且可以正常工作。现在我想简化我的代码 因此,我创建了两个函数,用于延迟和获取LED所需的十六进制值。这两种方法是这样的在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)
#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);