Sie sind auf Seite 1von 4

MCE Starter Kit Student Advanced Practicas en C

Practica 6 Contador 2 digitos



Ejercicio 6: Realizar un contador decimal de 2 dgitos (valores de 00 a 99) en
donde su cuenta se incremente cada vez que se oprime el pulsador RA2.

Solucion:

/ * I ncl udes */
#i ncl ude " p18f 4620. h"
#i ncl ude " del ays. h"

/ * Def i ni ci ones */
#def i ne Swi t ch PORTAbi t s. RA2

/ * Var i abl es */
#pr agma udat a / / decl ar amos var i abl es est at i cas si n i ni ci al i zar
unsi gned char Uni dad; / / var i abl e de 8 bi t s si n si gno
unsi gned char Decena;
unsi gned char Pr eEst ado; / / guar damos el est ado del pul sador

/ * Decl ar aci ones */
/ / decl ar amos dat os const ant es en memor i a de pr ogr ama comenzando en l a
/ / di r ecci on 0x180
#pr agma r omdat a Cont ador _Tabl a = 0x180
const r omunsi gned char Di spl ay_Tabl a[ 10] = { 0b00111111, / / 0
0b00000110, / / 1
0b01011011, / / 2
0b01001111, / / 3
0b01100110, / / 4
0b01101101, / / 5
0b01111101, / / 6
0b00000111, / / 7
0b01111111, / / 8
0b01100111}; / / 9

/ * Pr ot ot i pos */
voi d Cont r ol _Di spl ay( voi d) ;

/ * Pr ogr ama pr i nci pal */
#pr agma code / / zona de i nst r ucci ones al mi cr ocont r ol ador

voi d mai n( voi d)
{
Uni dad = 0; / / i ni ci al i zo
Decena = 0;
Pr eEst ado = 0;

TRI SB = 0b00000000; / / PORTB como sal i da

ADCON1=0x0F; / / Conf i gur amos t odos l os pi nes como di gi t al es

TRI SA = 0b00000100; / / RA3, RA1, RA0 sal i das, RA2 ent r ada
LATA=0;
LATAbi t s. LATA3 = 1; / / Act i vo ambos di spl ays

/ / Conf i gur o Ti mer
I NTCONbi t s. TMR0I F = 0; / / bor r o f l ag que i ndi ca desbor de del t i mer
T0CON = 0b00001000; / / no asi gnamos un pr escal ar - l a cuent a
/ / se i ncr ement a a cada i nst r ucci on
TMR0H = 0; / / bor r o r egi st r os del t i mer ( si empr e
/ / comenzar escr i bi endo el TMR0H)
TMR0L = 0;
T0CONbi t s. TMR0ON = 1; / / comi enzo t empor i zador

whi l e( 1)
{
/ / Bucl e i nf i ni t o
/ / Pr oceso de cont r ol del Di spl ay
Cont r ol _Di spl ay( ) ;

/ / Test eamos el desbor de del Ti mer
/ / par a un r et ar do de 65mSeg apr oxi madament e
i f ( I NTCONbi t s. TMR0I F == 1)
{
/ / Revi samos el est ado del pul sador y su est ado ant er i or
/ / Swi t ch | Pr eEst ado | I ncr ement o
/ / 0 | 0 | No
/ / 0 | 1 | No
/ / 1 | 0 | Si
/ / 1 | 1 | No
i f ( Swi t ch == 1)
{
i f ( Pr eEst ado == 0)
{
Pr eEst ado = 1; / / Cambi o el Est ado Ant er i or
/ / del Swi t ch
Uni dad ++; / / I ncr ement o l as uni dades
i f ( Uni dad == 10)
{
Uni dad = 0; / / Par a cont eo deci mal
Decena ++; / / I ncr ement o l as Decenas
i f ( Decena == 10)
{
Decena = 0;
}
}
}
}

i f ( Swi t ch == 0)
{
i f ( Pr eEst ado == 1)
{
Pr eEst ado = 0; / / Reset del Est ado del swi t ch
}
}
I NTCONbi t s. TMR0I F = 0; / / Bor r o el f l ag del Ti mer
}
}
}

voi d Cont r ol _Di spl ay( voi d)
{
/ / Desact i vo Di spl ays
LATAbi t s. LATA1 = 0; / / Desact i vo di spl ay 2
LATAbi t s. LATA0 = 0; / / Desact i vo di spl ay 1

PORTB = Di spl ay_Tabl a[ Uni dad] ; / / car gamos el Por t con l a Uni dad

/ / Act i vo Di spl ay 1
LATAbi t s. LATA0 = 1;

Del ay1KTCYx( 2) ; / / r et ar do de 2mSeg

/ / Desact i vo Di spl ay 1
LATAbi t s. LATA0 = 0;

PORTB = Di spl ay_Tabl a[ Decena] ; / / car gamos el Por t con l a Decena

/ / Act i vo di spl ay 2
LATAbi t s. LATA1 = 1;

Del ay1KTCYx( 2) ; / / r et ar do de 2mSeg
}


