Anda di halaman 1dari 18

EL RELOJITO EL RELOJ DE CONTROL INTRODUCCIN

El relojito es un reloj de pared bastante especial. Adems de dar la hora (como todo reloj que se precie de tal), tambin nos muestra la temperatura ambiente. Pero lo que lo hace diferente a la mayora de los relojes electrnicos cuyos esquemas puedes encontrar navegando por la web es la forma en que est construido su particular segundero. En efecto, en lugar de indicar el transcurso de los segundos mediante un par de display LED de 7 segmentos como es habitual, lo hace mediante 60 diodos LED dispuestos en forma de circulo a lo largo del borde exterior del circuito impreso que aloja todos los componentes del reloj.

DESCRIPCIN DEL PROYECTO


El reloj que vamos a construir puede indicar la hora y los minutos mediante 4 display LED de 7 segmentos, en el formato HH:MM, donde los : centrales estn constituidos por dos pequeos LEDs de 3mm. Estos displays tambin se utilizan para mostrar la temperatura, que se obtiene mediante un sensor de temperatura Dallas DS1820. Para mantener funcionando el reloj con una exactitud razonable se ha utilizado un reloj de tiempo real DS1307. El segundero, como decamos, es una circunferencia formada por 60 LEDs de 5mm, controlados mediante solamente dos pines del PIC16F628A. Esto es posible gracias a la utilizacin de un registro de desplazamiento construido a partir de 8 circuitos integrados 74HC164N. En este mismo nmero de la Revista Control encontraras la explicacin de su funcionamiento. Adems hemos dotado al reloj de 4 pequeos pulsadores, que servirn para llevar a cabo las tareas de puesta en hora, seleccin del modo de funcionamiento, etc

EL CIRCUITO

Si bien el circuito del Relojito puede resultar intimidante por su tamao (emplea 18 circuitos integrados y ms de 100 resistores) en realidad no es tan complejo como parece. El esquema se basa en un PIC16F628A, que se encarga de llevar a cabo todas las tareas necesarias. Este micro controlador emplea como oscilador generador de pulsos de reloj un cristal de 4MHz, con dos condensadores de 22pF, conectados a los pines 15 y 16. Los pulsadores encargados de la gestin de la puesta en hora y seleccin del modo de funcionamiento se encuentran conectados a los pines 10, 11, 12 y 13, que corresponden a los bits 4, 5 ,6 y 7 del PORTB. Cada uno de estos pines se ha puesto a GND mediante un resistor de 10K. Cada vez que presiona un pulsador, el pin correspondiente se pone a +V. La temperatura se lee desde un sensor Dallas DS1820, conectado al pin 4 del micro controlador. Este pin corresponder al bit 5 del PORTA. Para mantener la exactitud del reloj empleamos un pequeo circuito integrado, tambin de Dallas, que se encarga de contar el tiempo por nosotros. Se trata del DS1307, de 8 pines, que dispone de su propio cristal (de 32.768 Hz) y de una pila CR-2032 de 3V de respaldo. Esta pila se proporciona la energa necesaria para que el DS1307 siga funcionando en caso de producirse algn fallo o desconexin de la fuente de alimentacin principal. Esto evita el tener que volver a poner en hora el Relojito cada vez que lo desenchufemos de la red elctrica. Para mostrar tanto la informacin correspondiente a las horas y minutos como los datos de la temperatura, se emplearon 4 display LED de 7 segmentos de unos 3.5 centmetros de altura. El modelo elegido fue el C-1021H de Paralight. Se trata de display de ctodo comn, donde cada segmento est constituido por dos LEDs rojos en serie. Los : centrales estn formados por dos LEDs de 3mm conectados en serie, del mismo color que los displays, y son manejados desde el pin 7 del microcontrolador (PORTB.1) Dado que el multiplexar estos displays mediante las tcnicas tradicionales hubiese exigido un elevado nmero de pines de E/S del microcontrolador PIC16F628A, se utiliz un registro de desplazamiento construido a partir de cuatro circuitos integrados 74HC164N conectados en cascada. Cada una de las salidas de estos integrados controla uno de los segmentos de los displays. El pin 17 del microcontrolador (bit 0 del PORTA) se encarga de proporcionar los datos al registro de desplazamiento, mientras que el pin 18 (bit 1 del PORTA) entrega los pulsos de CLOCK necesarios. El mismo truco del registro de desplazamiento se utiliz para controlar los 60 LEDs que conforman el segundero. Esta vez fueron necesarios 8 circuitos integrados 74HC164N. Este registro dispone de 64 salidas, de las que se aprovechan solo las primeras 60. Cada una de estas salidas controla uno de los LEDs a travs de un resistor que limita la corriente que los atraviesa. Dado que el consumo mximo posible de este proyecto es bastante elevado para lo que estamos acostumbrados, hemos dividido la etapa de alimentacin en tres partes, cada una de ellas encargada de proporcionar energa a una de las secciones del reloj. De esta manera, una de las etapas construidas alrededor de un regulador de voltaje LM7805 proporciona la corriente que necesita el microcontrolador, el sensor de temperatura y el reloj de tiempo real. Otra de las etapas alimenta los displays y el registro de desplazamiento que lo controla, y la tercera hace lo propio con los LEDs del segundero y sus circuitos integrados de control. Si bien no figuran en el esquema elctrico, hemos colocado condensadores cermicos de 0.1uF entre los pines de alimentacin de cada uno de los 74HC164N. Se pueden ver en las fotos, estn soldados directamente sobre las pistas del PCB.

