Vous êtes sur la page 1sur 8

Microprocesadores

Ejemplo del uso de las subrutinas


Enunciado del problema:
Disear un contador BCD que cuente de 0 a 59 para simular un timer de
60 segundos y que el conteo de dos dgitos BCD, sea desplegado en
los displays de 7 segmentos de los puertos (Puerto0, Puerto1);el
intervalo de tiempo entre cada cuenta debe ser de 1 segundo.
Al llegar el display a 59 y la cuenta alcance 60, el contador debe ser
reinicializado a 00.
Los dos puertos de salida tienen displays de 7 segmentos de nodo
comn y los diez cdigos de 7 segmentos, apropiados para desplegar los
dgitos del 0 al 9, estn almacenados a partir de la localidad de memoria
etiquetada como Cdigo ( 400h).

Carlos Canto Quintal

Microprocesadores

Mapa de memoria
FFFF
nodo comn

Puerto0
Puerto0

Puerto1
Puerto1

a
b
c

a
b

f
e

c
d

NC g
1
1
0
0
0
0
0
1
0
0

f
0
1
1
1
0
0
0
1
0
0

e
0
1
0
1
1
1
0
1
0
1

d
0
1
0
0
1
0
0
1
0
1

c
0
0
1
0
0
0
0
0
0
0

b
0
0
0
0
0
1
1
0
0
0

18H
18H
00H
00H
78H
78H
02H
02H
12H
12H
19H
19H
30H
30H
24H
24H
79H
79H
40H
40H

400H+9
a
0
1
0
0
1
0
0
0
0
0

STACK

RAM

.
.
.

cdigos de 7 segs
0
1
2
3
4
5
6
7
8
9

Buffer2
Buffer1
SP

Cdigo (400h)

EPROM

PROGRAMA
PROGRAMA
0000
Carlos Canto Quintal

Microprocesadores

Programa principal
Principal
Principal
Inicializa
Inicializa Stack
Stack

STACK
BUFFER1
BUFFER2

Inicializa
Inicializa cuenta
cuenta
MAIN:
Desempacar
Desempacar
BCD
BCD
Desplegar
Desplegar
Delay_1seg.
Delay_1seg.

EQU
EQU
EQU
ORG

0FFEh
0FFEh
0FFFh
0000h

LD SP, STACK
LD B,00H

NEXT: CALL DESEMPACAR

CALL DESPLEGAR
CALL DELAY
CALL ACTUALIZA
JP NEXT

;ubicacin del stack


;almacn par el BCD1 desempacado
;almacn par el BCD2 desempacado
;comenzar a ensamblar a partir
;de esta localidad
;inicializa el STACK
;carga cuenta BCD inicial
;desempaque el nmero en BCD
;y almacene los dgitos en un buffer
;de salida
;toma el cdigo y despliega
;en los puertos
;espera por un segundo
;Ir a la siguiente cuenta y ajustar para
;BCD
;contina

Actualiza
Actualiza

Carlos Canto Quintal

Microprocesadores

Contando en BCD
El diseo de un contador binario (o HEX) con programacin es muy
simple; se realiza poniendo en ceros un registro e ir incrementando
el conteo a un intervalo dado de tiempo hasta que la cuenta final sea
alcanzada . Sin embargo, el conteo en BCD requiere algunos
ajustes; esto se hace usando la instruccin DAA.
El microprocesador es una mquina binaria; no reconoce los
nmeros en BCD. En BCD cualquier nmero entre A y F son
invlidos . Cuando el conteo va de 9 a A, la instruccin DAA puede
ajustar la cuenta a 10. El microprocesador interpreta este nmero
como equivalente a 10 en Hex; sin embargo, vemos los 4 bits de
ms bajo orden como 0 y los 4 bits de ms alto orden como 1,
almacenados pegados en un registro de 8 bits. Esto es llamado
como BCD empacado.
Para desplegar 10BCD, en los dos displays de 7 segmentos, los bits de
bajo orden y los bits de alto orden necesitan estar separados
(llamado desempacar)
Carlos Canto Quintal

Microprocesadores