Cuando trabajamos con Displays multiplexados es importante alternar de manera
rpida entre los dgitos de la pantalla para simular el efecto de una pantalla de dos
decimales, una velocidad de encendido apropiada podra ser de 2 mSeg por cada
digito, o sea, encender y apagar cada display simultneamente unas 500 veces por
segundo. Esta multiplexacin de los display la realiza la funcin Cont r ol _Di spl ay la
cual se encarga de activar y desactivar los Displays y actualizar los valores de los
mismos cada 2mSeg.

Como se tiene la necesidad de actualizar los dgitos constantemente, no podemos
hacer un ciclo de espera para ver el cambio en el pulsador, porque afectara el efecto
que buscamos en la pantalla, lo que hacemos en lugar de esto es realizar muestras
sucesivas del estado del Switch cada 65mSeg, esto hace que cada segundo se vea el
estado del Switch unas 15 veces. Este tiempo de muestro del Switch se eligi por dos
motivos, primero, porque nos permite eliminar el efecto rebote de los pulsadores y
segundo, porque es el tiempo mximo que alcanza el Timer 0 cuando trabaja como
temporizador de 16 bits sin prescaler.

En el cdigo fuente del ejercicio definimos tres variables de 8 bits sin signo, Unidad,
Decena y PreEstado, los dos primeros los utilizaremos como ndice de la tabla que
contiene los cdigos en 7 segmentos para los Displays y el tercero, la variable
PreEstado, guarda el valor ledo en el pin del pulsador y nos ser de mucha utilidad
cuando tengamos que detectar cambios en el pulsador. Tambin en la cabecera del
cdigo fuente declaramos los prototipos de las funciones que vamos a utilizar.

Dentro de la funcin principal configuramos los PORTs y el timer del PIC, en los
puertos dejamos el PORTB y los pines de control del display como salida y RA2 como
entrada digital, y para el Timer 0, modificamos el registro T0CON para tener un
temporizador de 16bits, sin prescaler y controlado por el clock interno. Cuando
entramos en el bucle infinito lo primero que hacemos es llamar a la funcin
Cont r ol _Di spl ay que se encarga de refrescar las pantallas cada 2mSeg.

Si miramos el cdigo de esta funcin, veremos que no recibe ningn argumento y
tampoco retorna ningn valor, por lo que podemos decir que es una funcin que
realizara un proceso dentro del programa. El proceso que ejecuta esta funcin es la
de activar el primer display y cagarlo con el valor de la unidad durante 2mSeg y luego
activar el segundo display para cargarlo con el valor de la decena durante otros 2mSeg,
este proceso lo realiza una sola vez, porque luego el bucle infinito se encarga de llamar
nuevamente a esta funcin para refrescar la pantalla durante otros 4mSeg (2mSeg por
cada digito).

Mientras se realiza todo este proceso, esperamos el desborde del Timer 0, que ocurre
cada 65mSeg. En cada desborde se realiza el muestreo del estado del pulsador, donde
bsicamente comparamos el estado del Switch en ese instante con el estado que tenia
en el muestreo anterior, si no se produjeron cambios, salimos de los bloques
condicionales sin realizar ninguna modificacin, pero si se detecta un cambio pueden
ocurrir dos cosas, primero que el Switch haya realizado una transicin de cero a uno
(Switch en 1 y PreEstado en 0), eso quiere decir que se oprimi el pulsador y en ese
momento incrementamos las unidades y si fuese necesario, las decenas.

Ahora si lo que se detecta es una transicin de uno a cero (Switch en cero y PreEstado
en 1), se habr dejado de oprimir el pulsador (pensar que la velocidad de muestreo es
mucho menor que el tiempo que dura nuestro dedo encima del pulsador) en ese caso
debemos volver a cero la variable PreEstado.

Por ultimo se debe tener en cuenta que debemos borrar el flag del Timer 0 cada vez
que ocurre un desborde.

El ejercicio de esta prctica intenta mostrar una sola de las tcnicas de multiplexado de
Displays 7 segmentos, el cual presenta un efecto visual muy bueno a la vez que nos
permite ahorrar pines en nuestros desarrollos con PIC.

Das könnte Ihnen auch gefallen