In primo luogo, quando si lavora con micro-controllore, di solito c'è un modo per specificare il valore degli 8 pin appartengono alla stessa porta in una sola volta.
Si dovrebbe cercare di capirlo dal manuale/scheda tecnica del microcontroller (uC) cercando la sua parola chiave !! Altrimenti troverete un tempo infernale (davvero, non sto scherzando!) Almeno lo ho fatto!) Per cercarlo sparpagliato in ma alcune delle centinaia/mille pagine del manuale/scheda tecnica.
Provate prima questo e dovrebbe essere molto più semplice.
In secondo luogo, in uC, l'assegnazione di pin alto e basso su pin tipicamente non è necessario eseguire funzioni diverse poiché assegnano semplicemente un valore (alto o basso) allo stesso pin.Quindi, quando possibile, dovresti combinare le alte funzioni & in una funzione singola (poiché non so cosa sia all'interno alto & basso, non posso davvero aiutarti ulteriormente, ma dovresti notare questa possibilità per facilitare il tuo compito)
Infine, tuttavia, nel caso in cui non può essere fatto per un motivo o un altro, è possibile semplificare il codice C come questo,
void assignPort(char val, char portBase){
int i = 0;
for (i = 0; i < 8; ++i)
if (val & (1 << i)) //masked your val with shifting 1 to get the current bit
high(portBase + i); //increase your port address by i
else
low(portBase + i);
}
e per chiamare la funzione, è sufficiente fare
assignPort(0x38, 20); //notice the 38 using 0x for hex indicator while 20 is written as it is (assuming 20 is not hex)
Nota che se i tuoi high
e low
funzioni possono essere combinate
void highLowCombined(char pinAddress, char highOrLow) { //highOrLow is simply non-zero (high) or zero (low)
//do something based on pinAddress and highOrLow
}
il vostro compito è molto più facile nel chiamare alte funzioni/bassa e variabile val nel assignPort
sopra in quanto è sufficiente fare in questo modo
void assignPort(char val, char portBase){
int i = 0;
for (i = 0; i < 8; ++i)
highLowCombined(portBase + i, val & (1 << i)); //only one line is needed here!
}
Ora è necessaria solo una riga nel numero for-loop
! Provalo!
Normalmente, tali pin sono in una porta a 8 bit e si esegue 'write_port (port_no, 0x38)'. Come è diversa la tua situazione? –