Contador de 0 a 99 con PIC16F887 en dos display de 7
segementos
#include <16f887.h> #fuses hs,nowdt,noprotect,nolvp #use delay(clock=20000000) #byte portd=8 int i,j; int tabla7s[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; void main() { set_tris_d(0x00); do {for (i=0; i<=9; i++) { for (j=0; j<=9; j++) { portd=(tabla7s[i]+0x80); delay_ms(80); portd=(tabla7s[j]); delay_ms(80); } } } while(true); }
Contador de 0 a 99 con Display 7 Segmentos con el
PIC16F887
Hola gente!!, en esta ocasión les traigo el ejemplo mostrado en la pagina 63 del libro de Compilador C CCS y Simulador PROTEUS para microcontroladores PIC, en donde se realiza un contador de cero a noventa y nueve con la ayuda de dos Display 7 Segmentos, utilizando la tecnica de multiplexación o visualización estereoscopica, con el objetivo de compartir un solo puerto de salida para los dos display, y de esta manera economizar mas puertos de entrada y/o salida.
Para realizar el proyecto primero es necesarío determinar si el display es de anodo común o de catado común, tal como lo muestra esta imagen,
Para entregar las señales digitales y que puedan ser entendidas a la hora de visualizarlo en el Display es necesario realizar una decodificación para esto se puede utilizar el decodificador 7447, pero para este caso se ha realizado la decodificación internamente en el
CÁTODO COMÚN
NUM A B C D E F G DP DECIMAL HEXA
0
1 1 1 1 1 1 0
0
63
0X3F
1
0 1 1 0 0 0 0
0
6
0X06
2
1 1 0 1 1 0 1
0
91
0X5B
3
1 1 1 1 0 0 1
0
79
0X4F
4
0 1 1 0 0 1 1
0
102
0X66
5
1 0 1 1 0 1 1
0
109
0X6D
6
1 0 1 1 1 1 1
0
125
0X7D
7
1 1 1 0 0 0 0
0
7
0X07
8
1 1 1 1 1 1 1
0
127
0X7F
9
1 1 1 1 0 1 1
0
111
0X6F
ÁNODO COMÚN
NUM A B C D E F G DP DECIMAL HEXA
0
0 0 0 0 0 0 1
1
3
0X03
1
1 0 0 1 1 1 1
1
249
0XF9
2
0 0 1 0 0 1 0
1
164
0XA4
3
0 0 0 0 1 1 0
1
176
0XB0
4
1 0 0 1 1 0 0
1
163
0X99
5
0 1 0 0 1 0 0
1
146
0X92
6
0 1 0 0 0 0 0
1
130
0X82
7
0 0 0 1 1 1 1
1
248
0XF8
8
0 0 0 0 0 0 0
1
128
0X80
9
0 0 0 0 1 0 0
1
144
0X90
Contador 0-99 con
PIC16F84A y
Mikrobasic
Ratings: (0)|Views: 5.070|Likes: 33
Publicado por
Carlos Navarro M.
Bueno aquí el programa con proteus. Espero sea de utilidad: el objetivo es hacer un contador de 0-99
con el PIC16F84A Con el fin de hacerlo manualmente para contar ya sea con SW1 y Reset SW2.
También se podría cambiar este SW1, por algún sensor de movimiento u...
Ver más
Bueno aquí el programa con pruteus. Espero sea de utilidad: el objetivo es hacer un
contador de 0-99 con el PIC16F84ACon el fin de hacerlo manualmente para contar ya
sea con SW1 y Reset SW2. También se podría cambiar este SW1, poralgún sensor de
movimiento u otro.
Les dejo también el programa con MIKROBASIC y arriba como programar las casillas
que solo selecciono 4:program Cont7seg0a9CNM' *MikroElektronika,
2012' *Descripcion:TIEEE, FIME, UANL,MX.
2012-2013' Prof: Carlos Navarro Morín' *Este codigo demuestra el uso de 2 display de 7
segmentos de cátodo comun' en modo multiplexado trabajando en un contador de 0 a
99.' Todos los display connectados al portb(RB0..RB7, segment A a RB0,...G a
RB6)' con refrescamiento a través de los pines RA0..RA3 en porta.' *
const display as byte[10]=(63,6,91,79,102,109,125,7,127,111) 'Códigos para
7 segdim millar as word 'Millares del conteodim centena as word 'Centenas del conteodi
m decena as word 'Decenas del conteodim unidad as word 'unidades del conteodim cuen
ta as word 'Cuenta el numero de sensados'ADCON1 = 7 'Puerto A digital este solo en PI
C con puerto digital en este caso no.trisa=%00010000 'RA4 entrada resto como salidatri
sb=%10000000 'RB7 entrada, resto salidaporta=0 'Limpia Porta Aportb=0 'Limpia Porta
Bcuenta=0 'Inicializa numero de cuentasporta.0=1delay_ms(2000)porta.0=0while true '
Ciclo INFINITOif Button(PORTB, 7, 10, 1)
thencuenta=cuenta+1 'Incrementa la cuenta'porta.0=1 'BUZZER en on conectado en PA
0'delay_ms(50) 'Espera'porta.0=0 'PA0 en OFF (extinguido buzzer)end if rem ---Si se
supera la cuenta maxima o hay un reset----if (cuenta >= 10000) or (porta.4=1)
CONTADOR 0-99 DISPLAY 7 SEGMENTOS
Written by Hector Torres
Tuesday, 15 March 2011 00:16
There are no translations available.
Contador de 0-99 con 2 displays de 7 Segmentos
DESCRIPCIÓN
El programa incrementara el valor de una variable, la cual se mostrara a través de un par de displays de 7 segmentos, los cuales se controlaran de manera multiplexada, uno a la vez, a una velocidad que el ojo no alcance a detectar el cambio y perciba ambos displays encendidos a la vez.
DIAGRAMA ESQUEMÁTICO Materiales 2 Displays 7 segmentos 7 Resistencias de 220 Ohms 2 Resistencias de 10 kOhms
2 Transistores de pequeña señal
1 Microcontrolador ATmega8
Programador USBasp V3.0
DISPLAY 7 SEGMENTOS
El display de 7 segmentos es un dispositivo que nos sirve para mostrar números o caracteres, los cuales se visualizan al activar o desactivar los LEDs que este tiene, esto se hace conectando el común a la tierra y voltaje en el segmento que deseemos activar (en caso de ser cátodo común).
Para poder representar los números con el display, es necesario generar la tabla que nos dará el valor que será necesario para generar el numero deseado.
Por ejemplo, se puede observar que para hacer un cero se busca que enciendan todos los segmentos menos el g (pin 10 del display el cual va conectado al PB0 del Micro), con esa información del numero, tendremos el valor que tomara el puerto para mostrar el numero deseado a través del display.
Para controlar dos displays a la vez, se hará uso de un par de transistores, en este caso conmutaran entre uno y otro, mientras los displays están conectados al mismo puerto del micro. Primero se mostrara las decenas mientras se desactiva el display de las unidades y después de una fracción de tiempo, se activa el de la unidad y se desactiva el de las decenas y el micro manda el valor de la unidad. Esto se repite determinadas veces a alta velocidad para dar la impresión de que siempre se encuentran prendidos los dos displays.
Para activar y desactivar los displays se les pondrá un transistor a modo de swhitch el cual se conectara del colector al común del display, y este controlara el display activándolo o desactivándolo desde la base.
Para este caso el transistor se está usando como un swhitch, eso es que se está trabajando en las regiones de corte y saturación, lo que nos dice que al pasar una corriente en la base, el transistor se comporta como un interruptor que se abre o se cierra. PROGRAMA EN C #include <avr/io.h> #include <util/delay.h> int contador=0;
int unidades, decenas,i;
int numeros[10]={0x7E, //Se declara un vector de longitud 10 que contenga los
0x30, //valores obtenidos de la tabla, acomodados en orden
0x6D, //Según su posición del 0 al 9
0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B};
int mostrar(int numero){ //Creamos una función de tipo entero
unidades=numero%10; //Al dividir un valor entre 10 el residuo nos da las unidades
decenas =numero/10; //Se obtiene la decena dividiendo el numero entre 10
for(i=0;i<20;i++){
PORTD=0x02; //Se activa el transistor de las unidades
PORTB=numeros[unidades]; //Se asigna al PORTB la variable numero en la posición unidades
_delay_ms(5);
PORTD=0x01; //Se activa el transistor de las decenas
PORTB=numeros[decenas]; //Se asigna al PORTB la variable numero en la posición decenas
_delay_ms(5); } return 0; }
int main(void){ //Inicio del programa
DDRB=0xFF; DDRD=0x03;
while(1){
mostrar(contador); //Llamar a la función mostrar, mandando la variable contador
contador++; //Incrementar el valor de la variable contador
if (contador > 99) //Si llega a 99, que tome el valor de 0
contador=0; }
}
DETALLES DEL PROGRAMA
int numeros[10]={0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B};
Aquí se está declarando un vector de tipo entero, el cual le indicamos la longitud del mismo, el cual tiene 10 datos, se acomodaron conforme a que la posición del vector corresponde al número que representa ese valor en el display, en el caso del 3 el cual es el 0x79 (previamente obtenido en la tabla), podemos ver que se encuentra en la tercera posición.
int mostrar(int numero){
Una función se declara como "tipo de dato" "nombre de la función" ( "tipo de dato" "nombre de entrada"), en este caso la función obtendrá la unidad y la decena de cualquier numero entre 0-99 y mandara el dato para mostrarlo en el display.
unidades=numero%10; decenas =numero/10;
Operación para obtener separar un numero entre su unidad y decena. Por ejemplo el 45, si lo dividimos entre 10, esto es 45/10 = 4 (recuerde que como son variables de tipo entero es solo 4 y no 4.5), y con el operador mod (de modulo) "%" el resultado es 45%10 = 5. Gracias a esto tenemos en una variable el numero 4 y en otra el numero 5.
PORTB=numeros[unidades];
Al puerto B se le asigna el valor que tenga el vector números en la posición unidades, si tomamos el ejemplo anterior, unidades valía 5, si vamos al vector números y vemos la quinta posición, veremos un 0x5B la cual corresponde al número 5 en la tabla, esto es, que al mostrarlo por el puerto B aparecerá el 5 en el display.
mostrar(contador);
numero del 0-99, al llamar la función, esta ejecutara todas las instrucciones que se encuentren dentro de la misma, al terminar regresara y continuara con la siguiente instrucción.