Вы находитесь на странице: 1из 3

Un ejemplito mas!!!!

y seguimos machacando los display"s de 7 segmentos de catodo


comun...esta vez el ejemplo consiste en 4 display"s de 7seg mostrar la palabra "hola" e
ir rotandola hacia la izquierda:
////////////////////////////////////////////////////////////////////////////////////
//
VsZeNeR"05
//
21/Agosto/05
//
// Programa: HOLA
// Version: 0.0
//
// Dispositivo: PIC 16F648A
Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.20
Simulador: Proteus 6.7sp3
//
// Notas: Muestra el mensaje de HOLA por cuatro display"s de 7 segmentos
//
multiplexados. El mensaje se va rotando por los display"s hacia la
//
izquierda. Tener en cuenta que hay que poner la directiva NOLVP
//
para que el pin B4 sea de salida.
//
Se utiliza variables locales:
//
* i -> indice tabla 7seg para mostrar 1 7seg
//
* j -> indice tabla 7seg para mostrar 2 7seg
//
* z -> indice tabla 7seg para mostrar 3 7seg
//
* w -> indice tabla 7seg para mostrar 4 7seg
//
* flag -> variable que cuenta 0.5s
//
* var -> ajuste fino para que desborde cada medio segundo.
//
Utilizamos la funcion de interrupcion para actualizar indices de la
//
tabla de 7seg para mostrar la palabra correspondiente en el respectivo
//
7seg, para ello el TMR0 se desborda cada 0.5s, para ello debe ser cargado
//
con 61(equivale a un desbordamiento cada 50ms mas o menos), para obtener
//
un desbordamiento de 0.5s utilizamos una variable(flag) que no entra en
//
la actualizacion de indices hasta transcurrido 0.5s.
// Conexiones:
//
RA0 -> Display 1 7seg
//
RA1 -> Display 2 7seg
//
RA2 -> Display 3 7seg
//
RA3 -> Display 4 7seg
//
RB0 -> a 7seg
//
RB1 -> b 7seg
//
RB2 -> c 7seg
//
RB3 -> d 7seg
//
RB4 -> e 7seg
//
RB5 -> f 7seg
//
RB6 -> g 7seg
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h>
//pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
//ordenes para el programador
#use delay (clock=4000000)
//Fosc=4Mhz
#use standard_io(B)
#use standard_io(A)
char i=0,j=1,z=2,w=3,var=10,flag=0;
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()

//indices para tabla 7 seg

{
if(flag>var){
//ya es 1 segundo?
var--;
//SI -> decremento var...
if(var<18)
var=10;
//...ajuste fino de 1s
flag=0;
//reset flag para contar 1s
i++;
//incrementos...
j++;
z++;
w++;
//...indices para mostrar en 7seg
if(i>3)
//Ha llegado fin tab7seg?
i=0;
//SI -> restaura indice i
if(j>3)
//Ha llegado fin tab7seg?
j=0;
//SI -> restaura indice j
if(z>3)
//Ha llegado fin tab7seg?
z=0;
//SI -> restaura indice z
if(w>3)
//Ha llegado fin tab7seg?
w=0;
//SI -> restaura indice w
}
set_timer0(61);
//reset TMR0
flag++;
//incremento variable flag
}

///PROGRAMA
void main(void)
{
int tab7seg[4]={0x76,0x3F,0x38,0x77};

//7seg H O L A

set_tris_b(0x00);
//portb como salida
set_tris_a(0x00);
//porta como salida
enable_interrupts(INT_TIMER0);
//interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion
TMR0
set_timer0(61);
//carga TMR0
enable_interrupts(GLOBAL);
//activadas interrupciones

do{
//bucle...
output_low(PIN_A0);
//activado...
output_high(PIN_A1);
output_high(PIN_A2);
output_high(PIN_A3);
output_b(tab7seg[ i ]);
//...1 7seg
delay_ms(10);
output_high(PIN_A0);
output_low(PIN_A1);
//activado...
output_high(PIN_A2);
output_high(PIN_A3);
output_b(tab7seg[ j ]);
//...2 7seg
delay_ms(10);
output_high(PIN_A0);
output_high(PIN_A1);
output_low(PIN_A2);
//activado...
output_high(PIN_A3);

output_b(tab7seg[ z ]);
//...3 7seg
delay_ms(10);
output_high(PIN_A0);
output_high(PIN_A1);
output_high(PIN_A2);
output_low(PIN_A3);
//activado...
output_b(tab7seg[ w ]);
//...4 7seg
delay_ms(10);
}while(TRUE);
//...infinito
}

Вам также может понравиться