Sei sulla pagina 1di 17

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 ocasin 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 multiplexacin o visualizacin 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 necesaro determinar si el display es de anodo comn o de
catado comn, tal como lo muestra esta imagen,


Para entregar las seales digitales y que puedan ser entendidas a la hora de visualizarlo en el
Display es necesario realizar una decodificacin para esto se puede utilizar el decodificador
7447, pero para este caso se ha realizado la decodificacin internamente en el
microcontrolador.


CTODO COMN
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 COMN
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 porCarlos 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.
Tambin se podra cambiar este SW1, por algn sensor de movimiento u...
Ver ms

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. Tambin se podra cambiar este SW1, poralgn sensor de
movimiento u otro.



Les dejo tambin 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 Morn' *Este codigo demuestra el uso de 2 display de 7
segmentos de ctodo 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 travs de los pines RA0..RA3 en porta.' *
Configuracin:' MCU: PIC16F84A' Oscilador: XT, 4.000 MHz' SW: mikroBasic v7.2



const display as byte[10]=(63,6,91,79,102,109,125,7,127,111) 'Cdigos 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)
thenporta.0=1 'BUZZER en on conectado en PA0

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
DESCRIPCIN

El programa incrementara el valor de una variable, la cual se mostrara a travs 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 ESQUEMTICO



Materiales
2 Displays 7 segmentos
7 Resistencias de 220 Ohms
2 Resistencias de 10 kOhms
2 Transistores de pequea seal
1 Microcontrolador ATmega8
Programador USBasp V3.0

INTRODUCCIN

DISPLAY 7 SEGMENTOS

El display de 7 segmentos es un dispositivo que nos sirve para mostrar nmeros o caracteres, los cuales se visualizan al
activar o desactivar los LEDs que este tiene, esto se hace conectando el comn a la tierra y voltaje en el segmento que
deseemos activar (en caso de ser ctodo comn).



