Ejemplo del uso de las subrutinas

Anuncio
Microprocesadores
Ejemplo del uso de las subrutinas
Enunciado del problema:
Diseñar un contador BCD que cuente de 0 a 59 para simular un timer de
60 segundos y que el conteo de dos dígitos 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
común y los diez códigos de 7 segmentos, apropiados para desplegar los
dígitos del 0 al 9, están almacenados a partir de la localidad de memoria
etiquetada como Código ( 400h).
Carlos Canto Quintal
Microprocesadores
Mapa de memoria
FFFF
Ánodo común
Puerto0
Puerto0
Puerto1
Puerto1
a
b
c
a
d
g
f
e
e
f
a
b
f
e
c
d
g
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
b
0
0
0
0
0
1
1
0
0
0
c
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
.
.
.
d
códigos de 7 segs
0
1
2
3
4
5
6
7
8
9
g
Buffer2
Buffer1
SP
Código (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
;ubicación del stack
;almacén par el BCD1 desempacado
;almacén par el BCD2 desempacado
;comenzar a ensamblar a partir
;de esta localidad
;inicializa el STACK
;carga cuenta BCD inicial
;desempaque el número en BCD
;y almacene los dígitos en un buffer
;de salida
;toma el código y despliega
;en los puertos
;espera por un segundo
;Ir a la siguiente cuenta y ajustar para
;BCD
;continúa
Actualiza
Actualiza
Carlos Canto Quintal
Microprocesadores
Contando en BCD
El diseño de un contador binario (o HEX) con programación 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 instrucción DAA.
El microprocesador es una máquina binaria; no reconoce los
números en BCD. En BCD cualquier número entre A y F son
inválidos . Cuando el conteo va de 9 a A, la instrucción DAA puede
ajustar la cuenta a 10. El microprocesador interpreta este número
como equivalente a 10 en Hex; sin embargo, vemos los 4 bits de
más bajo orden como 0 y los 4 bits de más 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 instrucción DAA
1.-Es una instrucción de 1 byte. Después de una operación
aritmética, esta instrucción ajusta un número de 8 bits en el
Acumulador para formar dos números en BCD empacados.
2.-Usa las banderas H y C para realizar el ajuste.
3.-En la adición aritmética, si hay un acarreo del bit D3 al bit D4, la
bandera del medio Acarreo ( H) se hace uno. Similarmente, en la
substracción, si hay un préstamo del bit D4, la bandera H se hace
uno. La instrucción DAA usa las banderas H y C internamente para
ajustar el resultado de los dígitos BCD.
Carlos Canto Quintal
Microprocesadores
Ejemplo:
si se suma 15 (BCD) y 27 (BCD), una suma aritmética
decimal da como resultado:
15
+ 27
42
Pero cuando las representaciones binarias son sumadas en
el acumulador de acuerdo a la aritmética binaria estándar.
0001
0101
+ 0010
0111
0011
1100 =3C
La suma es ambigua.
La instrucción DAA ajusta el resultado para que se obtenga
la representación correcta en BCD
0011
1100
+ 0000
0110
0100
0010
= 42
Carlos Canto Quintal
Microprocesadores
Proceso para desempacar un número en BCD
Conteo en binario 00 00 11 11 11 00 11 00
DAA
DAA
5
número BCD empacado:
Ajusta el valor del
acumulador a BCD
8
00 11 00 11 11 00 00 00
Desempacar
El mismo número en BCD
desempacado ocupa dos
bytes
00 00 00 00 00 11 00 11
00 00 00 00 11 00 00 00
5
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 número en BCD
•
Esta subrutina desempaca el número BCD del acumulador y almacena dos dígitos
BCD desempacados en el buffer BUFER1 y BUFFER2
Desempacar
Desempacar
DESEMPACAR:
LD HL,BUFFER1
HLÅBuffer1
HLÅBuffer1
AÅcuenta
AÅcuenta
AÅA&0Fh
AÅA&0Fh
(HL)ÅA
(HL)ÅA
AÅcuenta
AÅcuenta
Shift
Shiftright
rightAA
Shift
Shiftright
rightAA
Shift
Shiftright
rightAA
Shift
Shiftright
rightAA
HLÅHL+1
HLÅHL+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 0´s 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
Leecódigo
código
AÅ(
AÅ( HL)
HL)
FFFF
(SP)ÅHL
(SP)ÅHL
LEE_CODIGO
LEE_CODIGO
HLÅCódigo
HLÅCódigo
(puerto2)ÅA
(puerto2)ÅA
HLÅHL+A
HLÅHL+A
HLÅHL-1
HLÅHL-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
Código (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
.
.
.
HLÅHL-1
HLÅHL-1
(puerto1)Å
(puerto1)ÅAA
05H
05H
08H
08H
Código (400h)
RAM
EPROM
PROGRAMA
PROGRAMA
0000
Carlos Canto Quintal
Microprocesadores
Subrutina LEE_CODIGO
Tarea: leer de la memoria los códigos de 7 segmentos de los dígitos del conteo actual que serán
desplegado en los displays de 7 segnmentos
Mapa de memoria
Lee
Leecódigo
código
LEE_CODIGO:
PUSH HL
LD HL,CODIGO
ADD A,L
LD L,A
LD A,(HL)
POP HL
FFFF
(SP)ÅHL
(SP)ÅHL
HLÅCódigo
HLÅCódigo
Buffer2
Buffer1
SP
HLÅHL+A
HLÅHL+A
18H
18H
00H
00H
78H
78H
02H
02H
12H
12H
19H
19H
30H
30H
24H
24H
79H
79H
40H
40H
400H+9
;ubicación de los códigos 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
Código (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
BÅ10
BÅ10
DEÅCUENTA
DEÅCUENTA
DELAY_1SEG:
DEÅDE-1
DEÅDE-1
AÅD
AÅD
AÅA
AÅAororEE
no
WAIT:
LOOP:
A=0?
A=0?
SI
BÅB-1
BÅB-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Å
AÅBB
AÅA+1
AÅA+1
Ajusta
AjustaaaBCD
BCD
BÅA
BÅA
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
BÅ00
BÅ00
Ret
Ret
Carlos Canto Quintal
Descargar