Sie sind auf Seite 1von 6

1

2.4. Gestin directa de 3 o 4 displays de 7 segmentos


Cada display de 7 segmentos que se conecta a un micro requiere 7 pines de salida de
ste -para los 7 segmentos- y uno adicional si necesita activar el punto decimal. El convertidor
de cdigo BCD-7segmentos (7447) permite ahorrar 3 pines. En este apartado se
particularizar el diseo para el caso de 4 displays (la librera tambin puede configurarse
para el caso de 3 displays). Al conectar 4 displays, el nmero de pines de salida necesarios del
PIC seran 16 (excluyendo los puntos decimales de los displays). Es un nmero muy elevado
que deja al micro sin apenas pines de salida. En la prctica se comparten pines para crear un
bus con ellos, tal y como se muestra en la siguiente figura. El nmero de pines se reducen a
ocho: 4 de ellos (RB3-RB0) seran para el bus de datos y los otros cuatro (RB7-RB0) actuaran
sobre los interruptores (transistores nMOS 2N7000) que le dan tensin a cada display.
Introducir un nuevo display en el sistema solo consume un pin ms del PIC para el nuevo
interruptor.

El esquema elctrico de la figura anterior se representar en lo sucesivo por el siguiente


smbolo:

La informacin que hay en el bus llegara a todos los displays por lo que todos ellos
mostraran el mismo nmero. Para evitar que esto sea as lo que se hace es que en un
instante dado solo se enciende un display y el resto est apagado. A continuacin se rota
apagndose el display actual y encendindose el siguiente. Si el tiempo que pasa desde
que un display se apaga hasta que se vuelve a encender no supera los 32ms el ojo humano
se cree que est encendido aunque en la realidad est apagado las 3/4 partes del tiempo.

Serie 74HCxx

Por tanto, el objetivo de esta librera sera el diseo de una rutina de interrupcin peridica
que rotara el display iluminado cada 8ms segn se aprecia en la siguiente figura.
D3

D0

D1

D2

D0

D3

D1

8 ms

32 ms

2.4.1. Valor de la resistencia R


En principio debera haber una resistencia por cada display pero en el enunciado
aparece compartida por los 4 displays. Esto se debe a que en un instante dado solo se ilumina
uno de ellos. Para el clculo de la resistencia hay que tener presente los siguientes datos:
La intensidad promedio que circula por un led, de uno de los 7 segmentos que
tiene un display, debe ser de 5 mA para que se vea iluminado. Los displays se han
editado en PROTEUS para que este valor sea de 5mA y no el que traen de 10mA.
En un led caen 1,5V cuando circula corriente a su travs (iluminado).
El caso ms desfavorable es que se enciendan los 7 segmentos del display para
mostrar el nmero 8.
El valor de la resistencia disminuye si el nmero de displays que la comparten
aumenta. En este caso son 4 y eso implica que un display est encendido la cuarta
parte del tiempo. Por tanto, para que la intensidad promedio en un led sea de 5 mA
la intensidad que debe atravesarlo es de 20 mA.

R=

5V 1.5V (de un led )


= 25
20 mA * 7 segmentos (leds)

2.4.2. Programacin del TMR0 para generar interrupcin peridica cada 8ms
;
;
;
;
;
;
;

*
*
*
*
*
*
*

*************************************** *
Interr. Temporizacin cada 8ms (Fosc=4Mhz)
Tiempo= 4.Tosc.(256-TMR0).Preecalador
Si Tosc=0.25us (Fosc=4Mhz), TMR0=131
Tiempo= 4.(0.25us).(256-131).64= 8ms
*************************************** *

Preescalador= 1:64 ->

2.4.3. Diseo de la subrutina de servicio de la interrupcin peridica

Se utilizar la variable DisplaysDigitos para que almacene los dgitos de los displays.
La variable DisplaysEstado controlar qu display est actualmente iluminado as como el
nmero de ellos que estn habilitados para iluminarse. En la siguiente figura se muestra el
contenido que se les dar a estas variables para que muestren el nmero 527.
DisplaysDigitos[3]
DisplaysDigitos[2]
DisplaysDigitos[1]
DisplaysDigitos[0]

n+5
n+4
n+3
n+2

0
5
2
7

- display 3
- display 2
- display 1
- display 0

No se puede
iluminar

Posiciones
de memoria

DisplaysEstado[1]
DisplaysEstado[0]

n+1
n

Codifican que displays se pueden iluminar

Codifican el display actualmente iluminado

0 5 2 7

Display iluminado

Problema 16

