Você está na página 1de 10

.include "m164pdef.

inc"

.def tempo=r16
.def ante=r18
.def num1=r19
.def num2=r20
.def bandera=r21

.dseg
tecla: .byte 1 ;reserva la tecla precionada
numero1: .byte 1 ;reserva el primer numero ingresado
numero2: .byte 1 ;reserva el segundo numero ingresado
respuesta: .byte 2 ;reserva la respuesta de la operaci�n
cifra: .byte 1 ;cuenta el numero de cifras permitidas, en este caso
3
restriccion: .byte 1 ;almacena el numero que no se debe superar
operacion: .byte 1 ;indica la operaci�n a realizarse, 1 para suma, 2
para resta, 3 para resolver
ingreso: .byte 1 ;indica que ya se ingres� el primer numero
bcd0: .byte 1
bcd1: .byte 1
bcd2: .byte 1
bcd3: .byte 1
dig0: .byte 1
dig1: .byte 1
dig2: .byte 1
dig3: .byte 1

.cseg
.org 0x00
;puerto B MSB entrada LSB salida a teclado, port C MSB entrada LSB salida a
transistores
ldi tempo,0b00001111
out ddrb,tempo
out ddrc,tempo
ldi tempo,0xff
out portb,tempo
out portc,tempo
;port D no se utiliza
clr tempo
out ddrd,tempo
com tempo
out portd,tempo
;port A salida a displays
ldi tempo,0b01111111
out ddra,tempo
com tempo
out porta,tempo;
;bit pud en 0
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo
;stack point
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
;valores iniciales
clr bandera
ldi tempo,16
sts tecla,tempo
ldi tempo,100
sts numero1,tempo
sts numero2,tempo
clr tempo
ldi xl,low(respuesta)
ldi xh,high(respuesta)
st x+,tempo
st x,tempo
ldi tempo,0b10000000
sts dig0,tempo
sts dig1,tempo
sts dig2,tempo
sts dig3,tempo
ldi tempo,3
sts cifra,tempo
clr tempo
sts operacion,tempo
sts ingreso,tempo
;resticci�n
ldi tempo,127
sts restriccion,tempo

;programa
inicio: lds ante,tecla
call teclado
lds tempo,tecla
cp ante,tempo
breq continuar1
cpi tempo,14
brsh continuar1

lds tempo,cifra
cpi tempo,0
breq suma_o_resta1

lds tempo,tecla
cpi tempo,10
breq cero1
cpi tempo,10
brlo seguir_cifras
rjmp continuar

seguir_cifras:
lds tempo,cifra
cpi tempo,3
breq centenas
cpi tempo,2
breq decenas
cpi tempo,1
breq unidades
rjmp continuar

suma_o_resta1: rjmp suma_o_resta


centenas:
lds tempo,cifra
dec tempo
sts cifra,tempo
lds tempo,tecla
ldi num1,100
mul tempo,num1
mov num1,r0
mov num2,r1
lds tempo,restriccion
subi tempo,-1 ;para comparar con la
numeyores mayores o iguales a la restricci�n +1, es decir mayores o iguales a 128
sub num1,tempo
clr tempo
sbc num2,tempo
brsh cero
lds tempo,tecla
ldi num1,100
mul tempo,num1
sts respuesta,r0
rjmp continuar

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
continuar1: rjmp continuar
cero1: rjmp cero
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

decenas:
lds tempo,cifra
dec tempo
sts cifra,tempo
lds tempo,tecla
ldi num1,10
mul tempo,num1
mov num1,r0
lds tempo,respuesta
add num1,tempo
lds tempo,restriccion
subi tempo,-1 ;para comparar con la
numeyores mayores o iguales a la restricci�n +1, es decir mayores o iguales a 128
sub num1,tempo
brsh cero
add num1,tempo
sts respuesta,num1
rjmp continuar

unidades:
lds tempo,cifra
dec tempo
sts cifra,tempo
lds tempo,respuesta
lds num1,tecla
add num1,tempo
lds tempo,restriccion
subi tempo,-1 ;para comparar con la
numeyores mayores o iguales a la restricci�n +1, es decir mayores o iguales a 128
sub num1,tempo
brsh cero
add num1,tempo
sts respuesta,num1
rjmp continuar

