Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Programa para realizar operaciones básicas en un microcontrolador, Ejercicios de Microprocesadores

Este documento contiene el código Assembly de un programa que permite ingresar dos números y realizar las operaciones básicas de suma y resta. El programa utiliza un microcontrolador AVR y se basa en la lectura de teclas del teclado numérico para ingresar los números y la tecla '=' para indicar la operación a realizar. El resultado se muestra en un display de siete segmentos.

Tipo: Ejercicios

2020/2021

Subido el 08/07/2021

ojo-maestro
ojo-maestro 🇪🇨

1 documento

1 / 15

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡Descarga Programa para realizar operaciones básicas en un microcontrolador y más Ejercicios en PDF de Microprocesadores solo en Docsity!

Programa:

.def tempo = R .def cont = R .def num1 = R .def num2 = R .def opera = R .def resultado = R .def ante = R .dseg TECLA: .BYTE 1 BCD3: .BYTE 1 BCD2: .BYTE 1 BCD1: .BYTE 1 BCD0: .BYTE 1 DIG3: .BYTE 1 DIG2: .BYTE 1 DIG1: .BYTE 1 DIG0: .BYTE 1 BINARIO: .BYTE 1 .cseg ;configuracion de entradas y salidas ldi tempo, 0b0000_ out DDRB, tempo ;PORTB no se usa ldi tempo, 0b0111_ out DDRC, tempo ;C6:C0 son salidas (7 segmentos) ldi tempo, 0b0000_ out DDRD, tempo ;D3:D0 son salidas (digitos) ldi tempo, 0b0000_1111 ;A3:0 salidas para escoger las columnas, A7:4 entradas para filas out DDRA, tempo ldi tempo, 0b1111_ out PORTA, tempo ;no se escoge nada ldi tempo, 0b1111_ out PORTB, tempo ldi tempo, 0b1000_ out PORTC, tempo ldi tempo, 0b1111_ out PORTD, tempo in tempo, MCUCR andi tempo, 0b1110_ out MCUCR, tempo ldi ante, 10 sts TECLA, ante ;programa: lazo_principal: ;ingreso el primer numero: rcall INGRESAR_NUM rcall INGRESAR_OPERACION rcall INGRESAR_NUM PRESIONA_IGUAL: rcall BORRAR_TODO rcall BCD_7SEG_ rcall BARRIDO_DISPLAY

rcall BARRIDO_TECLADO lds tempo, TECLA cpi tempo, '=' brne PRESIONA_IGUAL cpi opera, '+' breq SUMAR ;si opera = '+' brne RESTAR SUMAR: mov resultado, num add resultado, num sts binario, resultado ;guarda en "BINARIO" la respuesta ldi tempo, 10 sts BCD3, tempo ;primer digito apagado rcall BIN_BCD_ rcall PRESIONA_BORRAR ;sigue aqui hasta que se presione BORRAR rjmp lazo_principal RESTAR: mov resultado, num sub resultado, num brcs resultado_negativo sts binario, resultado ;guarda en "BINARIO" la respuesta ldi tempo, 10 sts BCD3, tempo ;primer digito apagado rcall BIN_BCD_ rcall PRESIONA_BORRAR ;siguie aqui hasta que se presione BORRAR rjmp lazo_principal resultado_negativo: neg resultado ;se guarda el valor absoluto del resultado sts binario, resultado ;guarda en "BINARIO" la respuesta ldi tempo, 11 sts BCD3, tempo ;primer digito '-' rcall BIN_BCD_ rcall PRESIONA_BORRAR ;siguie aqui hasta que se presione BORRAR rjmp lazo_principal ;------------------------------------------------------------------------------------- BORRAR_TODO: rcall BCD_7SEG_ rcall BARRIDO_DISPLAY rcall BARRIDO_TECLADO lds tempo, TECLA cpi tempo, 'b' breq lazo_principal ret ;------------------------------------------------------------------------------------- PRESIONA_BORRAR: rcall BORRAR_TODO rcall BCD_7SEG_ rcall BARRIDO_DISPLAY rcall BARRIDO_TECLADO lds tempo, TECLA cpi tempo, 'b' brne PRESIONA_BORRAR ret ;------------------------------------------------------------------------------------- INGRESAR_NUM1: push tempo in tempo, SREG push tempo push cont push XH push XL LAZO_INGRESAR_NUM1:

