Auf Polling zu verzichten und statt dessen über Interrupts zu arbeiten, vermeidet auch nicht das Prellen eines Tasters. Zum ENtprellen muss eine Totzeit eingebaut werden, entweder über Hardware (RC-Glied) oder einfacher über die Software.

Gut geeignet ist z.B., alle 10ms in einem Timer-Interrupt auf die Ports zu schauen. Damit bist du auch unabhängig von externen Interrupts, hast die Entprellung und kommst ohne Warteschleifen aus.

Falls du die Taster selber verdrahtest, können sie auch in einer 3x4-Matrix angeordnet werden, falls Ports gespart werden sollen. Das braucht dann nur 3+4 Ports und nicht 12, muss dann aber anders angesteuert werden, und bei mehrern gleichzeitig gedrückten Tastern geht's auch nicht.