* Calculadora.asm
*
* Created: 10/01/2017 12:27:17
* Author: Javier
*/
.include "m164Pdef.inc"
.def aux=r16 ;Defino variables a usar en el programa
.def num1=r17
.def num2=r18
.def boton=r19
.def botonh=r20
.def ante=R24
.def numero=R22
.def conta=R23
.def tempo=r25
.def aux2=R26
.def multi=R29
.def suma=R28
.def resta=R27
.dseg
inicio: ;etiqueta para conocer el inicio del programa o la base del mismo
ldi aux,0b011111111
out ddra,aux // Configuro el puerto A
com aux
out porta,aux
ldi aux,0b00000000
out ddrb,aux //puerto B como entrada
com aux
out portb,aux
ser aux // el resgitro r16 se cargo con ceros
out ddrc,aux //puerto C se configuro como salida PARA LOS CONTROLES
com aux
out portc,aux
ldi aux,0b00001111
out ddrd,aux // puerto D como entrada
com aux
out portd,aux
/*************GARANTIZO LOS PULL UPS***********/
in aux,mcucr
andi aux,0b11101111
out mcucr,aux
/*********************************************/
ldi aux,high(ramend)
out sph,aux ;inicializo el puntero de la ram high
ldi aux,low(ramend)
out spl,aux ; Inicializo el puntero de la ram low
clr boton ;se procede a limpiar los registros para que no exista ningun
contenido basura en los mismos
clr botonh
clr aux
clr num1
clr num2
otronum: ; etiqueta otronum
ldi ante,16 ;carga indirecta en aux
num:
sts BINARIOL,boton
sts binarioh,botonh
CALL BIN_BCD ; LLAMO A LA RUTINA QUE CONVIERTE DE BINARIO A BCD
CALL BCD_7SEGMENTOS ; LLAMO A LA RUTINA QUE CONVIERTE EL EQUIVALENTE EN 7
SEGMENTOS
CALL BARRIDO_DISPLAY ; LLAMO LA RUTINA QUE REALIZA EL BARRIDO
call teclado
lds aux,tecla
cpi aux,16 ;comparacion inmediata
breq otronum ; si no se presiona una tecla
cpi aux,10 ;comparacion inmediata
breq multiplicar ; si se presiona la tecla de multiplicar
cpi aux,13 ;comparacion inmediata
breq sumar ; si se presiona la tecla de sumar
cpi aux,14;comparacion inmediata
breq restar ; si se presiona la tecla de restar
cpi aux,12;comparacion inmediata
breq borrar ; si se presiona la tecla borrar
cpi aux,11;comparacion inmediata
breq respuesta ; si se presiona la tecla de igual
cpi aux,17;comparacion inmediata
brsh num ; cualquier numero mayor
cp aux,ante;comparacion entre registros aux y ante
brne diferente ; si es la primera vez que se presiona un nmero
rjmp num ;salto incondicional a num
mul num1,aux
add R0,ante
mov aux,R0
cpi aux,100
brsh num
mov boton,R0
mov num1,R0
rjmp num;salto incondicional a num
operacion2:
mov ante,aux;movemos los valores a otro registro
sub num1,num2;resta ambos registros
clr num2;limpia el registro
mov R0,num1;mueve el registro para facilitar su transformacion
mov R1,num2;mueve el registro para facilitar su transformacion
igual3:
sts BINARIOL,R0
sts binarioh,R1
CALL BIN_BCD ; LLAMO A LA RUTINA QUE CONVIERTE DE BINARIO A BCD
CALL BCD_7SEGMENTOS ; LLAMO A LA RUTINA QUE CONVIERTE EL EQUIVALENTE EN 7
SEGMENTOS
CALL BARRIDO_DISPLAY ; LLAMO LA RUTINA QUE REALIZA EL BARRIDO
call teclado;llamo a la rutina del teclado
lds aux,tecla
cpi aux,12
breq borrar1
rjmp igual3
BCD_7SEGMENTOS:
PUSH R16
PUSH R17
/*******************PARA LAS UNIDADES********/
LDI XL,LOW(BCD0)
LDI XH,HIGH(BCD0)
LD R16,X // BUSCO EL EQUIVALENTE DE LAS UNIDADES
POP R17
POP R16
RET
tabla: ;gfedcba gfedcba
.db 0b10111111,0b10000110 ;0,1
.db 0b11011011,0b11001111 ;2,3
.db 0b11100110,0b11101101 ;4,5
.db 0b11111101,0b10000111 ;6,7
.db 0b11111111,0b11101111 ;8,9
BARRIDO_DISPLAY:
PUSH R16
PUSH R17
PUSH R20
/***************ENVIO PRIMERO LAS UNIDADES*******/
LDI XL,LOW(DIG0)
LDI XH,HIGH(DIG0)
LD R16,X
OUT PORTA,R16
LDI R17,0B1111_0111
OUT PORTC,R17 ; ACTIVO EL PRIMER DISPLAY
CALL DELAY
SER R17
OUT PORTC,R17 ; APAGO TODOS LOS DISPLAYS
/******************************************************/
/***************ENVIO LAS DECENAS*******/
LDI XL,LOW(DIG1)
LDI XH,HIGH(DIG1)
LD R16,X
OUT PORTA,R16
LDI R17,0B1111_1011
OUT PORTC,R17 ; ACTIVO EL SEGUNDO DISPLAY
CALL DELAY
SER R17
OUT PORTC,R17 ; APAGO TODOS LOS DISPLAYS
/******************************************************/
/***************ENVIO LAS CENTENAS*******/
LDI XL,LOW(DIG2)
LDI XH,HIGH(DIG2)
LD R16,X
OUT PORTA,R16
LDI R17,0B1111_1101
OUT PORTC,R17 ; ACTIVO EL TERCER DISPLAY
CALL DELAY
SER R17
OUT PORTC,R17 ; APAGO TODOS LOS DISPLAYS
/******************************************************/
DELAY:
LDI R20,255
L1:
DEC R20
NOP
NOP
BRNE L1
RET
TECLADO:
push r16
in r16,sreg
push r16
push r17
ldi r17,16
ldi r16,0b11111110; tengo que correr un cero en el las filas para ver que
aplasto
out portd,r16
sbis pind,4; al aplastar si coinciden por el barrido se pone un cero en el
pin 4 si es
ldi r17,1
sbis pind,5
ldi r17,2
sbis pind,6
ldi r17,3
sbis pind,7
ldi r17,8
ldi r16,0b11111101
out portd,r16
sbis pind,4
ldi r17,4
sbis pind,5
ldi r17,5
sbis pind,6
ldi r17,6
sbis pind,7
ldi r17,10
ldi r16,0b1111011
out portd,r16
sbis pind,4
ldi r17,7
sbis pind,5
ldi r17,8
sbis pind,6
ldi r17,9
sbis pind,7
ldi r17,14
ldi r16,0b11110111
out portd,r16
sbis pind,4
ldi r17,12
sbis pind,5
ldi r17,0
sbis pind,6
ldi r17,11
sbis pind,7
ldi r17,13
sts tecla,r17
pop r17
pop r16
out sreg,r16
pop r16
ret