Autor Tema: Duda con display doble de 7 segmentos  (Leído 987 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Azteka

  • PIC10
  • *
  • Mensajes: 24
Duda con display doble de 7 segmentos
« en: 29 de Febrero de 2024, 04:05:01 »
Hola a todos. Solicito su ayuda, por favor, con el siguiente problema. Estoy desplegando el contenido de las variables "Hour" y "Minute" en displays INDIVIDUALES de 7 segmentos . Divido ambas variables en dos variables cada una, de manera que tengo dos dígitos para la hora, a los que llamo "HRS_DER" y "HRS_IZQ"; también la variable de los minutos la separo en dos dígitos a los que he llamado "MIN_DER" y "MIN_IZQ". Cada una de estas últimas variables las envío a un display individual de 7 segmentos. Hasta ahí todo funciona bien, pero ahora deseo reducir los cuatro display individuales de 7 segmentos a DOS DISPLAYS DOBLES DE 7 SEGMENTOS, un display doble para la hora y el otro para los minutos. El problema es que las instrucciones que me sirven para desplegar cada dígito por separado en un display individual no funcionan para DISPLAYS DOBLES. Ya he probado las ideas que se me han ocurrido, pero no logro hacerlo. Por favor, ¿alguien puede decirme cuales son las instrucciones correctas? Anexo el código en PBP que funciona para cuatro displays individuales. De antemano, mil gracias.

CÓDIGO
Código: [Seleccionar]
; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F628A, DISPLAYS DE 7 SEGMENTOS Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS

CMCON=7

define OSC 4

Symbol Hrs_button = PORTA.0     ; BOTON DE AJUSTE PARA HORAS
Symbol Mins_button = PORTA.1    ; BOTO0N DE AJUSTE PARA MINUTOS

Ticks VAR byte                  ; 61 ticks = 1 sec
Hour VAR byte
Minute VAR byte
Second VAR byte
Disp VAR byte                   ; Disp = 1 to ACTULIZA DISPLAYS
Delay VAR byte
 
TRISB = 0                       ; PORTB is SALIDA
TRISA = 3                       ; RA0,RA1 SON ENTRADAS

;VARIABLES A DESPLEGAR
MIN_DER VAR BYTE                ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO DERECHO
MIN_IZQ VAR BYTE                ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO IZQUIERDO

HRS_DER VAR BYTE                ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO DERECHO
HRS_IZQ VAR BYTE                ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO IZQUIERDO

; INICIALIZAR VARIABLES
Hour = 0
Minute = 0
Second = 0
Ticks = 0
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0
HRS_IZQ = 0

OPTION_REG = $05                ; prescaler = 64
ON INTERRUPT GOTO ISR           ; IR A RUTINA ISR
INTCON = $A0

;INICIO DEL PROGRAMA
PROG:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
IF Hrs_button = 0 THEN
   Hour = Hour + 1
IF Hour = 24 THEN Hour = 0
   Gosub Antirrebote
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
IF Mins_button = 0 THEN
   Minute = Minute + 1
IF Minute = 60 THEN Minute = 0
   Gosub Antirrebote
ENDIF

;RUTINA PARA MOSTRAR VALORES DE H:M:S
IF Disp = 1 THEN
   MIN_DER = Minute DIG 0
   MIN_IZQ = Minute DIG 1

   HRS_DER = Hour DIG 0
   HRS_IZQ = Hour DIG 1

   PORTB=224+MIN_DER
   PAUSE 50       
   PORTB=208+MIN_izq
   PAUSE 50
   
   PORTB=176+HRS_DER
   PAUSE 50
   PORTB=112+HRS_IZQ
   PAUSE 50
     
   Disp = 0
ENDIF
GOTO PROG

;RUTINA ANTIRREBOTE
Antirrebote:
FOR Delay = 1 To 200
    Pause 1
    NEXT Delay
    Disp = 1
RETURN

;RUTINA PARA EJECUCION DE UN SEGUNDO
DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate

;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
   Second = 0
   Minute = Minute + 1
IF Minute = 60 THEN
   Minute = 0
   Hour = Hour + 1
IF Hour = 24 THEN
   Hour = 0
ENDIF
ENDIF
ENDIF
Disp = 1                       

; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0
Resume
ENABLE
END

END

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Duda con display doble de 7 segmentos
« Respuesta #1 en: 29 de Febrero de 2024, 11:09:47 »
Que tal Azteka,

Podrías mostrar un esquemático de tu circuito con los displays individuales y luego uno con los displays dobles que quieres usar.
También podrías decirnos que tipos de displays estas usando, tanto los individuales como los dobles (ánodo común o cátodo común).

elreypic.

Desconectado Azteka

  • PIC10
  • *
  • Mensajes: 24
Re:Duda con display doble de 7 segmentos
« Respuesta #2 en: 02 de Marzo de 2024, 01:06:52 »
Que tal Azteka,

Podrías mostrar un esquemático de tu circuito con los displays individuales y luego uno con los displays dobles que quieres usar.
También podrías decirnos que tipos de displays estas usando, tanto los individuales como los dobles (ánodo común o cátodo común).

elreypic.

Hola, elreypic2, gracias por contestar. En ambos casos estoy empleando displays de 7 segmentos de Ánodo común. Probé al principio con el mismo programa que sí funciona con displays individuales, luego intenté algunos cambios que se ocurrieron, pero nada.  Te anexo los esquemáticos de ambos. Gracias por tu ayuda. Saludos.

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 23
Re:Duda con display doble de 7 segmentos
« Respuesta #3 en: 02 de Marzo de 2024, 17:26:26 »
demo proteus con proton
Código: [Seleccionar]
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F628A

Config FOSC_HS, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
Declare Xtal = 4
Declare Optimiser_Level = 3
Declare Bootloader off
Declare Float_Display_Type = Fast
Declare Dead_Code_Remove = 1        ' Remove dead code
Declare Watchdog = Off
Declare Create_Coff On

'Declare Reminders Off
'Declare Hints Off
'Declare Warnings Off
'Declare Auto_Variable_Bank_Cross = On
; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F628A, DISPLAYS DE 7 SEGMENTOS Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS

CMCON=7


Symbol Hrs_button = PORTA.0     ; BOTON DE AJUSTE PARA HORAS
Symbol Mins_button = PORTA.1    ; BOTO0N DE AJUSTE PARA MINUTOS

Dim Ticks As Byte                  ; 61 ticks = 1 sec
Dim Hour As  Byte
Dim Minute As  Byte
Dim Second As  Byte
Dim Disp As  Byte                   ; Disp = 1 to ACTULIZA DISPLAYS

PORTB= 0
TRISB = 0                       ; PORTB is SALIDA
TRISA = 3                       ; RA0,RA1 SON ENTRADAS

;VARIABLES A DESPLEGAR
Dim hab As Bit
Dim MIN_DER As  Byte                ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO DERECHO
Dim MIN_IZQ As  Byte                ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO IZQUIERDO

Dim HRS_DER As  Byte                ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO DERECHO
Dim HRS_IZQ As  Byte                ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO IZQUIERDO
Dim timer As Word

; INICIALIZAR VARIABLES
Hour = 0
Minute = 0
Second = 0
Ticks = 0
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0
HRS_IZQ = 0

OPTION_REG = 1                           ; prescaler = 2
On_Hardware_Interrupt GoTo Isr           ; IR A RUTINA ISR
INTCON = $A0

;INICIO DEL PROGRAMA
Do
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
If Hrs_button = 0 And timer = 0 Then
   timer = 500
   Inc Hour
   If Hour = 24 Then Hour = 0
   
EndIf

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
If Mins_button = 0 And timer = 0 Then
   timer = 500
   Inc Minute
If Minute = 60 Then Minute = 0
EndIf

If hab = 1 Then
   PORTB=$0f
   Select Case Disp
   Case 0
   MIN_DER =  Dig Minute,0
   PORTB=MIN_DER
   PORTB=PORTB|$80
   Case 1
   MIN_IZQ = Dig Minute,1
   PORTB=MIN_IZQ
   PORTB=PORTB|$40
   Case 2
   HRS_DER = Dig Hour,0
   PORTB=HRS_DER
   PORTB=PORTB|$20
   Case 3
   HRS_IZQ = Dig Hour,1
   PORTB=HRS_IZQ
   PORTB=PORTB|$10
   End Select
   Inc Disp
   Disp = Disp & 3
   hab = 0
 EndIf 
Loop

;RUTINA PARA EJECUCION DE UN SEGUNDO
Isr:
Context Save
If hab = 0 Then hab = 1
If timer>0 Then Dec timer
Inc Ticks
If Ticks < 61 Then NoUpdate

;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Inc Second
If Second = 60 Then
   Second = 0
   Inc Minute
If Minute = 60 Then
   Minute = 0
   Inc Hour
If Hour = 24 Then
   Hour = 0
EndIf
EndIf
EndIf
                       

; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
 
   
INTCON.2 = 0

Context Restore

End

« Última modificación: 02 de Marzo de 2024, 17:43:31 por Jiha »

Desconectado Azteka

  • PIC10
  • *
  • Mensajes: 24
Re:Duda con display doble de 7 segmentos
« Respuesta #4 en: 03 de Marzo de 2024, 01:41:25 »
Jiha, no entiendo tu mensaje.

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 23
Re:Duda con display doble de 7 segmentos
« Respuesta #5 en: 03 de Marzo de 2024, 08:55:54 »
El programa está funcionando modificado para proton basic y en reloj.zip está la simulación en proteus
« Última modificación: 05 de Marzo de 2024, 10:20:18 por Jiha »

Desconectado Azteka

  • PIC10
  • *
  • Mensajes: 24
Re:Duda con display doble de 7 segmentos
« Respuesta #6 en: 05 de Marzo de 2024, 03:22:27 »
Jiha, disculpa por tantas molestias pero, ¿podrías, por favor, enviarme la simulación en Proteus versión 8.7, o anterior? esa es la que tengo. Mil gracias.  :oops: :oops: :oops:

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 23
Re:Duda con display doble de 7 segmentos
« Respuesta #7 en: 05 de Marzo de 2024, 10:18:43 »
No tengo esa version, adjunto la version en isis 7.8 que se puede cargar en las versiones 8 de proteus

Desconectado Azteka

  • PIC10
  • *
  • Mensajes: 24
Re:Duda con display doble de 7 segmentos
« Respuesta #8 en: 06 de Marzo de 2024, 03:06:05 »
Hola, Jiha. ¿O se podría una imagen del esquemático, por favor? Gracias.

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 23
Re:Duda con display doble de 7 segmentos
« Respuesta #9 en: 06 de Marzo de 2024, 07:19:10 »
esquematico