AVR定义PINS&数组中的PORT

时间:2014-01-24 06:23:17

标签: c++ c avr

我想在数组中定义引脚和端口 例如这样的东西。

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。 感谢。

3 个答案:

答案 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