Para poder representar los nmeros 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 informacin del numero, tendremos el valor que tomara el
puerto para mostrar el numero deseado a travs 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 estn conectados al mismo puerto del micro. Primero se mostrara las decenas mientras se desactiva
el display de las unidades y despus de una fraccin 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 impresin 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
comn del display, y este controlara el display activndolo o desactivndolo 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
saturacin, 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, //Segn su posicin del 0 al 9
0x79,
0x33,
0x5B,
0x5F,
0x70,
0x7F,
0x7B};
int mostrar(int numero){ //Creamos una funcin 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 posicin 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 posicin decenas
_delay_ms(5);
} return 0;
}
int main(void){ //Inicio del programa

DDRB=0xFF;
DDRD=0x03;

while(1){


mostrar(contador); //Llamar a la funcin 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 posicin del vector corresponde al nmero 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 posicin.

int mostrar(int numero){

Una funcin se declara como "tipo de dato" "nombre de la funcin" ( "tipo de dato" "nombre de entrada"), en este caso la
funcin 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;

Operacin 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 nmeros en la posicin unidades, si tomamos el ejemplo anterior,
unidades vala 5, si vamos al vector nmeros y vemos la quinta posicin, veremos un 0x5B la cual corresponde al nmero
5 en la tabla, esto es, que al mostrarlo por el puerto B aparecer el 5 en el display.

mostrar(contador);

Aqu se manda a llamar a la funcin mostrar, a la cual se le manda el valor de la variable contador, el cual puede ser un
numero del 0-99, al llamar la funcin, esta ejecutara todas las instrucciones que se encuentren dentro de la misma, al
terminar regresara y continuara con la siguiente instruccin.
CONTADOR 0-99 MPLAB
Cdigo del programa desarrollado en ensamblador con el programa MPLAB en el cual
se establece la rutina para que en un par de displays de 7 segmentos observemos el
conteo de 0 hasta 99.
;EXAMEN SEGUNDO PARCIAL
;ESTE PROGRAMA CONTABILIZA DE 0-99
;23 DE OCTUBRE DEL 2010
;JOS LUIS MORELES LOZANO
;***************************************************************
;***************************************************************
list p=16f877a
#include<P16f877a.inc>
errorlevel -302
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
ORG 0x0000
;Variables de retardo, nos permitirn apreciar el conteo evitando que se realice a
intervalos de tiempo muy rapidos.
valor1 equ h'21'
valor2 equ h'22'
valor3 equ h'23'
contador equ h'24'
;Hay que definir la asignacin de segmentos apagados o encendidos, estas variables
sern cargadas posteriormente.
; HEXADECIMAL BINARIO
CERO EQU h'3F' ; 01111110B
UNO EQU h'06' ; 01001000B
DOS EQU h'5B' ; 00111101B
TRES EQU h'4F' ; 01101101B
CUATRO EQU h'66' ; 01001011B
CINCO EQU h'6D' ; 01100111B
SEIS EQU h'7D' ; 01110111B
SIETE EQU h'07' ; 01001110B
OCHO EQU h'7F' ; 01111111B
NUEVE EQU h'6F' ; 01101111B
org 0h ;Reset
goto salidas

salidas:
clrf PORTB
clrf PORTC ;Limpia puertos B y C para determinar que son salidas
bsf STATUS,RP0
bcf STATUS,RP1
movlw h'0'
movwf TRISB
movwf TRISC
bcf STATUS,RP0 ;ir al Banco 0
INICIO:
clrf contador ;Inicia las decenas
clrf PORTC
LOOP:
movlw CERO ;carga a w el valor de cero
movwf PORTB
call RETARDO
movlw UNO
movwf PORTB
call RETARDO
movlw DOS
movwf PORTB
call RETARDO
movlw TRES
movwf PORTB
call RETARDO
movlw CUATRO
movwf PORTB
call RETARDO
movlw CINCO
movwf PORTB
call RETARDO
movlw SEIS
movwf PORTB
call RETARDO
movlw SIETE
movwf PORTB
call RETARDO
movlw OCHO
movwf PORTB
call RETARDO
movlw NUEVE
movwf PORTB
call RETARDO

incf contador,1 ;Incrementa contador de decenas
movlw h'A'
xorwf contador,w
btfsc STATUS,Z
goto INICIO

Decenas
movlw h'1'
xorwf contador,w
btfsc STATUS,Z
goto PRINT1

movlw h'2'
xorwf contador,w
btfsc STATUS,Z
goto PRINT2

movlw h'3'
xorwf contador,w
btfsc STATUS,Z
goto PRINT3

movlw h'4'
xorwf contador,w
btfsc STATUS,Z
goto PRINT4

movlw h'5'
xorwf contador,w
btfsc STATUS,Z
goto PRINT5

movlw h'6'
xorwf contador,w
btfsc STATUS,Z
goto PRINT6

movlw h'7'
xorwf contador,w
btfsc STATUS,Z
goto PRINT7

movlw h'8'
xorwf contador,w
btfsc STATUS,Z
goto PRINT8

movlw h'9'
xorwf contador,w
btfsc STATUS,Z
goto PRINT9


;Decenas en el display
PRINT1:
movlw UNO
movwf PORTC
goto LOOP
PRINT2:
movlw DOS
movwf PORTC
goto LOOP
PRINT3:
movlw TRES
movwf PORTC
goto LOOP
PRINT4:
movlw CUATRO
movwf PORTC
goto LOOP
PRINT5:
movlw CINCO
movwf PORTC
goto LOOP
PRINT6:
movlw SEIS
movwf PORTC
goto LOOP
PRINT7:
movlw SIETE
movwf PORTC
goto LOOP
PRINT8:
movlw OCHO
movwf PORTC
goto LOOP
PRINT9:
movlw NUEVE
movwf PORTC
goto LOOP

RETARDO
movlw h'40' ;Valor que genera un retardo
movwf valor1
tres movlw h'40'
movwf valor2
dos movlw h'40'
movwf valor3
uno decfsz valor3
goto uno
decfsz valor2
goto dos
decfsz valor1
goto tres
return
end

Potrebbero piacerti anche