; En un display de 7 segmentos conectado al Puerto B se visualiza la cantidad leída por
; el Puerto A. Así por ejemplo si por la entrada lee "---0101" en el display visualiza "5".
;
; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F877A
INCLUDE <P16F877A.INC>
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf PORTB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf PORTA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Lee la entrada
andlw b'00001111' ; Máscara para quedarse con el valor de las
; entradas correspondientes al nibble bajo.
call Binario_a_7Segmentos ; Convierte código binario a 7 segmentos del display.
movwf PORTB ; Resultado se visualiza por el puerto de salida.
goto Principal
; Subrutina "Binario_7Segmentos" --------------------------------------------------------
;
Binario_a_7Segmentos ; Tabla para display de 7 segmentos.
addwf PCL,F
Tabla retlw 3Fh ; El código 7 segmentos para el "0".
retlw 06h ; El código 7 segmentos para el "1".
retlw 5Bh ; El código 7 segmentos para el "2".
retlw 4Fh ; El código 7 segmentos para el "3".
retlw 66h ; El código 7 segmentos para el "4".
retlw 6Dh ; El código 7 segmentos para el "5".
retlw 7Dh ; El código 7 segmentos para el "6".
retlw 07h ; El código 7 segmentos para el "7".
retlw 7Fh ; El código 7 segmentos para el "8".
retlw 67h ; El código 7 segmentos para el "9".
retlw 77h ; El código 7 segmentos para el "A".
retlw 7Ch ; El código 7 segmentos para el "B".
retlw 39h ; El código 7 segmentos para el "C".
retlw 5Eh ; El código 7 segmentos para el "D".
retlw 79h ; El código 7 segmentos para el "E".
retlw 71h ; El código 7 segmentos para el "F".
END ; Fin del programa.
de igual forma t dejo un ejemplo en lenguaje de c, el lenguaje que sea de tu agrado
// Contador 0 al 9 cada vez que pulsemos el boton y vuelta a empezar. Tener
// en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida. Cuando agregamos un boton a nuestro circuito hay que tener en cuenta
// que este dispositivo genera 'rebotes' que hay que ser eliminados para
// una correcta visualizacion en el display del digito seleccionado. Esta vez
// la eliminacion de 'los rebotes' se ha realizado mediante software.
// Cuando por el pin A0 del porta se introduce un '0' logico(low), se
// incrementa un digito en el display BCD.
//
// Conexiones: A0 -> boton
// B0 -> a
// B1 -> b
// B2 -> c
// B3 -> d
// BCD:
// d c b a NUM
// 0 0 0 0 0
// 0 0 0 1 1
// 0 0 1 0 2
// 0 0 1 1 3
// 0 1 0 0 4
// 0 1 0 1 5
// 0 1 1 0 6
// 0 1 1 1 7
// 1 0 0 0 8
// 1 0 0 1 9
//////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3)
#use standard_io(A)
///PROGRAMA
void main(void)
{
char i=0; //contador para tabla BCD
int tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001}; //BCD 0-9
set_tris_a(0xFF); //porta como entrada
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
output_b(tabBCD[ i ]); //inicializa displayBCD digito 0
for( ; ; ){ //bucle...
if(!input(PIN_A0)) //¿se ha pulsado el boton?
{
delay_ms(151); //SI -> retardo para evitar los rebotes
i++; //incremento contador indice tabBCD
if(i>9) //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_b(tabBCD[ i ]); //muestra por portb digito 7 segmentos
}
} //...infinito
}