Hi Daniel,

sowas macht man am besten mit einer Lookup-Tabelle. Du übergibst der Tabelle die Nummer deines Bits (0..19) und sie liefert dir den PORT bzw. den PIN der angesteuert werden muss.
Dann brauchst du noch eine Methode die PORT, PIN und einen Wahrheitswert übergeben bekommt und den Pin entsprechend ein oder ausschaltet.
Für deinen konkreten Fall könnte es so aussehen:

Code:
//uint32_t_Auf_Ports_mappen.c
#include <avr/io.h>


#define ARRAY_LENGTH 20


uint8_t Port_Mask[ARRAY_LENGTH] = {
    &PORTA, &PORTA, &PORTA, &PORTA, &PORTA, &PORTA, &PORTA, &PORTA, 
    &PORTC, &PORTC, 
    &PORTD, &PORTD, &PORTD, &PORTD, &PORTD,
    &PORTC, &PORTC, &PORTC, &PORTC, &PORTC
};


uint8_t Pin_Mask[ARRAY_LENGTH] = {
    PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0,
    PC6, PC5,
    PD7, PD6, PD5, PD4, PD3,
    PC4, PC3, PC2, PC1, PC0
};


uint32_t Potenz_Zahlen[ARRAY_LENGTH] = {
    1,2,4,8,16,32,64,128,256,512,1024,
    2048,4096,8192,16384,32768,65536,131072,262144,524288
};




int main(void) {
    DDRA = 0xFF;
    DDRC = 0xFF;
    DDRD = 0xFF;
    
    uint32_t z = Potenz_Zahlen[2]| Potenz_Zahlen[7] | Potenz_Zahlen[11]; // schaltet bit 2,7 und 11 ein also PORTA.5 , PORTA.7 und PORTD.6

    SET_PORTS(z);
}




void SET_PORTS(uint32_t x){
    for(uint8_t i = 0; i< ARRAY_LENGTH; i++){
        BIT_BOOL_SET(Port_Mask[i], Pin_Mask[i], x & Potenz_Zahlen[i]); // von x bleibt nur das i-te Bit unmaskiert, 
                                                                                                // danach ist das int entweder 0 und das Bit muss gelöscht werden 
                                                                                                // oder > 0 und dann wird es gesetzt  
    }    
}


inline void BIT_BOOL_SET(volatile uint8_t *target, uint8_t bit, uint32_t b){
    if (b>0){
        BIT_SET(target, bit);        
    }else{
        BIT_CLEAR(target, bit);
    }
}




inline void BIT_SET(volatile uint8_t *target, uint8_t bit){
    *target |= (1<<bit);
}




inline void BIT_CLEAR(volatile uint8_t *target, uint8_t bit){
    *target &= ~(1<<bit);
}
Die wichtige Methode ist hier SET_PORTS der du einen 32-Bit int übergibst die setzt dann die Pins entsprechend in der Reihenfolge wie sie in Port_Mask und Pin_Mask aufgelistet sind.
Das Array Potenz_Zahlen ist nur eine Hilfe um ein bestimmtes Bit in einem Int zu maskieren.

Ich weiß zwar nicht welchen Chip du verwendest und welche Programmiersprache, aber vll hilft es dir trotzdem^^


Gruß Martin