Contador con PIC16F628 y salida a display de 7 segmentos

#1
Hola expertos necesito una pequeña ayuda necesito realizar un programa tal que: a) Al apretar una tecla ejemplo A incremente el valor mostrado en un DISPLAY de 7 segmentos a una frecuencia de 1 hz. b) Al apretar otra tecla ejem D decremente el DISPLAY. c) Al apretar otra ejem C el DISPLAY se hará cero. ayuda con el asm....
Muchas gracias ......
 
#2
yo en una de esas si queres te puedo pegar una mano con el código pero en c porque el asm no lo manejo bien todavía
 
#6
Hola este es un pequeño programa espero que te sirva, te mando ambos codigos en C y en Assembler y la simulacion en proteus.

Código:
#include <16f628a.h>
#use delay (clock=4000000)
#byte portb=0x06
#byte porta=0x05

#bit ra0=0x05.0
#bit ra1=0x05.1
#bit ra2=0x05.2

void main()
{
 set_tris_a(255);
 set_tris_b(0);
 
 portb=0;
 while(1)
 {
  if(ra0==0)
  {
   portb++;
   delay_ms(300);
   if(portb==9)
    portb=0;
  }
  if(ra1==0)
  {
  if (portb==0){
    portb=0b00001001;
     delay_ms(300);}
   else
   portb--;
   delay_ms(300);
   
  }
  if(ra2==0)
  {
   portb=0;
   delay_ms(300);
  } 
 }
} 


Ahora en Assembler:

ROM used: 85 words (4%)
                         Largest free fragment is 1963
               RAM used: 7 (3%) at main() level
                         8 (4%) worst case
               Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   019
0003:  NOP
.................... #include <16f628a.h> 
.................... //////// Standard Header file for the PIC16F628A device //////////////// 
.................... #device PIC16F628A 
.................... #list 
....................  
.................... #use delay (clock=4000000) 
0004:  MOVLW  22
0005:  MOVWF  04
0006:  BCF    03.7
0007:  MOVF   00,W
0008:  BTFSC  03.2
0009:  GOTO   018
000A:  MOVLW  01
000B:  MOVWF  78
000C:  CLRF   77
000D:  DECFSZ 77,F
000E:  GOTO   00D
000F:  DECFSZ 78,F
0010:  GOTO   00C
0011:  MOVLW  4A
0012:  MOVWF  77
0013:  DECFSZ 77,F
0014:  GOTO   013
0015:  GOTO   016
0016:  DECFSZ 00,F
0017:  GOTO   00A
0018:  RETLW  00
.................... #byte portb=0x06 
.................... #byte porta=0x05 
....................  
.................... #bit ra0=0x05.0 
.................... #bit ra1=0x05.1 
.................... #bit ra2=0x05.2 
....................  
.................... void main() 
.................... { 
0019:  CLRF   04
001A:  BCF    03.7
001B:  MOVLW  1F
001C:  ANDWF  03,F
001D:  MOVLW  07
001E:  MOVWF  1F
....................  set_tris_a(255); 
001F:  MOVLW  FF
0020:  TRIS   5
....................  set_tris_b(0); 
0021:  MOVLW  00
0022:  TRIS   6
....................   
....................  portb=0; 
0023:  CLRF   06
....................  while(1) 
....................  { 
....................   if(ra0==0) 
0024:  BTFSC  05.0
0025:  GOTO   032
....................   { 
....................    portb++; 
0026:  INCF   06,F
....................    delay_ms(300); 
0027:  MOVLW  02
0028:  MOVWF  21
0029:  MOVLW  96
002A:  MOVWF  22
002B:  CALL   004
002C:  DECFSZ 21,F
002D:  GOTO   029
....................    if(portb==9) 
002E:  MOVF   06,W
002F:  SUBLW  09
0030:  BTFSC  03.2
....................     portb=0; 
0031:  CLRF   06
....................   } 
....................   if(ra1==0) 
0032:  BTFSC  05.1
0033:  GOTO   049
....................   { 
....................   if (portb==0){ 
0034:  MOVF   06,F
0035:  BTFSS  03.2
0036:  GOTO   041
....................     portb=0b00001001; 
0037:  MOVLW  09
0038:  MOVWF  06
....................      delay_ms(300);} 
0039:  MOVLW  02
003A:  MOVWF  21
003B:  MOVLW  96
003C:  MOVWF  22
003D:  CALL   004
003E:  DECFSZ 21,F
003F:  GOTO   03B
....................    else 
0040:  GOTO   042
....................    portb--; 
0041:  DECF   06,F
....................    delay_ms(300); 
0042:  MOVLW  02
0043:  MOVWF  21
0044:  MOVLW  96
0045:  MOVWF  22
0046:  CALL   004
0047:  DECFSZ 21,F
0048:  GOTO   044
....................     
....................   } 
....................   if(ra2==0) 
0049:  BTFSC  05.2
004A:  GOTO   053
....................   { 
....................    portb=0; 
004B:  CLRF   06
....................    delay_ms(300); 
004C:  MOVLW  02
004D:  MOVWF  21
004E:  MOVLW  96
004F:  MOVWF  22
0050:  CALL   004
0051:  DECFSZ 21,F
0052:  GOTO   04E
....................   }  
....................  } 
0053:  GOTO   024
.................... }  
0054:  SLEEP

Configuration Fuses:
   Word  1: 3F73   NOWDT PUT NOPROTECT BROWNOUT MCLR NOLVP RC NOCPD
 

Adjuntos

#8
muchas gracias gemetzelgott me sirvio mucho tu programa, ademas le hice un cambio porque el 7448 cuenta hasta 16 y yo puse el 4511 cmos porque este cuenta hasta 9.
y le hice un cambio al prgrama por que cuando contaba hacia arriba y te detienes , y sigues para abajo desde 8 o 9
y vuelves a subir el display te muestra 10 para arriba pero en caracteres errados propios del 7448.
de todas modos esta genial este programa.
me costo corregirlo porque yo manejo mas asm .
si no fuera mucha la patudez podrias hacer un pograma para 4 segmentos?
 

Adjuntos

#10
Hola a todos, estoy trabajando con un proyecto parecido al del amigo aggonzal, solo que este cuenta hata 99. Ya llevo una buena parte, sin embargo, estoy pegado con una condición, paso a describirla. El contador debe ascender cada vez que pulse un pulsador digamos en RC0, esto está bien por lo que llevo, pero he aquí donde encuentro el problema, debo implementar un switch digamos en RE0 que si normalmente está abierto, permite que cada vez que presione el pulsador el contador funcione de forma ascendente, pero si lo cierro, cada vez que pulse nuevamente el pulsador el contador descienda, digamos de 99 a 0. Si me pueden ayudar, les agradezco mucho. Saludos.
 

Temas similares

Arriba