La variable DisplaysEstado contiene toda la informacin necesaria para los


habilitadores. En esta aplicacin los habilitadores son los 4 pines ms significativos del puerto
B (RB7-RB4). Para simplificar la programacin conviene utilizar los 4 bits ms significativos
de la variable DisplaysEstado.
A continuacin se van a enumerar los diferentes pasos que debe realizar la rutina de
interrupcin que refresca peridicamente los displays. Esta rutina lee el contenido tanto de la
variable DisplaysDigitos como de la variable DisplaysEstado pero slo modifica el contenido
de los 4 bits ms significativos de la variable DisplaysEstado[0] para actualizarlos.
El tiempo correspondiente a un display que no est habilitado se programar de forma
que todos los displays estn apagados en ese turno. El motivo es que la resistencia se ha
calculado para que un display est encendido la cuarta parte del tiempo. No se saltaran turnos
cuando un display no est habilitado.
INTERRUPCION

rotar4Displays

T0IF = 0
TMR0= 131

Apaga todos
los displays

call rotar4Displays

RB7-RB4= 0000

Desplaza una posicin a


la derecha los bits de la
variable
DisplaysEstado[1]

DisplaysEstado[0]<< 1

retfie

No hay ningn display a


iluminar?

DisplaysEstado[0]=
00000000?

No

Si

DisplaysEstado[0]=0001 0000

El display a iluminar
est habilitado?

(DisplaysEstado[0]
No
&
DisplaysEstado[1])
00000000
?
Todos los displays
Si

apagados al principio
de este diagrama:
RB7-RB4= 0000

RB3-RB0= aaaa
RB7-RB4= bbbb

return

2.4.4. Aplicacin para mostrar el nmero 6750 con 4 displays compartiendo lneas
; * *************************************** *
; * Encabezados
*
; * *************************************** *
LIST
P=16F84A
INCLUDE
<P16F84A.INC>
__CONFIG
_CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

;
;
;
;
;
;
;

*
*
*
*
*
*
*

*************************************** *
Interr. Temporizacin cada 8ms (Fosc=4Mhz)
Tiempo= 4.Tosc.(256-TMR0).Preecalador
Si Tosc=0.25us (Fosc=4Mhz), TMR0=131
Tiempo= 4.(0.25us).(256-131).64= 8ms
*************************************** *

; * *************************************** *
; * Constantes
*
; * *************************************** *
#define TMR0_carga d'131'

Preescalador= 1:64 ->

Serie 74HCxx

4
; * *************************************** *
; * Variables globales
*
; * *************************************** *
CBLOCK 0x0C
DisplaysEstado:2
DisplaysDigitos:4
W_TEMP, STATUS_TEMP, FSR_TEMP, PCLATH_TEMP
ENDC
; * *************************************** *
; * Macros
*
; * *************************************** *
; PUSH: guarda temporalmente W, STATUS y PCLATH
PUSH MACRO
MOVWF
W_TEMP
;Guarda el valor de W
SWAPF
STATUS,W
MOVWF
STATUS_TEMP
;guardo el registro STATUS
MOVF
PCLATH,W
MOVWF
PCLATH_TEMP
;GUARDA PCLATH
CLRF
PCLATH
;APUNTA A PAGINA 0
MOVF
FSR,W
MOVWF
FSR_TEMP
;Guarda registro FSR
ENDM
; PULL: restaura W, STATUS y PCLATH
PULL MACRO
MOVF
FSR_TEMP,W
;Copia en W el registro FSR
MOVWF
FSR
;Lo restaura
MOVF
PCLATH_TEMP,W
;RECUPERA PCLATH
MOVWF
PCLATH
SWAPF
STATUS_TEMP,W
;restauro el registro STATUS
MOVWF
STATUS
SWAPF
W_TEMP,F
;restauro el registro W
SWAPF
W_TEMP,W
ENDM
; * *************************************** *
; * Vector de interrupcin: RESET
*
; * *************************************** *
ORG
0
; El programa comienza en la direccin 0.
goto inicio
; * *************************************** *
; * Vector de interrupcin: INTERRUPCION
*
; * *************************************** *
ORG
4
PUSH
; Macro que guarda W, STATUS y PCLATH
call INTERRUPCION
PULL
; Macro que restaura W, STATUS y PCLATH
retfie
; * *************************************** *
; * Mdulo inicial
*
; * *************************************** *
inicio
clrw
; w=0
movwf
PORTA
; PORTA= b'00000000' before we enable it.
movwf
PORTB
; PORTB= b'00000000' before we enable it.
;-------------------bsf
STATUS,RP0
; Acceso Banco 1. RP0='1'
;-------------------clrf

