You are on page 1of 6

/*

* Display7Seg.asm
*
* Created: 13/09/2015 17:08:36
* Author: Mauri
*/
;
Conexiones:
C0 -> Anodo Display 1
;
C1 -> Anodo Display 2
;
B0 - Pulsador Subida
;
B1 - Pulsador Bajada
;
D0 -> Segmento a del Display
;
D1 -> Segmento b del Display
;
D3 -> Segmento c del Display
;
D4 -> Segmento d del Display
;
D5 -> Segmento e del Display
;
D6 -> Segmento f del Display
;
D7 -> Segmento g del Display
.equ unidades=$60
.equ decenas=$61
;reset-vector address $0000
.org $0000
rjmp main

;ve al main

seg7:.db 0x80,0xf1,0x48,0x60,0x31,0x22,0x02,0xb0,0x00,0x20
;PROGRAMA PRINCIPAL
main:
ldi
out
ldi
out
ser
out
ldi
out
ldi
out
clr
sts
sts
ldi
ldi

r16,$04
sph,r16
r16,$5F
spl,r16
r16
ddrc,r16
r16,$fb
ddrd,r16
r16,$fc
ddrb,r16
r16
unidades,r16
decenas,r16
r30,low(seg7)
r31,high(seg7)

;Configuracion de...
;...la pila: Stack: $045F=RAMEND
;r16 <- $FF
;portC salida
;r16 <- $fb
;portD salidas, excepto D2
;r16 <- 0
;unidades <- 0
;decenas <- 0
;se carga en Z
;la direccin en flash de los datos del di

splay
ldi r16,2
add r30,r16

;r16 <- 2
;adecuamos el puntero Z para qeu apunte

a bytes
loop:
rcall multiplexar
pulsador
sbis pinb,0
rjmp incremento
rdo, sino se salta instruccin
rcall multiplexar
pulsador
sbis pinb,1
rjmp decremento
rdo, sino se salta instruccin
multi:

;mostramos datos, hasta que se suelte el


;pin B0 esta todava siendo pulsado?
;si, est pulsado, volvemos a generar reta
;mostramos datos, hasta que se suelte el
;pin B1 esta todava siendo pulsado?
;si, est pulsado, volvemos a generar reta

rcall multiplexar

;vamos a visualizar los datos en los dis

plays
rjmp loop
incremento:
;rcall delay25m
lds r16,unidades
lds r17,decenas
inc r16
ue contiene el valor de unidades
cpi r16,10
brmi salir
clr r16
inc r17
de decenas
cpi r17,2
brmi salir
clr r17
decremento:
;rcall delay25m
lds r16,unidades
lds r17,decenas
dec r16
ue contiene el valor de unidades
cpi r16,0
brmi salir
clr r16
dec r17
de decenas
cpi r17,2
brmi salir
clr r17
salir:
sts unidades,r16
sts decenas,r17
rjmp multi
datos
multiplexar:
sbi portc,0
sbi portc,1
lds r16,unidades
lds r15,decenas
mov r28,r30
mov r29,r31
add r30,r16
lazarse en la tabla
lpm r16,Z
mov r30,r28
add r30,r15
azarse en la tabla
lpm r15,Z
mov r30,r28
out portd,r16
l valor correspondiente
cbi portc,1
rcall delay1m
al ojo
sbi portc,1
ente
nop nop nop nop nop nop nop nop

;bucle infinito
;retardo antirrebote
;r16 <- unidades
;r17 <- decenas
;incrementamos el valor de r16 q
;r16<10?
;si es menor, salimos, sino...
;r16 <- 0, unidades a cero
;incrementamos r17 que contiene el valor
;r17<2?
;si es menor, salimos, sino...
;r17 <- 0,decenas a cero
;retardo antirrebote
;r16 <- unidades
;r17 <- decenas
;decrementamos el valor de r16 q
;r16<0?
;si es menor, salimos, sino...
;r16 <- 0, unidades a cero
;incrementamos r17 que contiene el valor
;r17<2?
;si es menor, salimos, sino...
;r17 <- 0,decenas a cero
;unidades <- r16
;decenas <- r17
;volvemos a multiplexar, con los nuevos

;apagamos ambos
;displays
;r16 <- unidades
;r17 <- decenas
;copiamos la direccin donde estan
;los datos del display
;se suma el valor de unidades, para desp
;r16 <- (Z)
;r30 <- r28
;se suma el valor de decenas, para despl
;r17 <- (Z)
;r30 <- r28
;se muestra en el display de unidades, e
;enciende el display correspondiente
;tiempo de retardo para que sea visible
;se apaga el display encendido anteriorm
;apagando transistor, requiere un tiempo

para apagarse
out portd,r15
valor correspondiente
cbi portc,0
rcall delay1m
al ojo
sbi portc,0
ente
ret
; =============================
;
delay loop generator
;
100000 cycles:
; ----------------------------; delaying 99990 cycles:
delay25m:
ldi R17, $A5
WGLOOP0: ldi R18, $C9
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================
; =============================
;
delay loop generator
;
4000 cycles:
; ----------------------------; delaying 3999 cycles:
delay1m:
ldi R17, $1F
WGLOOP00: ldi R18, $2A
WGLOOP11: dec R18
brne WGLOOP11
dec R17
brne WGLOOP00
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================

;se muestra en el display de decenas, el