La instruccin DAA
1.-Es una instruccin de 1 byte. Despus de una operacin
aritmtica, esta instruccin ajusta un nmero de 8 bits en el
Acumulador para formar dos nmeros en BCD empacados.
2.-Usa las banderas H y C para realizar el ajuste.
3.-En la adicin aritmtica, si hay un acarreo del bit D3 al bit D4, la
bandera del medio Acarreo ( H) se hace uno. Similarmente, en la
substraccin, si hay un prstamo del bit D4, la bandera H se hace
uno. La instruccin DAA usa las banderas H y C internamente para
ajustar el resultado de los dgitos BCD.

Carlos Canto Quintal

Microprocesadores

Ejemplo:
si se suma 15 (BCD) y 27 (BCD), una suma aritmtica
decimal da como resultado:
15
+ 27
42
Pero cuando las representaciones binarias son sumadas en
el acumulador de acuerdo a la aritmtica binaria estndar.
0001
0101
+ 0010
0111
0011
1100 =3C
La suma es ambigua.
La instruccin DAA ajusta el resultado para que se obtenga
la representacin correcta en BCD
0011
1100
+ 0000
0110
0100
0010
= 42

Carlos Canto Quintal

Microprocesadores

Proceso para desempacar un nmero en BCD


Conteo en binario 00 00 11 11 11 00 11 00

DAA
DAA

nmero BCD empacado:

Ajusta el valor del


acumulador a BCD

00 11 00 11 11 00 00 00

Desempacar

El mismo nmero en BCD


desempacado ocupa dos
bytes

00 00 00 00 00 11 00 11

00 00 00 00 11 00 00 00

8
Se salvan los dos
bytes en dos
localidades de la
memoria

0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 1

Buffer1
Buffer2

Carlos Canto Quintal

Microprocesadores

Subrutina para desempacar un nmero en BCD

Esta subrutina desempaca el nmero BCD del acumulador y almacena dos dgitos
BCD desempacados en el buffer BUFER1 y BUFFER2

Desempacar
Desempacar

DESEMPACAR:
LD HL,BUFFER1

HLBuffer1
HLBuffer1
Acuenta
Acuenta
AA&0Fh
AA&0Fh
(HL)A
(HL)A
Acuenta
Acuenta
Shift
Shiftright
rightAA

Shift
Shiftright
rightAA
Shift
Shiftright
rightAA
Shift
Shiftright
rightAA
HLHL+1
HLHL+1

LD A,B
AND 0Fh
LD (HL),A
INC HL
LD A,B
SRL A
SRL A
SRL A
SRL A
LD (HL),A
RET

;habilita HL como apuntador


;de memoria de BUFFER1
;Lee conteo en BCD empacado
;conserva los 4 bits bajos de BCD1
;almacena BCD1 en BUFFER1
;apunta a BUFFER2
;desplaza BCD2 hacia D3-D0
;e inserta 0s en la izquierda

;almacena BCD2 en BUFFER2

(HL)A
(HL)A
Ret
Ret
Carlos Canto Quintal

Microprocesadores

Subrutina displays de 7 segmentos


Display
Display

Mapa de memoria

Lee
Leecdigo
cdigo

A(
A( HL)
HL)

FFFF

(SP)HL
(SP)HL

LEE_CODIGO
LEE_CODIGO

HLCdigo
HLCdigo

(puerto2)A
(puerto2)A

HLHL+A
HLHL+A

HLHL-1
HLHL-1

A(HL)
A(HL)

05H
05H
08H
08H

Buffer2
Buffer1
SP

STACK
.
.
.

18H
18H
00H
00H
78H
78H
02H
02H
12H
12H
19H
19H
30H
30H
24H
24H
79H
79H
40H
40H

400H+9

HL(SP)
HL(SP)

A(HL)
A(HL)

Ret
Ret

LEE_CODIGO
LEE_CODIGO

Cdigo (400h)

(puerto1)
(puerto1)AA

RAM

EPROM

PROGRAMA
PROGRAMA

Ret
Ret

0000

Carlos Canto Quintal

Microprocesadores

Subrutina DESPLEGAR
Tarea: Mostrar la cuenta del contador BCD en los displays de 7 segmentos
Display
Display
A(
A( HL)
HL)
LEE_CODIGO
LEE_CODIGO
(puerto2)A
(puerto2)A