TRISB

bcf
bcf
bsf
bcf
bsf

OPTION_REG,PSA
OPTION_REG,T0CS
OPTION_REG,PS2
OPTION_REG,PS1
OPTION_REG,PS0

bcf
movlw
movwf

STATUS,RP0
TMR0_carga
TMR0

;-------------------bcf
STATUS,RP0
;--------------------

; RB0-PB7 sern de salida.


;
;
;
;
;

PSA= '0'. El Divisor de frecuencia se asigna al TMR0


T0CS='0'. Utiliza Fosc/4 para temporizar
PS2= '1'.
PS1= '0'.
PS0= '1'. Preescalador a 1:256

; Back to bank 0

; Acceso Banco 0.

RP0='0'

Problema 16

bsf
bsf

INTCON,T0IE
INTCON,GIE

; T0IE='1'. Activa mscara local de la interrupcin T0


; GIE= '1'. Activa mscara global de interrupciones

clrf
clrf

DisplaysEstado+0
DisplaysEstado+1

; DisplaysEstado[0]= b'00000000'
; DisplaysEstado[1]= b'00000000'

bsf

DisplaysEstado+0,4

; Primer bit visible

movlw
movwf

b'11110000'
DisplaysEstado+1

; Los 4 displays pueden verse cuando les toque el turno

; Dgitos que se mostrarn en los displys: 6750


clrf
DisplaysDigitos+0
; DisplaysDigitos[0]= 0
movlw d'5'
movwf DisplaysDigitos+1
; DisplaysDigitos[1]= 5
movlw d'7'
movwf DisplaysDigitos+2
; DisplaysDigitos[2]= 7
movlw d'6'
movwf DisplaysDigitos+3
; DisplaysDigitos[3]= 6
; * *************************************** *
; * Mdulo Principal. Bucle infinito
*
; * *************************************** *
inf
nop
goto
inf
; * *************************************** *
; * Rutina de atencin a la interrupcin
*
; * *************************************** *
; =======================================================
; INTERRUPCION
;
- Si T0IF='1' llama a la rutina INTERRUPCION_T0I
; =======================================================
INTERRUPCION
btfss INTCON,T0IF
; T0IF='1'?
goto INTERRUPCION1
;
No. Bajar otras banderas ya que T0IF='0'
call INTERRUPCION_T0I
;
Si. Ejecutar rutina ya que T0IF='1'
goto INTERRUPCION9
; Salir
INTERRUPCION1
bcf
INTCON,INTF
bcf
INTCON,RBIF
INTERRUPCION9
return

; Bandera INTF='0'
; Bandera RBIF='0'

; =======================================================
; INTERRUPCION_T0I
;
- Ocurre cada vez que desborda TMR0 (pasa de 255 a 0)
;
- Tiempo= 4.(0.25us).(256-131).64= 8ms
;
- Baja la bandera que origin esta interrupcin (T0IF)
; =======================================================
INTERRUPCION_T0I
;--------------------call
rotar4Displays
;--------------------movlw
TMR0_carga
movwf
TMR0
; TMR0=131
bcf
INTCON,T0IF
; T0IF=0 (bandera)
return
; ===========================================
; rotar4Displays
;
; ===========================================
rotar4Displays
movlw
b'00001111'
andwf
PORTB,F
; RB4-RB7=0000 -> apaga los 4 displays
bcf
STATUS,C
; Este bit se introduce por la derecha. A '0'
rlf
DisplaysEstado+0,F
; rota el bit de la variable DisplaysEstado[0]
btfss
STATUS,C
goto
rotar4Displays1
bsf
DisplaysEstado+0,4
; displaysEstado[0](bit 4)=1
rotar4Displays1
movf
DisplaysEstado+0,W
andwf
DisplaysEstado+1,W
; DisplaysEstado[0] & DisplaysEstado[1]

Serie 74HCxx

6
btfsc
goto

STATUS,Z
rotar4Displays9

btfsc
DisplaysEstado+0,4
movf
DisplaysDigitos+0,W
btfsc
DisplaysEstado+0,5
movf
DisplaysDigitos+1,W
btfsc
DisplaysEstado+0,6
movf
DisplaysDigitos+2,W
btfsc
DisplaysEstado+0,7
movf
DisplaysDigitos+3,W
iorwf
DisplaysEstado+0,W
movwf
PORTB
rotar4Displays9
return
END

; (W)=(W) OR DisplaysEstado[0]
; PORTB= (W)

Das könnte Ihnen auch gefallen