EL CIRCUITO IMPRESO
Como es de suponer, para albergar todo esto hace falta un circuito impreso bastante grande. Dado que en Control intentamos mantener las cosas simples, por lo general no utilizamos circuitos integrados ni componentes de montaje superficial ni PCB de doble faz. Esto tambin ayudo a que el PCB sea grande.

Quizs el rasgo ms representativo de este circuito impreso sea su forma, ya que nos hemos apartado del clsico diseo rectangular o cuadrado y lo hemos dibujado como una circunferencia, de forma que los Leeds del segundero adopten la misma disposicin que tendran las marcas en la esfera de un reloj de aguja. El dimetro de la placa de circuito impreso es de 18 centmetros. Cortarla con forma de circunferencia es bastante trabajoso, pero no imposible. De todos modos, aquellos que no se animen a cortar el PCB con esta forma, pueden simplemente utilizar un PCB cuadrado de 18 centmetros de lado con el dibujo que proponemos en el centro. Para construir el PCB basta con utilizar el diseo que puede descargarse en formato PDF desde aqu, e imprimirlo siguiendo los pasos de nuestro tutorial "Como construir tus propios PCB".

COMPONENTES
La lista de componentes que vamos a emplear es bastante extensa, pero afortunadamente se trata de componentes de bajo costo, por lo se trata de un proyecto al alcance de todos los bolsillos. La lista de materiales necesarios es la siguiente:

12 circuitos integrados 74HC164N. 92 resistores de 220 ohm, 1/8 de Watt. 7 resistores de 10K, 1/8 de Watt. 1 circuito integrado DS1307. 1 microcontrolador PIC16F628A. 1 sensor de temperatura DS1820 1 cristal de 4 MHz. 1 cristal de 32.768 KHz. 14 condensadores cermicos de 100 nF (0.1uF). 2 condensadores cermicos de 22pF. 1 condensador electroltico de 220uF/16V. 1 zcalo para pila CR-2032 4 displays de ctodo comn C-1021H de Paralight. 2 LEDs rojos de 3mm. 60 LEDs rojos de 5mm. 1 diodo 1N4001. 1 bornera para circuito impreso de dos tornillos. 4 pulsadores de 8mm para circuito impreso. 3 reguladores de voltaje LM7805.

Tambin necesitars un trozo de PCB virgen de una sola cara, con un tamao de 18x18 centmetros, y zcalos para los circuitos integrados.

