Está en la página 1de 11

E.P.S.

de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

Ejemplo: Gestión de displays de 7 segmentos y matriz de leds

Se trata de realizar el diseño del programa encargado de gestionar dos


displays de siete segmentos y una matriz de led por barrido.

Se añade a la tarjeta de prácticas PICDEM2, una placa de circuito impreso


que dispone de 2 displays de 7 segmentos y una matriz de diodos led de
acuerdo con el esquema adjunto.

Desde el momento del arranque del programa (reset), se ejecutan dos


acciones independientes:

• En los displays de 7 segmentos aparece el número de veces que se actuó


sobre el pulsador conectado al pin 2 del puerto C (RC2) de la PICDEM2.
Si el pulsador está accionado, el nivel de tensión es nulo y si está libre es
de 5V

• En la matriz de led van apareciendo los números del 0 al 9 de modo


secuencial y cíclico, manteniéndose cada dígito estable durante un
segundo

En la PICDEM2 se emplea un oscilador RC que proporciona una frecuencia de


2,8 MHz y el diseño se basa en el empleo de un microcontrolador
PIC16C65B.

A continuación se adjunta el esquema de la placa adicional

Pag. -1-
10Ω
MATRIZ DE LED:
KINBRIGHT TC12

Conector Vertical 11=4


7 6 4 2 1 9 10 7 6 4 2 1 9 10
en la Placa F1 9
abcdefg abcdefg
F2 14
E.P.S. de Ingeniería de Gijón

Control col.1 (c1) a


RD6 F3 8
c2 f b

12=5
F4 5
RD5 g DISPLAYS:
F5 1
c3 KINBRIGHT
RD4 F6 7 e c SC08-11HWA
c4 F7 2 d
RD3 c1 c2 c3 c4 c5 dp dp
39Ω
c5 13 3 4 10 6 3 8 5 3 8 5
RD2
D.dec. 16 15 14 13 12 11 10
RD1
RD0 D.un. ULN2003A
gnd
Conector Horizontal
en la Placa
1
2 3 4 5 6 7 8
dp
f/F6
c/F3
a/F1

d/F4
b/F2

e/F5

g/F7
Ejemplos de Programas con Microcontroladores PIC

Pag. -2-
RB5
RB4
RB3
RB1
RB0

RB6

RB7
RB2
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

Planteamiento:

Se efectuará un barrido continuo de los displays de 7 segmentos y de las


columnas de la matriz de led. Se dispondrá de sendas posiciones donde se
recogen los dígitos a representar en los displays (unidades y decenas) y en
la matriz de led. A dichas posiciones se acederá para conocer qué es lo que
hay que representar en cada secuencia de barrido.

Para realizar las temporizaciones correspondientes al barrido, se empleará


el temporizador TMR0

La modificación de los displays de 7 segmentos se realizará a medida que se


detecten las nuevas pulsaciones realizadas sobre RC2. La modificación del
dígito presente en la matriz de led se realizará por incrementos cada
segundo que serán detectados por las interrupciones que genere el
temporizador TMR1 (si es que son posibles)

Temporización máxima con TMR1:

Tmax = (4/2,8MHz) * 8 * 65536 = 0,7489 s

A la vista de que no es posible alcanzar 1s, se realizarán temporizaciones


parciales de 0,5s y se contabilizarán, cada 2 interrupciones, un total de 1s.

0,5s = (4/2,8MHz) * 8 * (65536-Precarga)

Despejando:

Precarga = 21786 = 0x551A

Diagrama de Bloques a Implementar:

INICIALIZACIÓN

BARRIDO DE DISPLAYS
INTERRUPCIÓN TMR1
(CADA 0,5S) BARRIDO DE MATRIZ DE LED

EXPLORACIÓN DE RC2

Pag. -3-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

INICIALIZACIÓN

• PORTB y PORTD como salidas, resto entradas


• TMR0: como temporizador, asignación del prescaler con valor 256
para temporizar posteriormente milisegundos en el barrido
• TMR1: como temporizador, prescaler de 8 y parado al principio
• Activación de Interrupciones de TMR1, máscaras: TMR1IE, PEIE,
GIE
• Carga inicial de las variables de usuario globales:
TIEMPO (dígito a sacar en la matris de leds)
DISPLAYS (dígitos a sacar en los displays de 7 segmentos)
MEDIOS (contador de medios segundos)
• Precarga de TMR1H y TMR1L y puesta en marcha

BARRIDO DE DISPLAYS

• Se activa sólo el display de unidades (RD0=1 y resto PORTD a 0)


