我想在数组中定义引脚和端口 例如这样的东西。
char a[3]={PINA.0,PINB.2,PORTC.4};
/***********************************/
if(a[0]==1) // equal to (PINA.0==1)
//do something
a[2]=1; // equal to PORTC.4=1;
我知道这些代码不正确,希望您的帮助能够写出正确的代码。 我的编译器是CodeVision。 感谢。
答案 0 :(得分:0)
如果编译器允许您使用PINA.0访问引脚,则PINA可能是位域。 Bitfields没有地址。
使用此语句:char a[3]={PINA.0,PINB.2,PORTC.4};
您在数组中存储了值。因此,稍后当您编写a[2]=1
时,您将1写入复制的寄存器值,而不是写入实际寄存器。如果您想获得正确的结果,您应该直接使用寄存器或宏。
//setting PINA.2 = 1
PINA |= 1<< 2;
你也可以定义像
这样的宏#define SET_BIT(PORT_NR,BIT) (PORT_NR |= (1<<BIT))
#define CLEAR_BIT(PORT_NR,BIT) (PORT_NR &= ~(1<<BIT))
并称之为:
SET_BIT(PINA,2);
CLEAR_BIT(PINA,2);
但是,如果您仍想将它们保存到数组中,您可以将指针存储到数组中的函数,然后调用它们。
void setBit(struct port_operation* a,unsigned char bit){
return a->_port |= (1<<bit);
}
void clearBit(struct port_operation* a,unsigned char bit){
return a->_port &= ~(1<<bit);
}
typedef struct _port_operation{
unsigned char _port;
void(*set)(struct _port_operation* ,unsigned char);
void(*clear)(struct _port_operation* ,unsigned char);
}port_operation;
port_operation port_op_a;
port_op_a._port = PORTA;
port_op_a.set = setBit;
port_op_a.clear = clearBit;
port_operation port_op_b = port_op_a;
port_op_b._port = PORTB;
port_operation[2] = {port_op_a,port_op_b};
//set 1 to PORTA bit 1
port_operation[0].set(port_operation[0],1);
答案 1 :(得分:0)
PINx.<PIN_number>
是编译器扩展而非标准。它通常用于嵌入式系统的编译器。此外,C不允许initialize arrays/structs with variables
如果需要将其存储在数组中,请明确指定元素
char a[3];
a[0] = PINA.0;
a[1] = PINB.2;
a[2] = PORTC.4; // why the above is PIN and below is PORT? PIN cannot have multiple bits
或
char a[3];
a[0] = PINA & 0x01;
a[1] = (PINB >> 2) & 0x01;
a[2] = (PORTC >> 4) & 0x01;
答案 2 :(得分:0)
我在pin()函数中写了我的PIN码:
int pin(int c){
bit a;
switch(c){
case 0:
a=PINA.0;
break;
case 1:
a=PINA.1;
break;
case 2:
a=PINA.2;
break;
case 3:
a=PINA.3;
break;
case 4:
a=PINA.4;
break;
case 5:
a=PINA.5;
break;
case 6:
a=PINA.6;
break;
case 7:
a=PINA.7;
break;
}
return a;
}
i = pin(0)等于i = PINA.0