cero:
ldi r16,0b10000000 ;para borrar signo
sts dig3,r16
clr tempo
sts respuesta,tempo
ldi tempo,3
sts cifra,tempo
lds tempo,ingreso
sbrc tempo,0
rjmp cero_num2
clr tempo
sts numero1,tempo
rjmp continuar

cero_num2:
clr tempo
sts numero2,tempo
rjmp continuar

suma_o_resta:
lds tempo,ingreso ;si ya se ingres� el primer numero,
ingresar el segundo numero
cpi tempo,1
breq cero_igual
lds tempo,tecla
cpi tempo,12
breq suma
cpi tempo,13
breq resta
cpi tempo,10
breq cero
rjmp continuar

suma:
ldi tempo,1 ;1 para indicar operaci�n
suma
sts operacion,tempo
rjmp guardar

resta:
ldi tempo,2 ;2 para indicar operaci�n
resta
sts operacion,tempo
guardar:
ldi tempo,1 ;1 para indicar que ya se
ingres� el primer numero
sts ingreso,tempo
lds tempo,respuesta
sts numero1,tempo ;guardar el numero ingresado
ldi tempo,3 ;volver a iniciar el contador
de cifras en 3
sts cifra,tempo
clr tempo ;volver a mostrar 000 para
indicar que se debe ingresar el segundo n�mero
sts respuesta,tempo
rjmp continuar

cero_igual:
lds tempo,respuesta
sts numero2,tempo
lds tempo,tecla
cpi tempo,10
breq cero
cpi tempo,11
breq resolver
rjmp continuar

resolver:
clr tempo
sts ingreso,tempo
lds tempo,operacion
cpi tempo,1
breq sumar
cpi tempo,2
breq restar
rjmp continuar

sumar:
lds num1,numero1
lds num2,numero2
add num1,num2
sts respuesta,num1
rjmp continuar

restar:
lds num1,numero1
lds num2,numero2
cp num1,num2
brsh positivo
negativo:
sub num2,num1
sts respuesta,num2
ldi r16,0b11000000 ;para
colocar signo
sts dig3,r16
rjmp continuar
positivo:
sub num1,num2
sts respuesta,num1
ldi r16,0b10000000 ;para
borrar signo
sts dig3,r16
rjmp continuar

continuar:

call bin_bcd
call segmentos
barridos:
call barrido
rjmp inicio
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%% RUTINA DE TECLADO %%%%%%%%%%%%%%%%

teclado: push r16


in r16,sreg
push r16
push r17
ldi r17,16

ldi r16,0b11111110
out portb,r16
sbis pinb,7
ldi r17,12 ;s=13 ,p=10
sbis pinb,6
ldi r17,11 ;s=11 ,p=3
sbis pinb,5
ldi r17,0 ;s=0 ,p=2
sbis pinb,4
ldi r17,10 ;s=10 ,p=1

ldi r16,0b11111101
out portb,tempo
sbis pinb,7
ldi r17,13 ;s=13 ,p=13
sbis pinb,6
ldi r17,3 ;s=3 ,p=6
sbis pinb,5
ldi r17,2 ;s=2 ,p=5
sbis pinb,4
ldi r17,1 ;s=1 ,p=4

ldi tempo,0b11111011
out portb,tempo
sbis pinb,7
ldi r17,14 ;s=10 ,p=14
sbis pinb,6
ldi r17,6 ;s=6 ,p=9
sbis pinb,5
ldi r17,5 ;s=5 ,p=8
sbis pinb,4
ldi r17,4 ;s=4 ,p=7

ldi tempo,0b11110111
out portb,tempo
sbis pinb,7
ldi r17,15 ;s=16 ,p=16
sbis pinb,6
ldi r17,9 ;s=9 ,p=11
sbis pinb,5
ldi r17,8 ;s=8 ,p=0
sbis pinb,4
ldi r17,7 ;s=7 ,p=12

sts tecla,r17

pop r17
pop r16
out sreg,r16
pop r16
ret

;%%%%%%%%%%%%%%% FIN RUTINA DE TECLADO %%%%%%%%%%%%%%