MONTAJE
No hay mucho para decir sobre el montaje de los componentes de este proyecto. Puede ser una buena idea comenzar el trabajo de soldadura por los puentes y zcalos, para luego seguir con los resistores y condensadores. Los displays, reguladores de voltaje y LEDs deberan montarse en ltimo lugar, cuidando de que estn en la posicin correcta. Ser un trabajo que tomara al menos una o dos horas, as que hay que encararlo con paciencia. Una vez que todo est en su lugar, y antes de colocar los circuitos integrados en sus zcalos, podemos alimentar el relojito y comprobar que a la salida de cada regulador de voltaje tenemos 5V. Tambin podemos medir la tensin en los pines de los zcalos encargados de alimentar a cada integrado, para no tener alguna sorpresa desagradable. Entre los pines 7 y 14 de cada 74HC164N debera haber 5V, lo mismo que entre los pines 5 y 14 del zcalo correspondiente al microcontrolador. Si todo est bien, podemos poner cada integrado en su sitio, cuidando de no ponerlos en la direccin opuesta.

EL SOFTWARE
Ya vimos cmo desarrollar el hardware, y ahora comenzaremos a ver cmo sacar provecho de este diseo, explicando cada una de las rutinas necesarias para transformar ese montn de componentes en algo til. Escribiremos el software desde cero, explicando cada uno de los pasos a seguir, de forma que todos puedan comprender a fondo cada una de las rutinas, y as ser capaces de modificarlas a gusto. Hemos decidido presentar versiones en PIC BASIC y CCS de cada trozo de cdigo, como una manera de llegar a un mayor nmero de lectores.

CONFIGURACIN DE LOS PINES DE E/S


El primer paso antes de comenzar a utilizar los pines de entrada o salida, es configurar correctamente su funcin. Este es un paso muy simple, y que no requiere de demasiadas explicaciones. Los comentarios incluidos en el cdigo fuente sern suficientes para entender que hace cada lnea de programa. Veamos primero como hacerlo en PIC BASIC (recordemos que utilizamos la versin correspondiente al PIC SIMULATOR IDE):

'-----CONFIGURAMOS PUERTOS---------AllDigital 'Todos los pines del PORTA como E/S 'Configuro el PORTA: TRISA.0 = 0 'DATA Segundero TRISA.1 = 0 'CLOCK Segundero TRISA.2 = 0 'DATA HH:MM TRISA.3 = 0 'CLOCK HH:MM TRISA.4 = 0 'Salida TRISA.5 = 0 'DS1820 'Configuro el PORTB: TRISB.0 = 1 'Entrada TRISB.1 = 0 'Salida, TRISB.2 = 0 'pin SCA TRISB.3 = 0 'pin SCL TRISB.4 = 1 'Entrada TRISB.5 = 1 'Entrada TRISB.6 = 1 'Entrada TRISB.7 = 1 'Entrada pulsos del DS1307 LEDs ":" en display "HH:MM" del DS1307 del DS1307 Pulsador 1 Pulsador 2 Pulsador 3 Pulsador 4

Ahora, vemos cmo hacer la misma tarea en CCS:


//Device/Fuses/Etc.--------------------------------#INCLUDE <16F628A.H> //Usamos un 16F628A #FUSES NOWDT //No Watch Dog Timer #FUSES XT //Con oscilador a cristal... #use delay(clock=4000000) //..de 4MHz. #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //No protegemos el cdigo. #FUSES NOBROWNOUT //No Brownout Reset #FUSES NOLVP //No low voltage prgming #FUSES NOCPD //No EE protection //Declaramos la posicin de los puertos----------------------#BYTE PORTA = 0x05 #BYTE PORTB = 0x06 #BYTE PORTA_TRIS = 0x85 #BYTE PORTB_TRIS = 0x86 //Y asignamos cada pin como E/S segn corresponda: PORTA_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA PORTB_TRIS = 0b11110001; //1=ENTRADA, 0=SALIDA

Una vez listo este trmite, pasemos a las rutinas propiamente dichas.

ESCRIBIENDO LOS SEGUNDOS.


La caracterstica ms sobresaliente de este reloj es su segundero. Compuesto por 60 LEDs ubicados sobre la circunferencia del reloj, se controlan mediante solo dos pines del microcontrolador. Esto es posible gracias a la utilizacin de un registro de desplazamiento. Como ya hemos visto, este tipo de registro incorpora los datos presentes en su entrada con cada pulso de reloj que se aplica a su terminal CLOCK. Debemos respetar los tiempos de respuesta de los circuitos integrados que conforman los registros de desplazamiento. En este caso, el 74HC164N que henos utilizado puede funcionar a una frecuencia mas elevada que los 4 MHz (o el MIP) a los que funciona el PIC16F628A, por lo que no sern necesarios los tiempos de espera entre el envi de un dato y el siguiente. Los pines implicados en el control de los LEDs del segundero son los correspondientes a PORTA.0 (o RA0, pin 17) y PORTA.1 (o RA1, pin 18), para las funciones de DATA y CLOCK respectivamente. Como no es el nico registro de desplazamiento presente en el proyecto, nos referiremos a estas seales como DATA2 y CLOCK2. Concretamente, el dato presente en la entrada del registro de desplazamiento se hace presente en la primera de sus salidas (empujando a los dems una posicin hacia delante) cuando el pin CLOCK pasa de estado bajo a estado alto. Esto quiere decir que deberemos seguir el siguiente orden para cada bit que queramos enviar al registro: 1. Poner el dato a enviar en el pin DATA2 (PORTA.0) 2. Poner CLOCK2 (PORTA.1) en estado bajo. 3. Poner CLOCK2 (PORTA.1) en estado alto. Como se ve, es algo muy sencillo de implementar. Veamos cmo hacerlo en PIC BASIC:
escribo_segundo: data1 = bit_aux 'Pongo el valor en DATA clock1 = 0 'Pongo el CLOCK en bajo... clock1 = 1 '...y de nuevo en alto. Listo! Return

Esta rutina enva el valor de la variable bit_aux al registro de desplazamiento. La subrutina supone que antes de llamarla hemos declarado las variables (usando DIM) y las macros (mediante SYMBOL) necesarias:
'------DECLARO VARIABLES y MACROS-----------------Dim bit_aux As Bit 'Declaro la variable auxiliar Symbol data1 = PORTA.0 'Nos referimos a PORTA.0 como "data1" Symbol clock1 = PORTA.1 'Nos referimos a PORTA.1 como "clock1"

Veamos la forma de hacer esto en CCS.


//Declaramos la Variable: int1 bit_aux; //Declaro la variable auxiliar //-------------------------------------------------//---Envia un DATO al registro de desplazamiento: //-------------------------------------------------void escribo_segundo(int1){ if (bit_aux) {output_high(DATA2);} //Si es "1", lo escribo en DATA2. if (!bit_aux) {output_low(DATA2);} //Si es "0", lo escribo en DATA2. output_low(CLOCK2); //Pongo el CLOCK en bajo... output_high(CLOCK2); //...y de nuevo en alto. Listo! } main(){ //Asignamos cada pin como E/S segn corresponda: PORTA_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA PORTB_TRIS = 0b11110001; //1=ENTRADA, 0=SALIDA }

En CCS, para hacer uso de la funcin escribo_segundo, basta con invocarla desde el programa principal, de la siguiente manera:
escribo_segundo (valor);

Donde valor ser 0 o 1 dependiendo si queremos apagar o encender el LED correspondiente a la primera posicin del registro de desplazamiento.

HACIENDO LIMPIEZA
Antes de comenzar a enviar datos tiles al registro de desplazamiento, conviene limpiar el contenido de sus 60 bits, dado que al alimentar El Relojito pueden contener informacin aleatoria, que en la practica se veran como una serie de LEDs encendidos. Si no lo hiciramos, cada dato que enviemos al registro empujara a los bit-basura una posicin hacia delante, algo que no quedara demasiado bien. La forma de evitar esto es bien simple: ni bien comienza nuestro programa, debemos escribir 60 ceros en el registro de desplazamiento, asegurndonos que todos los LEDs se encuentran apagados. Dado que puede se trata de una accin que puede requerirse mas de una vez en nuestro programa, tambin la vamos a implementar como una subrutina (en PIC BASIC) o como una funcin (en CCS). Dado que ya tenemos el codito necesario para escribir un valor en el registro de desplazamiento, la nueva rutina/funcin solo deber encargarse de llamar 60 veces seguidas a la que vimos antes, con el valor 0. Veamos cmo hacerlo en PIC BASIC
borro_segundero: bit_aux = 0 'Asigno el valor a enviar a la variable auxiliar... For i = 0 To 59 '"i" ir de 0 a 59, de 1 en 1. Gosub escribo_segundo 'envo bit_aux al registro Next i Return

Y ahora, lo mismo pero en CCS:


void borro_segundero(void){ int i; for (i=0;i<60;i++) { // "i" ir de 0 a 60, de 1 en 1. escribo_segundo(0); //Envio un "0" al registro de desplazamiento } }

Esto es todo lo que necesitamos saber para manejar correctamente los 60 LEDs del relojito.

HORAS Y MINUTOS
Ahora le toca el turno al display que debe mostrar las horas y los minutos. Montado a partir de 4 displays de 7 segmentos y un registro de desplazamiento, la construccin de rutinas o funciones que lo controlen representa un desafo muy interesante, que ya mismo abordaremos.

CONEXIONADO DE LOS DISPLAYS


Como vimos ms arriba, en la descripcin del hardware de este proyecto, la visualizacin de las horas y los minutos se realiza mediante cuatro displays de 7 segmentos de ctodo comn. Esto significa que para encender alguno de sus segmentos debemos proporcionar tensin al pin correspondiente de cada mdulo. Para evitar utilizar varios pines del microcontrolador PIC16F628A elegido como cerebro del proyecto al control de este display, se utiliz un registro de desplazamiento compuesto por 4 circuitos integrados 74HC164N. Cada uno de ellos se encarga del control de los 7 segmentos y del punto decimal de un display. El nombre de los segmentos de cada display, segn la mayora de las hojas de datos, es el de la figura:

All podemos ver que se nombran con letras de la a (el segmento superior del 8) hasta la g (el segmento central), avanzando en sentido horario. El punto decimal suele llamarse dp (supongo que por dot point ), pero nosotros lo llamaremos h. Cada uno de los segmentos (y el punto decimal) de cada display se encuentran conectados, mediante un resistor que limita la corriente que los atraviesa, a una de las salidas de los 74HC164N. Estos estn conectados en cascada, por lo que cuando un dato sale de unos de los integrados se aplica a la entrada del siguiente. Esto significa que con solo dos pines (CLOCK y DATA) podemos escribir los 4 displays. Los primeros 8 bits enviados al registro de desplazamiento sern los encargados de determinar el encendido de los segmentos del display de la izquierda (las decenas de las horas). Los siguientes 8 bits controlarn las unidades de las horas, los 8 que vienen a continuacin manejarn el display que muestra las decenas de los minutos, y los ltimos 8 bits determinaran el contenido del display que muestra las unidades de los minutos. Esto quiere decir que si quisisemos mostrar 23:15 en el display, primero deberamos enviar los datos del 2, luego los del 3, los del 1 y finalmente los correspondientes al 5. Para saber cual es el contenido que debemos enviar para representar cada digito es necesario que tengamos bien presente la forma en que los circuitos integrados 74HC164N estn conectados a los displays.

Si miramos el esquema elctrico anterior, veremos que el primer bit ingresado se encarga del encendido (o apagado) del segmento d del display, luego de ser empujado por los 7 bits correspondientes a los dems segmentos del display. Concretamente, el orden en que deben ingresarse los datos es d, h, c, g, b, a, f y e. La tabla de la figura siguiente muestra el valor de cada uno de estos bits para formar cada uno de los dgitos del 0 al 9. Hemos incluido el valor del byte en decimal y binario, para facilitar al lector la programacin del display.

A PROGRAMAR Una vez que tenemos claro cmo debemos proceder, veamos cmo escribir un programa que muestre informacin en el display. Comencemos por un ejemplo que muestra como enviar un 2 al registro desplazamiento. El cdigo en PIC BASIC es el siguiente:
'-----CONFIGURO PUERTOS---------AllDigital 'Configuro el portA: TRISA.2 = 0 'DATA HH:MM TRISA.3 = 0 'CLOCK HH:MM 'Configuro el portB: TRISB.1 = 0 'Salida, LEDs : en HH:MM '------VARIABLES-----------------Dim i As Byte Dim col As Byte Dim aux As Byte '----- Symbol ----------------Symbol clock7 = PORTA.3 Symbol data7 = PORTA.2 'Limpio el contenido del registro de desplazamiento 'escribiendo 32 "0" seguidos: For i = 1 To 32 data7 = 0 clock7 = 0 clock7 = 1 Next i 'Escribo un "2" en el primer display aux = 157 'Valor decimal de "2" (ver tabla) 'Este bucle recorre el byte enviando sus bits 'al registro de desplazamiento: For col = 1 To 8 'Si el bit es "0", escribo un "0". If aux.0 = 0 Then data7 = 0 clock7 = 0 clock7 = 1 Else 'Si el bit es "1", escribo un "1". data7 = 1 clock7 = 0 clock7 = 1 Endif 'Paso al bit siguiente aux = ShiftRight(aux, 1) Next col

Casi al final de este artculo encontrars videos que muestra cmo se van corriendo los datos por el registro de desplazamiento. Por supuesto, hemos agregado un retardo de un segundo despus de enviar cada bit, para que pueda verse como funciona

Ahora, modifiquemos el programa anterior para que podamos mostrar la hora 23:15 en el display. Como puede verse, hemos transformado las instrucciones que se encargan de enviar los 8 bits en una rutina, a la que llamamos 4 veces, pasndole como dato (en aux) el byte a escribir:

'-----CONFIGURO PUERTOS---------AllDigital 'Configuro el portA: TRISA.2 = 0 'DATA HH:MM TRISA.3 = 0 'CLOCK HH:MM 'Configuro el portB: TRISB.1 = 0 'Salida, LEDs : en HH:MM '------VARIABLES-----------------Dim i As Byte 'Variable auxiliar Dim col As Byte Dim aux As Byte 'Variable auxiliar uso gral (WORD) '----- Symbol ----------------Symbol clock7 = PORTA.3 Symbol data7 = PORTA.2 'Limpio el contenido del registro de desplazamiento 'escribiendo 32 "0" seguidos: For i = 1 To 32 data7 = 0 clock7 = 0 clock7 = 1 Next i 'Escribo un "2" en el primer display aux = 157 'Valor decimal de "2" (ver tabla) Gosub escribo 'Escribo un "3" en el segundo display aux = 188 'Valor decimal de "3" (ver tabla) Gosub escribo 'Escribo un "1" en el tercer display aux = 40 'Valor decimal de "1" (ver tabla). Gosub escribo 'Escribo un "5" en el cuarto display aux = 182 'Valor decimal de "5" (ver tabla) Gosub escribo End 'Este bucle recorre el byte enviando sus bits 'al registro de desplazamiento: escribo: For col = 1 To 8 'Si el bit es "0", escribo un "0". If aux.0 = 0 Then data7 = 0 clock7 = 0 clock7 = 1 Else 'Si el bit es "1", escribo un "1". data7 = 1 clock7 = 0 clock7 = 1 Endif 'Paso al bit siguiente aux = ShiftRight(aux, 1) Next col Return

Veamos este ltimo ejemplo, pero escrito en CCS:


//Device/Fuses/Etc.--------------------------------#INCLUDE <16F628A.H> //Usamos un 16F628A #FUSES NOWDT //No Watch Dog Timer #FUSES XT //Con oscilador a cristal... #use delay(clock=4000000) //..de 4MHz. #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //No protegemos el codigo. #FUSES NOBROWNOUT //No Brownout Reset #FUSES NOLVP //No low voltage prgming #FUSES NOCPD //No EE protection //Declaramos la posicin de los puertos----------------------#BYTE PORTA = 0x05 #BYTE PORTB = 0x06 #BYTE PORTA_TRIS = 0x85 #BYTE PORTB_TRIS = 0x86 //Definimos el valor de CLOCK y DATA #DEFINE DATA7 PIN_A2 //Nos referimos a PORTA.2 como "data7" #DEFINE CLOCK7 PIN_A3 //Nos referimos a PORTA.3 como "clock7" //---Envia un digito al registro de desplazamiento: void escribo(int8 aux){ int i; for (i=0;i<8;i++) { // "i" ir de 0 a 7, de 1 en 1. //Si el bit es "0", escribo un "0". if (bit_test(aux,i) == 0) { output_low(DATA7); //Pongo "0" en DATA7... output_low(CLOCK7); //Pongo el CLOCK en bajo... output_high(CLOCK7); //...y de nuevo en alto. Listo! } //Si el bit es "1", escribo un "1". if (bit_test(aux,i) == 1) { output_high(DATA7); //Pongo "1" en DATA7... output_low(CLOCK7); //Pongo el CLOCK en bajo... output_high(CLOCK7); //...y de nuevo en alto. Listo! } } } //---Limpia el display: void borro_display(void){ int i; for (i=1;i<33;i++) { // "i" ir de 1 a 32, de 1 en 1. output_low(DATA7); //Pongo "0" en DATA7... output_low(CLOCK7); //Pongo el CLOCK en bajo... output_high(CLOCK7); //...y de nuevo en alto. Listo! } } main(){ //Asignamos cada pin como E/S segn corresponda: PORTA_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA PORTB_TRIS = 0b11110001; //1=ENTRADA, 0=SALIDA //Limpiamos el display borro_display(); //Escribo un "2" en el primer display escribo(157); // 'Valor decimal de "2" (ver tabla) //Escribo un "3" en el segundo display escribo(188); // 'Valor decimal de "3" (ver tabla) //Escribo un "1" en el tercer display escribo(40); // 'Valor decimal de "1" (ver tabla) //Escribo un "5" en el cuarto display escribo(182); // 'Valor decimal de "5" (ver tabla) }

Como puede suponerse, el redibujado del display ocurre a tal velocidad que es imperceptible para el ojo. Y al no tener los dgitos correspondientes a los segundos, solo debe escribirse el display una vez por minuto. El tiempo que insume enviar los 32 datos al registro de desplazamiento ronda los 160 microsegundos

Suponiendo que tenemos resuelto el mecanismo que cada un segundo pone un flan en alto (algo que veremos en el prximo nmero, usando interrupciones), deberamos escribir una rutina (o una funcin, si usamos CCS) que actualice el display y el segundero cuanto corresponda. Cada un tiempo determinado una bandera se pondra en 1, y el cuerpo principal del programa debera actualizar la hora y mostrarla en el display. Eso, justamente, es lo que hace el siguiente ejemplo en PIC BASIC:
'Esta rutina muestra HH:MM muestro_hhmm: 'Muestro las decenas de las horas aux1 = hora / 10 aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1 Gosub escribo 'Muestro las unidades de las horas aux1 = hora - (hora / 10) * 10 aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1 Gosub escribo 'Muestro las decenas de los minutos aux1 = minu / 10 aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1 Gosub escribo 'Muestro las unidades de los minutos aux1 = minu - (minu / 10) * 10 aux = LookUp(175, 40, 157, 188, 58, 182, 183, 46, 191, 190), aux1 Gosub escribo Return

Se asume que aux1 y aux estn declaradas como BYTE, y que la rutina escribo vista antes esta presente en el programa.