Macedo: antes de usar los puertos debés configurarlos de acuerdo a tu hard mediante el registro tris.
Pero si luego tu programa requiere cambiar de sentido el pin de un puerto podés cambiar la configuración del tris en cualquier momento.
fuente:
http://www.microchip.com/forums/m569575.aspx http://ww1.microchip.com/downloads/en/devicedoc/70058d.pdfhttp://ww1.microchip.com/downloads/en/appnotes/00234a.pdfhttp://informatica.uv.es/iiguia/SBM/manual.pdf pág 21/22
Con respecto a la forma de configurar los puertos podés usar la forma que más te convenga, a mi me gusta la sintaxis que te detallo más abajo porque me permite visualizar mejor cada pin y lo puedo comentar a la derecha.
así:
TRISAbits.TRISA0=1; // rA0 como entrada - para teclaUp y TeclaDebugger
TRISAbits.TRISA1=1; // rA1 como entrada - para teclaDown
TRISAbits.TRISA2=1; // rA2 como entrada - para teclaSelect
TRISAbits.TRISA3=1; // rA3 como entrada - para teclaBack
PORTB=PORTB & 0x00; // acá se hace una operación and entre PORTB y el valor 0x00 y luego se asigna a PORTB. es una operación a nivel de bit. El and funciona como una máscara o colador que deja pasar los bits que estén en 1. pero como la máscara está en cero (el valor 0x00) no deja pasar nada y pone a todo el puertob en cero.
Te paso ejemplos de Operadores a nivel de bit (bitwise operators)
--------------------------------------------------------------------------------------------------------------
El operador AND "&" compara dos bits; si los dos son 1 el resultado es 1, en otro caso el resultado será 0.
Ejemplo:
c1 = 0x45 --> 01000101
c2 = 0x71 --> 01110001 // fijate que hace de colador
---------------------------
c1 & c2 = 0x41 --> 01000001
--------------------------------------------------------------------------------------------------------------
El operador OR "|" compara dos bits; si cualquiera de los dos bits es 1, entonces el resultado es 1;
en otro caso será 0. Ejemplo:
i1 = 0x47 --> 01000111
i2 = 0x53 --> 01010011
---------------------------
i1 | i2 = 0x57 --> 01010111
--------------------------------------------------------------------------------------------------------------
El operador exclusivo (XOR) "^", da por resultado 1 cuando los dos operandos tienen distinto valor.
Cuando los dos operandos son distintos da 1.-
ej: 1 y 0 =1
0 y 1 =1
Cuando los dos operandos son iguales da 0.-
0 y 0 =0
1 y 1 =0
Ejemplo:
i1 = 0x47 --> 01000111
i2 = 0x53 --> 01010011
---------------------------
i1 ^ i2 = 0x14 --> 00010100
--------------------------------------------------------------------------------------------------------------
El operador de complemento a 1 "~" cambia cada dígito del operando por su opuesto:
si el bit es 1 se cambia por 0 y viceversa
c = 0x45 --> 01000101
----------------------
~c = 0xBA --> 10111010
--------------------------------------------------------------------------------------------------------------
Los operadores de desplazamiento a nivel de bit "<<" y ">>" Desplazan a la izquierda o a la derecha un número
especificado de bits.
En un desplazamiento a la izquierda los bits que sobran por el lado izquierdo se descartan y se rellenan los nuevos
espacios con ceros. De manera análoga pasa con los desplazamientos a la derecha.
Veamos un ejemplo:
c = 0x1C 00011100
c << 1 c = 0x38 00111000
c >> 2 c = 0x07 00000111
Como en binario se trabaja en base dos cada posición de desplazamiento implica dividir o multiplicar por 2
>> divide por 2.
<< multiplica por 2
c = 0x1C 00011100
c << 1 c = 0x38 00111000 multiplica por 2
c >> 2 c = 0x07 00000111 divide 2 veces por 2 (divide por 4)