DISPALY:

Mapa de memoria
FFFF

LD A,(HL)

CALL LEE_CODIGO
OUT (puerto2),A
INC HL
LD A,(HL)

Buffer2
Buffer1
SP

CALL LEE_CODIGO

OUT(puerto1),A
RET

18H
18H
00H
00H
78H
78H
02H
02H
12H
12H
19H
19H
30H
30H
24H
24H
79H
79H
40H
40H

400H+9

A(HL)
A(HL)
LEE_CODIGO
LEE_CODIGO

Ret
Ret

STACK
.
.
.

HLHL-1
HLHL-1

(puerto1)
(puerto1)AA

05H
05H
08H
08H

Cdigo (400h)

RAM

EPROM

PROGRAMA
PROGRAMA
0000

Carlos Canto Quintal

Microprocesadores

Subrutina LEE_CODIGO
Tarea: leer de la memoria los cdigos de 7 segmentos de los dgitos del conteo actual que sern
desplegado en los displays de 7 segnmentos
Mapa de memoria

Lee
Leecdigo
cdigo
LEE_CODIGO:
PUSH HL
LD HL,CODIGO
ADD A,L
LD L,A
LD A,(HL)
POP HL

FFFF

(SP)HL
(SP)HL
HLCdigo
HLCdigo

Buffer2
Buffer1
SP

HLHL+A
HLHL+A

18H
18H
00H
00H
78H
78H
02H
02H
12H
12H
19H
19H
30H
30H
24H
24H
79H
79H
40H
40H

400H+9

;ubicacin de los cdigos de 7


;segmentos en la memoria con
;la ayuda del ensamblador
ORG 400H
CODIGO: DB 40H,79H,24H
DB 30H,19H,12H
DB 02H,78H,00H,18H

STACK
.
.
.

A(HL)
A(HL)

RET

05H
05H
08H
08H

HL(SP)
HL(SP)
Ret
Ret
Cdigo (400h)

RAM

EPROM

PROGRAMA
PROGRAMA
0000

Carlos Canto Quintal

Microprocesadores

DELAY
DELAY11SEG
SEG
(STACK)
(STACK)DE,AF,BC
DE,AF,BC

Subrutina DELAY 1SEG


Tarea:
generar un retardo de un segundo

B10
B10
DECUENTA
DECUENTA

DELAY_1SEG:

DEDE-1
DEDE-1
AD
AD
AA
AAororEE
no

WAIT:
LOOP:

A=0?
A=0?
SI
BB-1
BB-1

no

POP BC
POP AF
POP DE

B=0?
B=0?
SI

PUSH DE
PUSH AF
PUSH BC
LD B,10
LD DE, CUENTA
DEC DE
LD A,D
OR E
JP NZ,LOOP
DJNZ WAIT

;guardar el contenido de DE,AF,BC


;en el stack
;carga B para repetir el LOOP diez veces
; carga DE para un retardo de 100ms
;poner D en A para checar flags
;activar Z si D y E son ambos cero
;repite si CUENTA =0
;es un retardo de 1segundo? Sino ,
; regresar a WAIT
; Recupera los valores de los registros
;salvados

RET

BC,AF,DE
BC,AF,DE(STACK)
(STACK)
Ret
Ret

Carlos Canto Quintal

Microprocesadores

Subrutina Actualiza

Tarea:
Actualizar el conteo en BCD y ajustarlo. Cuando el conteo alcanza 60, resetea
el contador
ACTUALIZA
ACTUALIZA
A
ABB
AA+1
AA+1
Ajusta
AjustaaaBCD
BCD
BA
BA
Ret
Ret

no

A=60?
A=60?

ACTUALIZA:
LD A,B
ADD A,01H
DAA
LD B,A
CP 60H
RET NZ
LD B,00H

;toma la ltima cuenta


; actualiza la cuenta
;ajusta para BCD
;salva la cuenta
;Es la cuenta 60h?
;Sino, regresa al principal
;resetea el contador

RET

SI
B00
B00
Ret
Ret
Carlos Canto Quintal

Vous aimerez peut-être aussi