;enciende el display correspondiente
;tiempo de retardo para que sea visible
;se apaga el display encendido anteriorm

/*
* Display7Seg.asm
*
* Created: 13/09/2015 17:08:36
* Author: Mauri
*/
;
Conexiones:
C0 -> Anodo Display 1
;
C1 -> Anodo Display 2
;
C2 - Pulsador Subida
;
C3 - Pulsador Bajada
;
Puerto B -> Displays de 7 sgmentos de ctodo comn.
;----------------------------------------------------------------; Registros: r5-r14 -> Registros para almacenar datos de displays.
; r16 -> registro temporal para pasar datos.
; r17 -> registro de carga de datos.
; r30 -> registro apuntador.
; r22-r24 -> registros para retardo.
;----------------------------------------------------------------.equ unidades=$60
.equ decenas=$61
;reset-vector address $0000
.org $00
jmp inicio ;va al inicio con un RESET
seg7:

;.db 0x80,0xf1,0x48,0x60,0x31,0x22,0x02,0xb0,0x00,0x20
.db 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F

;PROGRAMA PRINCIPAL
inicio:
;Cargar el puntero de pila
;------------------------ldi r16,high(ramend) ;Configuracion de...
out sph,r16
ldi r16,low(ramend)
out spl,r16 ;...la pila: Stack: $045F=RAMEND
;Configuracion de los puertos a utilizar
;--------------------------------------ser r16
out ddrd, r16 ;solo puerto d de salida para displays
ldi r16,$F3 ;puerto c 0b1110011
out ddrc,r16
clr r16
sts unidades,r16 ;unidades=0
sts decenas,r16 ;decenas=0
ldi r30,low(seg7) ;se carga en Z
ldi r31,high(seg7) ;direccin en flash de los datos del display
ldi r16,2
;r16=2

add r30,r16

;adecua el puntero Z para que apunte a bytes

loop:
rcall multiplexar
pulsador
sbis pinc,2
rjmp incremento
rdo, sino se salta instruccin
rcall multiplexar
pulsador
sbis pinc,3
rjmp decremento
rdo, sino se salta instruccin

;mostramos datos, hasta que se suelte el


;pin C2 esta todava siendo pulsado?
;si, est pulsado, volvemos a generar reta
;mostramos datos, hasta que se suelte el
;pin C3 esta todava siendo pulsado?
;si, est pulsado, volvemos a generar reta

multi:
rcall multiplexar

;vamos a visualizar los datos en los dis

plays
rjmp loop
;Inicio del conteo ascendente
incremento:
lds r16,unidades
lds r17,decenas
inc r16
cpi r16,$A
brmi sale
e instruccin
clr r16
inc r17
cpi r17,$2
brmi sale
e instruccin
clr r17
;Inicio conteo descendente
decremento:
lds r16,unidades
lds r17,decenas
dec r16
cpi r16,0
brmi sale
e instruccin
clr r16
dec r17
cpi r17,0
brmi sale
e instruccin
clr r17
multiplexar:
sbi
sbi
cbi
cbi
lds
lds
mov
mov
add
lazarse en la

portc,0
portc,1
portc,2
portc,3
r16,unidades
r15,decenas
r28,r30
r29,r31
r30,r16
tabla

;bucle infinito

;r16=unidaes
;r17=decenas
;incremento valor r16
;r16 menor a 10?
;si es menor sale sino continua siguient
;unidades a 0
;incrementamos valor r17
;r17 menor a 2?
;si es menor sale sino continua siguient
;decenas a 0

;r16=unidaes
;r17=decenas
;decremento valor r16
;r16 menor a 0?
;si es menor sale sino continua siguient
;unidades a 0
;decremento valor r17
;r17 menor a 0?
;si es menor sale sino continua siguient
;decenas a 0
;apagamos ambos
;displays
;r16 <- unidades
;r17 <- decenas
;copiamos la direccin donde estan
;los datos del display
;se suma el valor de unidades, para desp

lpm r16,Z
;r16 <- (Z)
mov r30,r28
;r30 <- r28
add r30,r15
;se suma el valor de decenas, para despl
azarse en la tabla
lpm r15,Z
;r17 <- (Z)
mov r30,r28
;r30 <- r28
out portd,r16
;se muestra en el display de unidades, e
l valor correspondiente
cbi portc,1
;enciende el display correspondiente
rcall delay1m
;tiempo de retardo para que sea visible
al ojo
sbi portc,1
;se apaga el display encendido anteriorm
ente
nop nop nop nop nop nop nop nop ;apagando transistor, requiere un tiempo
para apagarse
out portd,r15
;se muestra en el display de decenas, el
valor correspondiente
cbi portc,0
;enciende el display correspondiente
rcall delay1m
;tiempo de retardo para que sea visible
al ojo
sbi portc,0
;se apaga el display encendido anteriorm
ente
ret
sale:
sts unidades,r16
sts decenas,r17
rjmp multi
nuevos datos
delay25m:
ldi R17, $A5
WGLOOP0: ldi R18, $C9
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; ----------------------------; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================
delay1m:
ldi R17, $1F
WGLOOP00: ldi R18, $2A
WGLOOP11: dec R18
brne WGLOOP11
dec R17
brne WGLOOP00
; ----------------------------; delaying 1 cycle:
nop
ret
; =============================

;unidades <- r16


;decenas <- r17
;volvemos a multiplexar, con los

You might also like