cpi tempo, '=' breq LAZO_OPERACION ;si la tecla presionada es = se regresa a leer el teclado cpi tempo, 'b' breq LAZO_OPERACION cpi tempo, 10 breq LAZO_OPERACION ;si logra llegar hasta tan lejos la tecla presionada es + o - , entonces: mov opera, tempo pop cont pop tempo out SREG, tempo pop tempo ret ;------------------------------------------------------------------------------------- INGRESAR_NUM2: push tempo in tempo, SREG push tempo push cont push XH push XL LAZO_INGRESAR_NUM2: rcall BORRAR_TODO rcall BORRAR rcall BCD_7SEG_ rcall BARRIDO_DISPLAY ldi num2, 0 ldi XH, HIGH(BCD2) ldi XL, LOW(BCD2) ;apunto a BCD ldi cont, 3 lazo_num2: rcall INGRESO_NUMERO lds tempo, TECLA ;guardo en tempo el valor de la tecla presionada cpi tempo, 'b' breq LAZO_INGRESAR_NUM2 ;si la tecla presionada es BORRAR st X+, tempo ;se guarda en el correspondiente BCD2:0 el valor ingresado dec cont brne lazo_num rcall VERIFICAR_127 ;devuelve en tempo el valor de 1 si es mayor a 127 y 0 si no es cpi tempo, 1 breq LAZO_INGRESAR_NUM2 ;si es mayor a 127 vuelve a hacer todo ;toca guardar el valor de num ;X apunta a lo que viene despues de BCD0 entonces puedo hacer pre decrementos: ld tempo, - X add num2, tempo ;guarda unidades ld tempo, - X ldi cont, 10 mul cont, tempo mov tempo, R add num2, tempo ;guarda decenas ld tempo, - X ldi cont, 100 mul cont, tempo mov tempo, R add num2, tempo ;guarda centenas pop XL pop XH pop cont

pop tempo out SREG, tempo pop tempo ret ;---------------------------------------------------------------------------------- BORRAR: push tempo in tempo, SREG push tempo push cont ldi tempo, 10 ldi XH, HIGH(BCD3) ldi XL, LOW(BCD3) st X+, tempo ;guarda en BCD3 10 que corresponde al display apagado ldi cont, 3 ldi tempo, 0 lazo_borrar: st X+, tempo ;se guarda 0 en X dec cont brne lazo_borrar pop cont pop tempo out SREG, tempo pop tempo ret ;regresa luego de borrar todo ;---------------------------------------------------------------------- INGRESO_NUMERO: push tempo in tempo, SREG push tempo LAZO_INGRESO_NUMERO: rcall BCD_7SEG_ rcall BARRIDO_DISPLAY rcall BARRIDO_TECLADO lds tempo, TECLA cp tempo, ante breq LAZO_INGRESO_NUMERO lds ante, TECLA cpi tempo, '+' breq LAZO_INGRESO_NUMERO ;si la tecla presionada es + vuelve a leer cpi tempo, '-' breq LAZO_INGRESO_NUMERO ;si la tecla presionada es - vuelve a leer cpi tempo, '=' breq LAZO_INGRESO_NUMERO ;si la tecla presionada es = vuelve a leer cpi tempo, 10 breq LAZO_INGRESO_NUMERO ;si no se presiona ninguna tecla vuelve a leer ;si la tecla presionada es un numero o BORRAR se almacena en tempo pop tempo out SREG, tempo pop tempo ret ;--------------------------------------------------------------------- VERIFICAR_127: push XH push XL ldi XH, HIGH(BCD2) ldi XL, LOW(BCD2) ld tempo, X+ ;verifica centenas cpi tempo, 1 breq VERIFICAR_127_DECENAS ;si centenas = 1 hay que verificar el siguiente brcc MAYOR_ rjmp MENIGU_