• Se extraen las unidades a representar
• Se llama al subprograma CONTROL DE LED con W con el valor de
las unidades
• Espera de 5 ms cargando en W la precarga necesaria y llamando al
subprograma ESPERA
• Se activa sólo el display de las unidades
• Se extrae de DISPLAYS las decenas a representar y se cargan en
W, si es cero, se carga 0x0A en W
• Se llama al subprograma CONTROL DE LED con W con el valor de
decenas
• Espera de 5 ms cargando en W la precarga necesaria y llamando al
subprograma ESPERA

SUBPROGRAMA CONTROL DE LED: Se encarga de representar en 7


segmentos, el dígito BCD que se encuentra en los 4 bits más bajos del
registro W. Si se quiere sacar un “blanco” se cargará en W 0x0A

• Se suma W con el PCL para obtener de una tabla la representación


de los números 0 a 9 en 7 segmentos
• Salimos de la tabla llevando en W el código y lo sacamos al PORTB
• Retorno de subprograma

Pag. -4-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

BARRIDO DE MATRIZ DE LED

• Se inicializa el contador de la columna de barrido (COL=0) y el


contador de rotaciones para barrer toda la matriz (ROTAR=5)
• Se activa sólo la columna de la izquierda
• Se llama al subprograma TABLA DE LED POR COLUMNAS
• Se sacan al PORTB los leds a iluminar en esa columna
• Espera de 1 ms cargando en W la precarga necesaria y llamando al
subprograma ESPERA
• Incrementamos contador de columnas
• Activamos siguiente columna haciendo una rotación a la derecha en
PORTD
• Decrementamos el contador de rotaciones y si es cero se acabó el
barrido de la matriz y retornamos del subprograma
• Si no es cero volvemos arriba

SUBPROGRAMA TABLA DE LED POR COLUMNAS: Este subprograma toma


dos variables como entradas: TIEMPO (dígito a representar en la matriz de
led) y COL (columna que está activa en ese momento en el barrido) 7y
genera la activación de los led de esa columna y para ese número

• Se dispone de una tabla por columnas y números del 0 al 9, de


modo que cada número ocupa 5 posiciones asociadas a sus columnas
• Se toma la variable almacenada en TIEMPO, se la multiplica por 5
y se le suma la columna activa para calcular el desplazamiento en la
tabla y obtener la salida al PORTB

EXPLORACIÓN DE TECLA RC2

Si RC2==0 (tecla pulsada) entonces


Si en la anterior exploración estaba libre (LIBRE=1) entonces
Se marca como pulsada (LIBRE=0)
Se llama a subprograma SUMA
si no
Se marca la tecla como libre para la siguiente exploración
(LIBRE=1)

SUBPROGRAMA DE SUMA: se encarga de incrementar la variable


DISPLAYS realizando el ajuste a una representación en BCD

• Incrementamos DISPLAYS en una unidad


• Se extraen los 4 bits más bajos de DISPLAYS

Pag. -5-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

• Si éstos han alcanzado el valor 0x0A entonces


corregimos a BCD sumando 0x06 al total
• Realizamos la misma verificación sobre las decenas, si llegaron a
0xA, las ponemos a cero
• Retornamos de subprograma

SUBPROGRAMA DE ESPERA: en el barrido de displays y de la matriz de


led, se emplean dos temporizaciones distintas debido a la diferente
persistencia visual que presentan los led de los segmentos y los de la matriz
de led. Para los displays, se retiene la activación durante 5ms y para las
columnas de la matriz de led durante 1ms. Para tener un subprograma
común, se llama a ESPERA con distintos valores de precarga para TMR0, que
se transfiere mediante el registro W.

Para 1ms: 1ms = (4/2,8MHz)*256*(256-PR1) -> PR1=253 (0xFD)


Para 5ms: 5ms = (4/2,8MHz)*256*(256-PR5) -> PR5=242 (0xF6)

• Se pone a 0 el flag de desbordamiento de TMR0 (T0IF)


• Se precarga TMR0 con el valor actual de W
• Se espera a que T0IF=1 para retornar

PROGRAMA DE TRATAMIENTO DE LA INTERRUPCIÓN DE TMR1

• Se verifica el motivo TMR1IF=1, si no retorno de interrupción


• Se salva el contexto del programa principal (W y STATUS)
• Precargamos TMR1H y TMR1L
• Se incrementa el contador de medios segundos (MEDIOS)
• Si MEDIOS == 20 entonces (han pasado 10s)
• MEDIOS=0
• Obtenemos el contador de segundos dividiendo por 2 el de medios
segundos (desplazando a la derecha MEDIOS en binario) y lo
cargamos en la posición TIEMPO
• Ponemos el flag TMR1IF a cero
• Recuperamos el contexto (W y STATUS)
• Retorno de subprograma de tratamiento

Pag. -6-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

Código Fuente del Ejercicio

;*************************************************************************
; Ejemplo de manejo de dos displays de siete segmentos por barrido
; y de una matriz de led que representa los números del 0 al 9
;
; Inicialmente en el fichero dsp&mtz.asm
; Autor: Fernando Nuño García
;
;*************************************************************************
;
; En los displays aparecerá el número de veces que se actuó sobre el
; pulsador conectado a RC2 desde el momento que se hace RESET,
; mientras que en la matriz de led aparecen los números del 0 al 9
; permaneciendo 1 seg cada uno de ellos
;
; Se emplea una placa auxiliar que se conecta a la PICDEM2 y que tiene
; displays y matriz conectados en paralelo al puerto B y con control
; de la habilitacion por medio del CI ULN2003 y el puerto D
;

list p=16C65B ;Microcontrolador PIC16C65B


include "p16c65b.inc"

DISPLAYS EQU 0x20 ;Posición de almacenamiento de displays


LIBRE EQU 0X21 ;Indicará si se liberó el pulsador una vez tocado
AUX EQU 0x22 ;Posición auxiliar

TIEMPO EQU 0x23 ;Contabiliza segundos transcurridos


COL EQU 0x24 ;Columna a representar
ROTAR EQU 0x25 ;Posición a rotar
W_temp EQU 0x26 ;Salvaguarda de W en interrupción
ST_temp EQU 0x27 ;Salvaguarda de STATUS en interrupción

MEDIOS EQU 0x28 ;Variable de acumulación de medios segundos que


;es lo máximo que se puede temporizar con TMR1 y con el oscilador que tenemos

org 0 ;Vector de RESET


goto INICIO

org 4 ;Vector de interrupción para las generadas


goto TEMPO ;por TMR1

;*****************************************************************************
;Subprograma que, a partir del dato (en posición TIEMPO) y de la columna que
;toca representar, saca los led a iluminar
;
;Lo situamos al principio porque maneja una tabla grande y así aseguramos
;que no hay problemas con el manejo del PCLATH
;
LEDMTZ movf TIEMPO,W ;Se toma el número a representar
movwf AUX ;y se le pasa a posición AUX
bcf STATUS,C ;Puesto a cero del carry
rlf AUX ;Nos desplazamos en la tabla multiplicando
rlf AUX ;por 5 el dato y sumamos el n£mero de la
addwf AUX,W ;columna a representar
addwf COL,W ;a continuaci¢n
addwf PCL,f ;Sumamos a PC y volvemos con W conteniendo
;la informaci¢n sobre los displays a iluminar

;Tabla para que la fila superior se controle con RB0 y así sucesivamente
;hasta que la fila inferior se controle con RB6

ELCERO retlw b'00111110'


retlw b'01000001'
retlw b'01000001'
retlw b'01000001'
retlw b'00111110'
ELUNO retlw b'01000100'
retlw b'01000010'
retlw b'01111111'
retlw b'01000000'
retlw b'01000000'
ELDOS retlw b'01100010'

Pag. -7-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

retlw b'01010001'
retlw b'01001001'
retlw b'01000101'
retlw b'01000010'
ELTRES retlw b'00100010'
retlw b'01000001'
retlw b'01001001'
retlw b'01001001'
retlw b'00110110'
ELCUATRO retlw b'00011000'
retlw b'00010100'
retlw b'00010010'
retlw b'01111111'
retlw b'00010000'
ELCINCO retlw b'00100111'
retlw b'01000101'
retlw b'01000101'
retlw b'01000101'
retlw b'00111001'
ELSEIS retlw b'00111100
retlw b'01001010
retlw b'01001001
retlw b'01001001
retlw b'00110010
ELSIETE retlw b'00000001'
retlw b'00000001'
retlw b'01111001'
retlw b'00000101'
retlw b'00000011'
ELOCHO retlw b'00110110'
retlw b'01001001'
retlw b'01001001'
retlw b'01001001'
retlw b'00110110'
ELNUEVE retlw b'00000110'
retlw b'01001001'
retlw b'01001001'
retlw b'00101001'
retlw b'00011110'
;Final de la tabla de números por columnas

;Inicio del programa principal con la Inicialización

INICIO bsf STATUS,5 ;Pasamos al banco 1 de datos


clrf TRISB ;Puerto B se programa como salida
clrf TRISD ;Puerto D como salidas

movlw b'11000111' ;TMR0 como temporizador y prescaler de 256


movwf OPTION_REG ;asignado a TMR0 para esperas de 5ms
;el oscilador es RC y de 2.8MHz

movlw 0x01
movwf PIE1 ;Activamos interrupciones de TMR1

bcf STATUS,5 ;Volvemos al banco 0 de datos

clrf PORTB ;Puesta a cero inicial de la salida

clrf TIEMPO ;Puesta a cero del contador de tiempo


clrf MEDIOS ;Puesta a cero de contador de medios segundos
;Inicializacion de la representación en
clrf DISPLAYS ;los dos displays

movlw 0x01 ;Inicialización del estado previo del


movwf LIBRE ;pulsador (estará libre inicialmente)

;Interrupciones desactivadas tras el RESET, debemos programar interrupciones


;del TMR1

movlw 0x30 ;Inicialmente parado TMR1


movwf T1CON ;Programación de TMR1, con prescaler a 8
movlw 0xC0
movwf INTCON ;Máscara global de interrupciones y la de
;los periféricos habilitadas
movlw 0x55
movwf TMR1H ;Precarga del TMR1 para que "tarde" 0.5 seg
movlw 0x1A ;en generar una interrupción

Pag. -8-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

movwf TMR1L ;con oscilador de 2.8MHz


bcf PIR1,TMR1IF ;Ponemos a cero el flag de overflow de TMR1
bsf T1CON,0 ;Ponemos en marcha el TMR1

BARR_DSP movlw 0x01 ;Activamos el display de unidades con


movwf PORTD ;el bit RD0

movlw 0x0F ;Extraemos las unidades a representar


andwf DISPLAYS,W ;se cargan en W y se llama al subprograma
call SACALED ;que controla los 7 diodos led

movlw 0xF6 ;Precarga en W para 5 mseg


call ESPERA ;Esperaremos durante 5 mseg

movlw 0x02 ;Activamos el display de decenas


movwf PORTD ;con RD1

movlw 0xF0 ;Extraemos las decenas a representar


andwf DISPLAYS,W ;y se cargan en W, pero si las decenas

btfsc STATUS,2 ;son cero se representa un blanco (codigo A)


movlw 0xA0 ;en todos los led
movwf AUX ;se lo pasamos a traves de la
swapf AUX,W ;variable AUX

call SACALED ;llamada al programa de control de los led

movlw 0xF6 ;Precarga en W para 5 mseg


call ESPERA ;Retenemos durante otros 5 mseg

;Barrido de la matriz de diodos emisores de luz (LED)

CALL MATRIZ ;Se llama al subprograma encargado del barrido

;Exploración de tecla RC2

btfsc PORTC,2 ;si está a cero RC2, está pulsada


goto SIGUE ;si está a uno está suelta y seguimos
btfss LIBRE,0 ;si LIBRE<0> está a cero es que no se
;liberó desde la última pulsación
goto BARR_DSP ;y volvemos al barrido de los displays

bcf LIBRE,0 ;En caso contrario, es la primera vez que se


;detecta la tecla pulsada, se marca la
;retención poniendo un 0 en LIBRE<0>
call SUMA ;Incrementamos el contador
goto BARR_DSP ;y volvemos al barrido de los displays

SIGUE bsf LIBRE,0 ;Si se liberó la tecla, lo marcamos


goto BARR_DSP ;y volvemos al barrido

;Final de la exploración de tecla

;******************************************************************************
;Subprograma de suma con ajuste a dígitos decimales

SUMA incf DISPLAYS ;Incrementamos el contador


movlw 0x0F ;Extraemos los 4 bits mas bajos
andwf DISPLAYS,W ;de los DISPLAYS
movwf AUX
movlw 0x0A ;Vemos si nos hemos salido del rango decimal
xorwf AUX,W ;para las unidades
btfss STATUS,Z ;Si z=1, coincide con 1010 en binario
return
AJUSTE movlw 0x06 ;y debemos de realizar un ajuste decimal
addwf DISPLAYS,1 ;sumando 6
movlw 0xF0 ;Extraemos los 4 bits más altos
andwf DISPLAYS,W ;de los DISPLAYS
movwf AUX
movlw 0xA0 ;Hacemos lo mismo con las decenas
xorwf AUX,W ;Si hemos llegado a 1010 (A)
btfss STATUS,Z
return
clrf DISPLAYS ;debemos de poner a cero los displays
return
;Final del subprograma de suma
;******************************************************************************

Pag. -9-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

;Subprograma para el control de los diodos led


;Recibe en los cuatro ultimos bits de W el digito a representar: del 0 al 9
;también puede ser un "blanco" (código A en hexadecimal)

