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