Ciao, provo a spiegare in attesa che qualcuno possa esprimersi meglio di me.
lo stato di riposo del pin RA3 è il livello logico alto 1.
la funzione while, è una funzione di attesa finchè lo stato della condizione viene verificato.
in questo programma si vuole verificare lo stato del pulsante, se premuto il livello logico dell'ingresso RA3 diventerà 0.
quindi, con il while PORTAbits.RA3 == 1 si attende che il pulsante venga premuto, e il programma resterà bloccato li finchè non viene premuto il pulsante. una volta premuto la condizione non è piu verà perchè il pin viene messo a massa e il livello logico passa a 0. ora (dopo il delay) si accende il led, e resta acceso finchè viene mantenuto premuto il pulsante attraverso la funzione while PORTAbits.RA3 == 0.
quello che forse ti viene più logico è la funzione if, ovvero quella che esegue un azione se la condizione è verificata. in questo caso però il programma diventerebbe:
while (1){
if(PORTAbits.RA3 == 0){
LATAbits.LATA5 = 1;
}
else {
LATAbits.LATA5 = 0;
}
}
ovvero. se il pulsante su RA3 è chiuso (a 0) accendo il led altrimenti spengo il led.
la differenza tra il codice postato da te e questo è che nel tuo codice il programma resta fermo ad attendere che lo stato del pulsante cambi. mentre in questo codice lo stato del pulsante viene continuamente verificato.
se imposti RA3 come input, TRISAbits.TRISA3 = 1, devi collegarlo a VCC attraverso una resistenza da 10k tipicamente, per mantenerlo a stato logico alto 1