Y para que tome en cuenta ambos pulsadores en la division? Me parece que no entra al ciclo if pero no se porque.... 
el switch si se necesita porque tendria que convertir esos 4 bits que van desde 16 hasta 128 en valores de 1 a 9, no?
Y mi otra duda es como genero el complemento en la resta en caso de que el valor sea negativo, la multiplicacion se realiza bien creo.
en esta parte del código ya obtienes los números de la parte alta y de la parte baja.
...
PD=input_d();
n1=PD&0b00001111;
n2=(PD>>4)&0b00001111;
...
la parte baja creo que esta clara, solo tomas los bits menos significativos y ahí directamente obtienes los valores del 0-9
en cuanto a los siguientes números, al hacer ">>4" estas haciendo un corrimiento a la derecha de 4 posiciones, por ejemplo, si tienes
0b01100000
en la parte alta tienes 0110 que es un 6 en decimal, al hacer el corrimiento lo que haces es recorrer los bits cuatro lugares a la derecha, entonces tu entrada del puerto D queda:
0b00000110
y así ya tienes directamente el número
para la resta puedes hacer:
...
if(n1>n2)res=n1-n2;
else res=n2-n1;
...