;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& RUTINA DE BIN_BCD %%%%
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
bin_bcd: push r16 ;Almacenar el estado anterior
in r16,sreg ;de los registros en el stack point
push r16 ;para poder utilizarlos con la
rutina
push r17 ;de conversi�n a BCD
push r18
push r19
push r20
push xl
push xh

ldi xl,low(respuesta)
ldi xh,high(respuesta)
ld r16,x+ ;LSB del n�mero converdido a cm
ld r17,x+ ;MSB del n�mero converdido a cm

clr r20
ldi r18,100
ldi r19,0
cien1: sub r16,r18
sbc r17,r19
brcs dies
inc r20
rjmp cien1
dies: sts bcd2,r20
clr r20
subi r16,-100
ldi r18,10
dies1: sub r16,r18
brcs uno
inc r20
rjmp dies1
uno: sts bcd1,r20
subi r16,-10
sts bcd0,r16

;apagar disp izquierdo


ldi r16,0b11111111
sts bcd3,r16
pop xh
pop xl
pop r20 ;Restaurar los valores almacenados
pop r19 ;desde el stack point
pop r18
pop r17
pop r16
out sreg,r16
pop r16
ret
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&

;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&& RUTINA DE BCD_7SEGMENTOS
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
segmentos:
push r16 ;Almacenar el estado anterior
in r16,sreg ;de los registros en el stack point
push r16 ;para poder utilizarlos con la rutina
push r17 ;de conversi�n a siete segmentos
push xl
push xh
push yl
push yh

ldi xl,low(bcd0) ;inicializar el puntero X en el n�mero


ldi xh,high(bcd0) ;que contiene los d�gitos BCD
ldi yl,low(dig0) ;inicializar el puntero Y en el n�mero
ldi yh,high(dig0) ;donde se almacenar�n los segmentos
ldi r17,3

pasar: ldi zl,low(tabla<<1) ;inicializar el puntero Z a la tabla


ldi zh,high(tabla<<1) ;que contienen los segmentos
ld r16,x+ ;rutina para obtener los segmentos
del
add zl,r16 ;correspondiente n�mero BCD
clr r16
adc zh,r16
lpm r16,z
st y+,r16
dec r17
brne pasar

;comprobar si hay signo:


sbrs bandera,4
rjmp salirsegm
ldi r16,0b11000000
sts dig2,r16
ldi r16,0b10000000
sts dig3,r16

salirsegm:
pop yh ;Restaurar los valores almacenados
pop yl ;desde el stack point
pop xh
pop xl
pop r17
pop r16
out sreg,r16
pop r16
ret
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&

;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BARRIDO DE DISPLAYS
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
barrido: push r16 ;Almacenar el estado anterior
in r16,sreg ;de los registros en el stack point
push r16 ;para poder utilizarlos con la rutina
push r17 ;de conversi�n a siete segmentos
push r18
push xl
push xh

ldi xl,low(dig0) ;inicializo el puntero X


ldi xh,high(dig0) ;donde se encuentra el primer d�gito
ldi r18,4
ldi r17,0b11111110

barrido1:
ser r16 ;rutina de barrido de
ldi r23,0b10000000
out porta,r23
out portc,r16 ;los displays de siete segmentos
ld r16,x+

out porta,r16
out portc,r17
call retardo
ser r16 ;rutina de barrido de
ldi r23,0b10000000
out porta,r23
out portc,r16 ;los displays de siete segmentos
sec
rol r17
dec r18
brne barrido1

pop xh ;Restaurar los valores almacenados


pop xl ;desde el stack point
pop r18
pop r17
pop r16
out sreg,r16
pop r16
ret
retardo: ldi r22,0x43 ;rutina de retardo para
retard: ldi r23,0xc6 ;el barrido de los displays
retar: dec r23
brne retar
dec r22
brne retard
nop
ret

tabla: .db 0b10111111, 0b10000110 ; C�DIGOS 0 y 1


.db 0b11011011, 0b11001111 ; C�DIGOS 2 y 3
.db 0b11100110, 0b11101101 ; C�DIGOS 4 y 5
.db 0b11111101, 0b10000111 ; C�DIGOS 6 y 7
.db 0b11111111, 0b11101111 ; C�DIGOS 8 y 9

Você também pode gostar