;comparar la tecla actual con la anterior

add R20, R19 ;tecla tiene un valor entre 0 y 15 (tecla=4F+C) que corresponde a lo que dice en TABLA_TECLAS ;se convierte al caracter correspondiente ldi ZH, HIGH(TABLA_TECLAS<<1)

  • ldi R18,
  • sbis PINA,
  • ldi R18,
  • ldi R20,
  • mov R20, R mul R20, R18 ;4*filas
  • ldi R20, mov R17, R20 ;tecla se guarda en ante para comparar la siguiente vez*/
  • ldi R16, 0b1111_ ;primera fila
  • out PORTA, R
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • ldi R16, 0b1111_ ;siguiente fila:
  • out PORTA, R
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • ldi R16, 0b1111_ ;siguiente fila:
  • out PORTA, R
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • ldi R16, 0b1111_ ;siguiente fila:
  • out PORTA, R
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • sbis PINA,
  • ldi R20,
  • cpi R20,
  • andi R20, 0b0000_ breq NO_TECLA

add ZL, R clr R adc ZH, R20 ;se suman los MSB con 0 y C lpm R20, Z ;almacena en "tecla" el numero u operación correspondiente sts TECLA, R20 ;se guarda en TECLA el caracter correspondiente pop R pop R pop R pop R pop R out SREG, R pop R ret ;solo sale de la subrutina cuando se haya presionado alguna tecla NO_TECLA: ldi R20, 10 sts TECLA, R pop R pop R pop R pop R pop R out SREG, R pop R ret TABLA_TECLAS: .DB 10, 2, 3, '+' .DB 1, 5, 6, '-' .DB 4, 8, 9, '=' .DB 7, 0, 10, 'b' ;10 = no tiene funcion, 'b' = borrar ;--------------------------------------------------------------------------------- BCD_7SEG_4: push R in R16, SREG push R push R push XH push XL push YH push YL push ZH push ZL ;X y Y apuntan a los numeros mas significativos pero en el lazo se disminuye ;hasta llegar al primero. Por eso R17 es 4 inicialmente ldi XH, HIGH(BCD3) ;con el puntero X se extrae la informacion en BCD3: ldi XL, LOW(BCD3) ldi YH, HIGH(DIG3) ;con el puntero Y se almacenan las conversiones en DIG3: ldi YL, LOW(DIG3) ldi R17, 4 ;contador (para los 4 digitos) LAZO_BCD_7SEG_4: ldi ZH, HIGH(TABLA_BCD_7SEG<<1) ldi ZL, LOW(TABLA_BCD_7SEG<<1) ld R16, X+ add ZL, R clr R adc ZH, R lpm R16, Z st Y+, R dec R brne LAZO_BCD_7SEG_ pop ZL pop ZH pop YL

lds R16, binario clr R BIN_BCD_3_CENTENAS: subi R16, 100 brcs BIN_BCD_3_DECENAS ;cuando sea negativo acabo centenas va a decenas inc R rjmp BIN_BCD_3_CENTENAS BIN_BCD_3_DECENAS: sts BCD2, R17 ;guarda en BCD2 el valor de centenas subi R16, - 100 ;se restaura el valor para empezar a restar 10 clr R BIN_BCD_DEC_1: subi R16, 10 brcs BIN_BCD_3_UNIDADES inc R rjmp BIN_BCD_DEC_1 ;REVISAR ESTA PARTE BIN_BCD_3_UNIDADES: sts BCD1, R17 ;se guarda el valor de las decenas subi R16, - 10 sts BCD0, R16 ;se guarda el valor de las unidades pop R17 ;restaurar todo pop R out SREG, R pop R ret ;fin

Simulación: