Tus #defines son muy confusos. No estás definiendo una dirección de puerto en absoluto; Estás dando una máscara de bits para tu interruptor. Tampoco muestra si está colocando estos pines de puerto en modo GPIO. El estado predeterminado de PINSEL1 es tener todo en modo GPIO, pero nunca debe hacer suposiciones.
#define SW_MASK 0x3f
#define SW_OFFSET 16
PINSEL1 &= ~(0x00ffffff);
IO1DIR = ~(SW_MASK << SW_OFFSET);
int sw = (IO1PIN >> SW_OFFSET) & SW_MASK;
Este es básicamente el código que tiene, aunque con el código PINSEL1, y está dispuesto a ser un poco menos confuso (para mí).
Jobi tiene razón: es mejor que tenga una resistencia pull-up en P0.20 para que el chip no fuerce estos pines en su función de "puerto de rastreo". Consulte la página 70 del manual del usuario de LPC213x.
Tenga cuidado: ha puesto uno de los conmutadores DIP en P0.20. Aísle ese pin en un reinicio (un pequeño transistor con un temporizador RCD en la base que desconecta el interruptor de P0.20 cuando reinicie la CPU hará el truco), o asegúrese de que nunca deje el interruptor DIP en P0. 20 "encendido" (conectado a tierra) al reiniciar. Mejor aún: simplemente mueva el conmutador a una E / S diferente y vuélvalo a combinar en un código para que su aplicación nunca sepa la diferencia.
por ejemplo si mueve ese interruptor de P0.20 a P0.22, puede recuperar su valor "limpio" de este modo:
#define SW_MASK 0x6f
#define SW_OFFSET 16
PINSEL1 &= ~(0x03ffffff);
IO1DIR = ~(SW_MASK << SW_OFFSET);
int sw;
sw = (IO1PIN >> SW_OFFSET) & SW_MASK;
if(sw & (1 << 6)) sw |= (1 << 4);
sw &= ~(1 << 6);
(hay maneras más astutas de hacer esto, pero estoy tratando de mostrarte lo que está pasando, no ser astuto).
He alterado la máscara para que no lea en P0.20 (cambio de SW_MASK), y que también configure P0.22 en GPIO (cambio de PINSEL1). El bloque que calcula 'sw' establecerá el bit 4 si se establece el bit 6 (esto es P0.20 que se movió a P0.22). Luego "borrará" el bit 6, que ahora está en la posición del bit 4. El valor de su interruptor será correcto.
(la mayoría de los sistemas embebidos no se preocupan por las posiciones reales de los bits, pero puede que sí, por lo que sugerí esto)