Debido a que tengo poco tiempo para dedicárselo a la electrónica, voy a ir más rápido y he empezado con C a ver si hago algún proyecto y voy aprendiendo mientras lo realizo.
Aquí pongo el código de un display de 7 segmentos que muestra del 0-9, de A-F y el punto, cambiando cada vez que se pulsa un botón.
;DIRECTIVAS------------------------------------------------------------------------
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;Configuración del grabador
LIST P=16F84A
INCLUDE <P16F84A.INC>
;DECLARACION DE VARIABLES-----------------------------------------------------------
CBLOCK 0X0C
Pos ;Posicion en la tabla.
NumT ;Número de repeticones para el tiempo.
ENDC
#DEFINE Pulsador PORTA,2
;-----------------------------------------------------------------------------------
ORG 0
goto Inicio
Inicio
bsf STATUS,RP0 ;Paso al banco 1
clrf TRISB ;Configuro el puerto B como salida.
movlw b'00000100' ;Configuro RA2 como entrada.
movwf TRISA
movlw b'10000111' ;Desactivo resistencias Pull-Up, Pre-escaler a 256
movwf OPTION_REG
bcf STATUS, RP0 ;Vuelvo al banco 0
movlw b'00000000' ;Desabilito las interrupciones.
movwf INTCON
movlw .0 ;Pongo a 0 Pos
movwf Pos
clrf PORTB ;Me aseguro que este el puerto B apagado.
;Aquí se enciende y apagan los leds.
Principal
btfsc Pulsador ;Compruebo si está pulsado
goto Principal ;No se ha pulsado.
call Timer0_20ms ;Espero 20ms por si es un rebote.
btfsc Pulsador ;Vuelvo a comprobar
goto Principal ;Era un rebote
movfw Pos ;No era un rebote.
call Tabla
movwf PORTB ;Muestro el digito seleccionado en la tabla.
call Timer0_300ms ;Espero para que no salte varios digitos de una pulsación.
incf Pos ;Incremento Pos para visualizar el siguiente digito.
movfw Pos
sublw .17
btfss STATUS,Z ;Compruebo si vale 17
goto Principal
movlw .0 ;Pongo a 0 Pos
movwf Pos
goto Principal
TMR0_20ms EQU .177
TMR0_60ms EQU .21
Timer0_20ms
movlw TMR0_20ms ;Cargo el TMR0 para 20ms
movwf TMR0
bcf INTCON,T0IF ;Resetea el flag de desbordamiento del TMR0
Timer0_Desbordado
btfss INTCON,T0IF ;Compruebo si se ha desbordado el TMR0.
goto Timer0_Desbordado ; No se ha desbordado.
return
Timer0_300ms
movlw .5
movwf NumT ;Realizo 10 repetiones para lograr 300ms aprox.
movlw TMR0_60ms ;Cargo el TMR0 para 60ms
movwf TMR0
Reset_TMR0
bcf INTCON,T0IF ;Resetea el flag de desbordamiento del TMR0
Timer0_Desbordado1
btfss INTCON,T0IF ;Compruebo si se ha desbordado el TMR0.
goto Timer0_Desbordado1 ; No se ha desbordado.
decfsz NumT,F
goto Reset_TMR0
return
Tabla
addwf PCL,F
DT 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,67h,77h,7Ch,39h
DT 5Eh,79h,71h,80h
END
Y Aquí en C
#include <16F84A.h>
#FUSES NOWDT //Deshabilito el wardog
#FUSES XT //Selecciono oscilador de cuarzo
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //No le pongo protección
#use delay(clock=4000000)
#use standard_io(B)
#use standard_io(A)
#define Pulsador PIN_A2
void main()
{
char Pos = 0; //Posicion en la tabla.
int Tabla[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,
0x7C,0x39,0x5E,0x79,0x71,0x80}; //Números 0-9, letras A-F y el punto.
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
port_b_pullups(FALSE);
set_tris_b(0);
set_tris_a(0b00000100);
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
output_b(0); //Me aseguro de que esté apagado el display
do{
if (!input(Pulsador))
{
delay_ms(20);
if (input(Pulsador) == 0)
{
output_b(Tabla[Pos]);
delay_ms(300); ;Espero para poder ver la secuencia correctamente .
Pos++;
if (Pos == 17)
{
Pos = 0; ;Como ha llegado al punto, le indico que vuelva a empezar.
}
}
}
}while(true);
}
Aprovecho para comentaros que pienso pasarme a un pic 18F, aunque parezca precipitado, quiero aprenderlo mientras hago un proyecto que más tarde pondré en la sección correspondiente de este foro, de momento tengo claro que va a tener una pantalla LCD 2x16, unos leds, un par de pulsadores y no se si un display de 7 segmentos, e irá conectado al ordenador por usb. Pero no se cual comprar, si el 18F2550 o el 18F4550 ya que se diferencian muy poco de precio. A ver que me recomendáis vosotros.
Un saludo.