Я хочу определить пины и порты в массиве
например что-то вроде этого.
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.
Благодарю.
Если компилятор позволяет вам получить доступ к выводам с помощью PINA.0, тогда PINA может быть битовым полем. Битовые поля не имеют адресов.
С этим утверждением: 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);
Я написал свои 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
PINx.<PIN_number>
это расширение компилятора и не стандартное. Обычно используется в компиляторах для встроенных систем. Кроме того, C не позволяет инициализировать массивы / структуры переменными
Если вам нужно сохранить его в массиве, явно назначьте элементы
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;