Buenas:
Lo bueno del asm en PIC, qu epuedes hacer la tabla de la verdad como desees y on tardas nada en entenderlo, ejjejejee.
El de arriba es para el PIC16F84A, si quieres hacerlo en otro PIC diferente, solo tienes que cambiar los registros para adaptarlo al PIC correspondiente. Por ahora, PIC de la firma de Microchip.com es el más usado en todas partes y en asm, luego en C, Arduino se extá impulsado, hasta con el AVR. AVR parece ser que lo ha dejado un poco de lado, no tiene el apoyo al 100 % con Arduino, ahora Arduino, le está dando por ARM, el mejor microcontrolador recomendado, al menos la marca. Está así, para que hagan libros de ARM en español, porque PIC hay de sobre y siguen haciéndolo, Arduino tiene muchos también en poco tiempo y habrá más y en español, solo en AVR no hay ninguno en español, una lástima.
Hay otros ejemploe en asm y en C de CCS para PIC16F886.
Ejemplo en ASM:
;Entradas/salidas digitales: Programa combinacional
;
;Según el estado de los interruptores E0 y E1 conectados en RA0 y RA1,
;activar los leds S0-S7 conectados a la puerta B, según la siguiente tabla de la verdad:
;
; RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
; -- -- -- -- -- -- -- -- -- --
; 0 0 1 0 1 0 1 0 1 0
; 0 1 0 1 0 1 0 1 0 1
; 1 0 0 0 0 0 1 1 1 1
; 1 1 1 1 1 1 0 0 0 0
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF ;Palabra 2 de configuración
Temp equ 0x20 ;Variable temporal
org 0x00
goto Inicio ;Vector de reset
org 0x05
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0
bsf STATUS,RP1 ;Selecciona banco 3
clrf ANSEL ;Puerta A digital
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Selecciona banco 1
clrf TRISB ;RB7:RB0 se configuran como salida
movlw b'00111111'
movwf TRISA ;RA5:RA0 se configuran como entrada
bcf STATUS,RP0 ;Selecciona banco 0
Loop: movf PORTA,W ;Leer el puerto de entrada
andlw b'00000011' ;Máscara para las líneas RA0 y RA1
btfsc STATUS,Z ;Están a 00 ?
goto Valen_00 ;Si
movwf Temp ;Almacena el resultado
movlw b'00000001'
subwf Temp,W
btfsc STATUS,Z ;Están a 01 ?
goto Valen_01
movlw b'00000010'
subwf Temp,W
btfsc STATUS,Z ;Están a 10 ?
goto Valen_10
Valen_11 movlw b'11110000'
movwf PORTB ;Salida de 11110000
goto Loop
Valen_00 movlw b'10101010'
movwf PORTB ;Salida de 10101010
goto Loop
Valen_01 movlw b'01010101'
movwf PORTB ;Salida de 01010101
goto Loop
Valen_10 movlw b'00001111'
movwf PORTB ;Salida de 00001111
goto Loop
end ;Fin del programa fuente
Ejemplo en C:
/*
Entradas/salidas digitales: Programa combinacional
Programa combinacional. Según el estado de los interruptores RA0 y RA1, activar
los leds RB0-RB7 conectados a la puerta B, conforme a la siguiente tabla de
la verdad:
RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
--- --- --- --- --- --- --- --- --- ---
0 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 0 0 0 0
*/
#include <16f886.h>
/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */
#fuses NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT //Palabra 1 de configuración
#fuses NOWRT,BORV40 //Palabra 2 de configuración
/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */
#use fast_io (A)
#use fast_io (B)
main()
{
output_b(0x0); //Borra las salidas
setup_adc_ports(NO_ANALOGS); //Puertas A y B digitales
set_tris_a(0x3F); //Puerta A entrada
set_tris_b(0x00); //Puerta B salida
while(1)
{
switch(input_a() & 0b00000011)// Máscara para RA0 y RA1
{
case 0: output_b(0b10101010); break;
case 1: output_b(0b01010101); break;
case 2: output_b(0b00001111); break;
case 3: output_b(0b11110000); break;
default:;
}
}
}
Adaptar estos ejemplos en Arduino no es complicado.
Un saludo.
Edito:
Preguntaba los temas digitales y dejar una entrada analógica, ya que esta es para ajustar las revoluciones RPM del centrifugado de una lavadora. Tiene un potenciómetro.
Estoy en primera fase en buscar muchos ejemplos sobre controlar velocidad del motor y cosas así con Arduino, que ya he encontrado por cierto. Le dejo la Web aquí para tener más información y los que quieran aportar ideas al proyecto.
Por otro lado estoy haciendo un simulador de lavadoras para hacer pruebas mediante códigos con Visual Studio .net. Por ahora tengo hecho esto.
Haré un dibujo que se parezca una lavadora con sus Led y botones con el tiempo.
Poryecto placa labadora:
Saludo.