SACALED call TABLA ;Vamos a la tabla para volver en W con


movwf PORTB ;lo que hay que sacar por el Puerto B
return

TABLA addwf PCL,f ;Suma del PC con el d¡gito a representar (en W)


retlw 0x3F ;Para el cero
retlw 0x06 ;el uno
retlw 0x5B ;el dos
retlw 0x4F ;el tres
retlw 0x66 ;el cuatro
retlw 0x6D ;el cinco
retlw 0x7D ;el seis
retlw 0x07 ;el siete
retlw 0x7F ;el ocho
retlw 0x6F ;el nueve
retlw 0x00 ;en blanco
;Final del subprograma de sacar los led
;******************************************************************************
;Subprograma de Espera que genera una pausa que depende del valor cargado
;en W, se emplea para retener la informaci¢n en los displays (5mseg)
;y para hacer el barrido de las columnas de la matriz de led (1mseg)

;Emplea el TMRO que tiene asignado el prescaler de 256


;se emplea un oscilador de 2.8MHz, luego para que haya overflow al cabo de
;5mseg necesitamos contar 5ms*2.8MHz/(4*256)=14 pulsos (aprox), luego la
;precarga ser de 256-14=242 que corresponde a F6 en hexadecimal

;Para que la espera sea de 1mseg, se deben contar aprox.3 pulsos, luego la
;precarga ser de 256-3=253 que corresponde a FD

ESPERA bcf INTCON,T0IF ;Ponemos a cero el flag de overflow


movwf TMR0 ;Realizamos la precarga
NOLLEGO btfss INTCON,T0IF ;Si se activo el flag volvemos del subprograma
goto NOLLEGO ;si no, seguimos esperando
return
;Final del subprograma de espera
;******************************************************************************
;SUBPROGRAMA DEDICADO AL BARRIDO DE LA MATRIZ DE LED

MATRIZ movlw 0x00 ;Inicialización de la columna


movwf COL ;de barrido

movlw 0x05 ;Inicialización del contador


movwf ROTAR ;de rotaciones

movlw 0x40 ;La primera columna, empezando por la izquierda


corresponde a RD6
movwf PORTD ;y la sacamos al puerto D

BARRMTZ call LEDMTZ ;Llamamos a la tabla de sacar los led, se


;retorna con el contenido en W y luego
movwf PORTB ;lo sacamos por el PORTB
movlw 0xFD ;Cargamos W para llamar a ESPERA de 1mseg
call ESPERA
incf COL ;Aumentamos el número de la columna a barrer
rrf PORTD ;Activamos la siguiente columna
decfsz ROTAR ;Decrementamos el contador de rotaciones
goto BARRMTZ ;Si no lo hemos hecho 5 veces repetimos
return ;si lo hemos hecho 5 veces salimos
;Salimos del subprograma de barrido de la matriz de led

;******************************************************************************
;Programa de tratamiento de la interrupci¢n generada por TMR1,
;se producirá cada 0.5 segundos (MEDIOS)

TEMPO btfss PIR1,0 ;Si entramos aquí¡ por otro motivo


retfie ;distinto a TMR1IF=1 salimos de inmediato

movwf W_temp ;Salvamos el registro W


swapf STATUS,W ;y el registro STATUS por
movwf ST_temp ;si acaso se manipulan para el principal

Pag. -10-
E.P.S. de Ingeniería de Gijón Ejemplos de Programas con Microcontroladores PIC

movlw 0x55 ;Volvemos a realizar la precarga de TMR1


movwf TMR1H ;Precarga del TMR1 para que "tarde" 0.5 seg
movlw 0x1A ;en generar una interrupci¢n
movwf TMR1L ;con oscilador de 2.8MHz

bcf PIR1,0 ;Ponemos a cero el flag TMR1IF


incf MEDIOS ;Incrementamos el contador de medios segundos
movlw 0x14 ;y vemos si ha llegado a 20 (0x14)
xorwf MEDIOS,W
btfsc STATUS,2 ;Comprobamos el estado de Z
clrf MEDIOS ;Si lleg¢ a 20, lo ponemos a cero
rrf MEDIOS,W ;Si no, en TIEMPO ir el contador de segundos
movwf TIEMPO ;dividiendo por 2 el de medios segundos

swapf ST_temp,W ;Recuperamos el contexto


movwf STATUS ;STATUS antiguo y
swapf W_temp,f ;W antiguo
swapf W_temp,W

retfie ;Retorno del programa de tratamiento de


;la interrupci¢n
;******************************************************************************
END ;del fichero

Pag. -11-

También podría gustarte