Sunteți pe pagina 1din 94

PROGRAMAS RESUELTOS

conocer t promedio 4sensores cada seg


1seg con timer2
.include "m164pdef.inc"
.def tempo=r16
.def a=r17
.def b=r18
.dseg
valorh: .byte1
valorl: .byte1
.cseg
.org 0x00
rjmp inicio
.org 0x12
rjmp segundo
inicio:
;conf puertos
;activo stack
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,0b00001111;desactivo
parte digital

sts ddr0,tempo
;activo timer2
ldi tempo,31
sts ocrra,tempo
ldi
tempo,0b00000001;modoctc,normal
sts tccrra,tempo
ldi tempo, 0b00000111;1:1024
sts tccrrb,tempo
ldi tempo,0b01100000;asincronico
sts assr,tempo
ldi
tempo,0b00000010;interrupciom
sts timsk2,tempo
sei
programa:
rjmp programa
segundo:
push r16
in r16,sreg
push r16

EJEMPLO 2
/*
* Contador_de_monedas.asm
*
* Created: 12/10/2013 8:21:02
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
CONT1=R25
CONT2=R26
CONT3=R27
CONT4=R28
ANTE=R17
AUX=R18
AUX1=R19
NUMA=R20
NUMB=R21
DECENAS=R22
CENTENAS=R23
MILES=R24

.CSEG
.ORG
RJMP

0X00
INICIO

.ORG
RJMP

0X08
MONEDAS

INICIO:
LDI
OUT
LDI
OUT
OUT
OUT
LDI
OUT

TEMPO,0B00000000
DDRA,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
DDRB,TEMPO
DDRD,TEMPO
TEMPO,0B11111111
PORTA,TEMPO

IN
ANDI
OUT

TEMPO,MCUCR
TEMPO,0B11101111
MCUCR,TEMPO

LDI
OUT
LDI

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)

OUT

SPL,TEMPO

LDI
STS
LDI
STS
SEI

TEMPO,0B00000001
PCICR,TEMPO
TEMPO,0B00111111
PCMSK0,TEMPO

IN

ANTE,PINA

LAZO:

OUT
OUT
OUT
RJMP

MONEDAS:
PUSH
IN
PUSH
IN
EOR
IN
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
SBRC
RJMP
RJMP

PORTB,CONT1
PORTC,CONT2
PORTD,CONT3
LAZO

R16
R16

R16,SREG

TEMPO,PINA
TEMPO,ANTE
ANTE,PINA
TEMPO,0
CENTAVOS_100
TEMPO,1
CENTAVOS_50
TEMPO,2
CENTAVOS_25
TEMPO,3
CENTAVOS_10
TEMPO,4
CENTAVOS_5
TEMPO,5
CENTAVOS_1
RETORNO

CENTAVOS_100:
SBIC
PINA,0
RJMP
RETORNO
LDI
AUX,100
ADD
CONT1,AUX
CLR
AUX
ADC
CONT2,AUX
ADC
CONT3,AUX
ADC
CONT4,AUX
RJMP
RETORNO
CENTAVOS_50:
SBIC
PINA,1
RJMP
RETORNO
EJEMPLO 3

LDI
ADD
CLR
ADC
ADC
ADC
RJMP

AUX,50
CONT1,AUX
AUX
CONT2,AUX
CONT3,AUX
CONT4,AUX
RETORNO

CENTAVOS_25:
SBIC
PINA,2
RJMP
RETORNO
LDI
AUX,25
ADD
CONT1,AUX
CLR
AUX
ADC
CONT2,AUX
ADC
CONT3,AUX
ADC
CONT4,AUX
RJMP
RETORNO
CENTAVOS_10:
SBIC
PINA,3
RJMP
RETORNO
LDI
AUX,10
ADD
CONT1,AUX
CLR
AUX
ADC
CONT2,AUX
ADC
CONT3,AUX
ADC
CONT4,AUX
RJMP
RETORNO
CENTAVOS_5:
SBIC
RJMP
LDI
ADD
CLR
ADC
ADC
ADC
RJMP

PINA,4
RETORNO
AUX,5
CONT1,AUX
AUX
CONT2,AUX
CONT3,AUX
CONT4,AUX
RETORNO

CENTAVOS_1:
SBIC
RJMP
LDI
ADD
CLR
ADC
ADC
ADC
RJMP

PINA,5
RETORNO
AUX,1
CONT1,AUX
AUX
CONT2,AUX
CONT3,AUX
CONT4,AUX
RETORNO

RETORNO:
POP
OUT
POP

R16
SREG,R16
R16 ; RETI

/*
* Sensores_Impresora.asm
*
* Created: 13/10/2013 18:12:04
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
ANTE=R17
CONT=R18
AUX=R19

.ORG
RJMP
.ORG
RJMP

0X0
INICIO
0XC
SENSORES

INICIO:
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO
OUT DDRC,TEMPO
OUT DDRD,TEMPO
LDI
TEMPO,0B00000011
OUT DDRA,TEMPO
LDI
TEMPO,0B11111111
OUT PORTB,TEMPO
OUT PORTD,TEMPO
LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

LDI
STS
LDI
STS

TEMPO,0B00000100
PCICR,TEMPO
TEMPO,0B00001111
PCMSK2,TEMPO

IN
SEI

ANTE,PINC

LAZO:
OUT PORTA,AUX
RJMP LAZO
SENSORES:
PUSH R16
IN
R16,SREG
PUSH R16
IN
ANTE,PINC
CPI
ANTE,0B00000001
BREQ VERIFICAR1
CPI
ANTE,0B00000011
BREQ VERIFICAR2
CPI
ANTE,0B00000111
BREQ VERIFICAR3
CPI
ANTE,0B00001110
BREQ VERIFICAR4

CPI
BREQ
CPI
BREQ
CPI
BREQ
RJMP

ANTE,0B00001100
VERIFICAR5
ANTE,0B00001000
VERIFICAR6
ANTE,0B00000000
VERIFICAR7
ERROR

VERIFICAR1:
INC
CONT
CPI
CONT,1
BRNE ERROR
BREQ CORRECTO
VERIFICAR2:
INC
CONT
CPI
CONT,2
BRNE ERROR
BREQ CORRECTO
VERIFICAR3:
INC
CONT
CPI
CONT,3
BRNE ERROR
BREQ CORRECTO
VERIFICAR4:
INC
CONT
CPI
CONT,4
BRNE ERROR
BREQ CORRECTO
VERIFICAR5:
INC
CONT
CPI
CONT,5
BRNE ERROR
BREQ CORRECTO
VERIFICAR6:
INC
CONT
CPI
CONT,6
BRNE ERROR
BREQ CORRECTO
VERIFICAR7:
INC
CONT
CPI
CONT,7
BRNE ERROR
BREQ CORRECTO1
CORRECTO:
LDI
AUX,0B00000010
RJMP RETORNO
ERROR:
LDI
TEMPO,0B00000000
STS
PCMSK2,TEMPO
LDI
AUX,0B00000001

RJMP RETORNO
CORRECTO1:
CLR CONT
LDI
AUX,0B00000010
RJMP RETORNO

RETORNO:
POP R16
OUT SREG,R16
POP R16
RETI

EJEMPLO 4
/*
* Automatizar__juego.asm
*
* Created: 14/10/2013 8:28:25
* Author: vivia_000
*/
.DEF
.DEF
.DEF

TEMPO=R16
AUX=R17
CONT=R18

.ORG
RJMP
.ORG
RJMP

0X0
INICIO
0X08
JUEGO

INICIO:
LDI
TEMPO,0B00000000
OUT DDRA,TEMPO
LDI
TEMPO,0B11111111
OUT DDRB,TEMPO
OUT DDRD,TEMPO
OUT PORTA,TEMPO
IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
LDI
OUT
LDI
OUT

TEMPO,HIGh(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

LDI
STS
LDI
STS

TEMPO,0B00000001
PCICR,TEMPO
TEMPO,0B00000111
PCMSK0,TEMPO

LAZO:
CPI
BREQ
CPI
BREQ

CONT,9
TABLA2
CONT,10
TABLA3

TABLA1:
LDI

ZH,HIGH(TABLA<<1)

LDI
ADD
CLR
ADC
LPM
OUT
RJMP

ZL,LOW(TABLA<<1)
ZL,CONT
AUX
ZH,AUX
AUX,Z
PORTB,AUX
LAZO

TABLA2:
LDI
OUT
LDI
OUT
RJMP

AUX,0B11111111
PORTB,AUX
AUX,0B00000001
PORTD,TEMPO
LAZO

TABLA3:
LDI
AUX,0B11111111
OUT PORTB,AUX
LDI
AUX,0B00000011
OUT PORTD,AUX
RJMP LAZO
JUEGO:
PUSH R16
IN
R16,SREG
PUSH R16
SBIS PINA,0
RJMP FILA1
SBIS PINA,1
RJMP FILA2
SBIS PINA,2
RJMP FILA3
RJMP RETORNO
FILA1:
SBIS
SUBI
SBIS
SUBI
SBIS
SUBI
RJMP

PINA,3
CONT,-0
PINA,4
CONT,-1
PINA,5
CONT,-0
RETORNO

FILA2:
SBIS PINA,3
SUBI CONT,-0
SBIS PINA,4
SUBI CONT,-1

SBIS PINA,5
SUBI CONT,-0
RJMP RETORNO
FILA3:
SBIS
SUBI
SBIS
SUBI
SBIS
SUBI
RJMP

RETORNO:
POP R16
OUT SREG,R16
POP R16
RETI

PINA,3
CONT,-0
PINA,4
CONT,-1
PINA,5
CONT,-0
RETORNO

TABLA:
.DB
0B00000000,0B00000001
.DB
0B00000011,0B00000111
.DB
0B00001111,0B00011111
.DB
0B00111111,0B01111111
.DB
0B11111111

EJEMPLO
/*
* Clasificadora_de_huevos.asm
*
* Created: 13/10/2013 14:47:37
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
PEQUENOS=R17
MEDIANOS=R18
GRANDES=R19
CUBETA1=R20
CUBETA2=R21
CUBETA3=R22

.DSEG
PEQUENOS1:
PEQUENOS2:
MEDIANOS1:
MEDIANOS2:
GRANDES1:
GRANDES2:
.CSEG
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP

.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE

1
1
1
1
1
1

0X00
INICIO
0X02
HUEVOS_PEQUENOS
0X04
HUEVOS_MEDIANOS
0X06
HUEVOS_GRANDES

INICIO:
LDI
TEMPO,0B11111111
OUT DDRA,TEMPO
OUT DDRC,TEMPO
OUT PORTB,TEMPO
OUT PORTD,TEMPO
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO

OUT

DDRD,TEMPO

IN
TEMPO,MCUCR
ANDI TEMPO, 0B1110111
OUT MCUCR,TEMPO
LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

LDI
STS
LDI
OUT
OUT
SEI

TEMPO,0B00101010
EICRA,TEMPO
TEMPO,0B00000111
EIMSK,TEMPO
EIFR,TEMPO

LAZO:
OUT PORTA,R24
OUT PORTC,R26
RJMP LAZO

HUEVOS_PEQUENOS:
PUSH
IN
PUSH
INC
CPI
BREQ
POP
OUT
POP
RETI

R16
R16,SREG
R16
PEQUENOS
PEQUENOS,12
CUBETA_PEQUENOS
R16
SREG,R16
R16

CUBETA_PEQUENOS:

CLR
ADIW
STS
STS
POP
OUT
POP
RETI

PEQUENOS
R25:R24,1
PEQUENOS1,R24
PEQUENOS2,R25
R16
SREG,R16
R16

HUEVOS_MEDIANOS:
PUSH
IN
PUSH
INC
CPI
BREQ
POP
OUT
POP
RETI

R16
R16,SREG
R16
MEDIANOS
MEDIANOS,12
CUBETA_MEDIANOS
R16
SREG,R16
R16

CUBETA_MEDIANOS:
CLR MEDIANOS
ADIW R27:R26,1
STS
MEDIANOS1,R26
STS
MEDIANOS2,R27

POP
OUT
POP
RETI

R16
SREG,R16
R16

HUEVOS_GRANDES:
PUSH
IN
PUSH
INC
CPI
BREQ
POP
OUT
POP
RETI

R16

R16,SREG
R16
GRANDES
GRANDES,12
CUBETA_GRANDES
R16
SREG,R16
R16

CUBETA_GRANDES:
CLR GRANDES
ADIW R29:R28,1
STS
GRANDES1,R28
STS
GRANDES2,R29
POP R16
OUT SREG,R16
POP R16
RETI

EJEMPLO
/*
* Prueba_2__ejercicio1.asm
*
* Created: 07/10/2013 20:59:50
* Author: vivia_000
*/
.DEF
.DEF
.DEF

TEMPO=R16
AUX=R17
CONT=R18

.DSEG
DIG0:
DIG1:
DIG2:
DIG3:
DIG4:
DIG5:
BCD0:
BCD1:
BCD2:
BCD3:
BCD4:
BCD5:

.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE

1
1
1
1
1
1
1
1
1
1
1
1

.CSEG
.ORG 0X0000
LDI
OUT
OUT
LDI
OUT
OUT
OUT
LDI
OUT

TEMPO,0B00000000
DDRA,TEMPO
DDRB,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
PORTA,TEMPO
PORTB,TEMPO
TEMPO,0B11111111
DDRD,TEMPO

; HABILITAR RESISTENAS INTERNAS


IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
; CARGAR VALORES EN LA SRAM
INICIO:
LDI
TEMPO,4
STS
DIG0,TEMPO
LDI
TEMPO,3

STS
DIG1,TEMPO
LDI
TEMPO,9
STS
DIG2,TEMPO
LDI
TEMPO,0
STS
DIG3,TEMPO
LDI
TEMPO,1
STS
DIG4,TEMPO
LDI
TEMPO,6
STS
DIG5,TEMPO
CALL BCD_7SEG
CALL BARRIDO
RJMP INICIO
; CONFIGURAR STACK POINTER
LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

BCD_7SEG:
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH

R16
R17
ZL
ZH
XL
XH
YL
YH

LDI
LDI
LDI
LDI
LDI

YH,HIGH(DIG0)
YL,LOW(DIG0)
XH,HIGH(BCD0)
XL,LOW(BCD0)
R17,6

BCD_7SEG1:
LDI
LDI
LD
ADD
CLR
ADC
LPM
ST
DEC
BRNE

ZH,HIGH(TABLA_7SEG<<1)
ZL,LOW(TABLA_7SEG<<1)
R16,Y+
ZL,R16
R16
ZH,R16
R16,Z
X+,R16
R17
BCD_7SEG1

POP
POP
POP
POP
POP
POP
POP
POP

YH
YL
XH
XL
ZH
ZL
R17
R16

RET
;BARRIDO
BARRIDO:
PUSH
PUSH
PUSH
PUSH
PUSH

R16
R17
R18
XH
XL

LDI
LDI
LDI
SEC
LDI
SER
OUT

R16,6
XH,HIGH(BCD0)
XL,LOW(BCD0)
R18,0B11111110
R17
PORTC,R17

OTRO_DIG:
OUT
LD
OUT
CALL
SER
OUT
ROL
DEC
BRNE

PORTD,R18
R17,X+
PORTC,R17
RETARDO
R17
PORTC,R17
R18
R16
OTRO_DIG

POP
POP
POP
POP
POP

XL
XH
R18
R17
R16

RET
RETARDO:
PUSH R16
LDI
R16,10
LAZO_RETARDO:

POP
RET

R16

TABLA_7SEG:

NOP
DEC
R16
BRNE LAZO_RETARDO

.db
0b1000000,0b1111001
;0,1
.db
0b0100100,0b0110000
;2,3

.db
0b0011001,0b0010010
;4,5
.db
0b0000010,0b1111000
;6,7
.db
0b0000000,0b0010000
;8,9

EJEMPLO
.include "m164pdef.inc"

sei

.def
.def
.def
.def
.def

principal:
rjmp principal

tempo=r16
aux=r17
maxh=r18
maxl=r19
sal=r20

.cseg
.org 0x08
jmp seleccionar
.org 0x001A
jmp toggle
;CONFIGURACION DE PUERTOS

seleccionar:
in aux,pina
sbrc aux,0
ldi maxl,0b10011110
sbrc aux,0
ldi maxh,0b00101111
sbrc aux,1
ldi maxl,0b10000010
sbrc aux,1
ldi maxh,0b00101111

main:
ldi tempo,0b00000000
out ddra,tempo
ldi tempo,0b00000001
out ddrb,tempo
ldi tempo,0b00000000
sts eicra,tempo
ldi tempo,0b00000000
out eimsk,tempo
ldi tempo,0b00000001
out pcifr,tempo
ldi tempo,0b00111111
out pcmsk0,tempo

sbrc aux,2
ldi maxl,0b10010010
sbrc aux,2
ldi maxh,0b00011010
sbrc aux,3
ldi maxl,0b11101110
sbrc aux,3
ldi maxh,0b00010011
sbrc aux,4
ldi maxl,0b11100001
sbrc aux,4
ldi maxh,0b00001111
sbrc aux,5
ldi maxl,0b11010110
sbrc aux,5
ldi maxh,0b00001011

;modo ctc
ldi tempo,0b00000000
lds tccr1a,tempo
;prescaler=8
ldi tempo,0b00001010
lds tccr1b,tempo
ldi tempo, 0b00000010
lds timsk1,tempo
lds ocr1ah,maxh
lds ocr1al,maxl
out portb,sal
reti
toggle:
neg sal
reti

EJEMPLO
/*
* Prueba2_ejerccio2.asm
*
* Created: 13/10/2013 10:17:56
.DEF
.DEF

TEMPO=R16
TECLA=R17

.DEF ANTE=R18
.DEF COLUMNA=R19
.DEF FILA=R20
.DEF AUX=R21
.DEF AUX1=R22
.DSEG
DIG0: .BYTE 1
.CSEG
.ORG 0X00
LDI
OUT
OUT
LDI
OUT
OUT
OUT
OUT

TEMPO,0B00000000
DDRB,TEMPO
DDRD,TEMPO
TEMPO,0B11111111
PORTA,TEMPO
PORTB,TEMPO
PORTD,TEMPO
DDRC,TEMPO

IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
INICIO:
LDI
TECLA,16
LDI
ANTE,16
BARRIDO:
BARRIDO_FILAS:
LDI
OUT
LDI
OUT
SBIS
LDI
SBIS
LDI
SBIS
LDI
SBIS
LDI

TEMPO,0B00001111
DDRA,TEMPO
TEMPO,0B11110000
PORTA,TEMPO
PINA,4
COLUMNA,0
PINA,5
COLUMNA,1
PINA,6
COLUMNA,2
PINA,7
COLUMNA,3

BARRIDO_COLUMNAS:
LDI
OUT
LDI
OUT
SBIS
LDI
SBIS
LDI
SBIS
LDI
SBIS

TEMPO,0B11110000
DDRA,TEMPO
TEMPO,0B00001111
PORTA,TEMPO
PINA,0
FILA,0
PINA,1
FILA,1
PINA,2
FILA,2
PINA,3

LDI

FILA,3

CALCULO:
LDI
AUX1,4
MUL FILA,AUX1
MOV FILA,R0
ADD COLUMNA,FILA
MOV TECLA,COLUMNA
STS
DIG0,TECLA
CP
BREQ
MOV
CPI
BREQ

TECLA,ANTE
BARRIDO
ANTE,TECLA
TECLA,16
BARRIDO

DESPLIEGUE:
LDI
ZH,HIGH(TABLA<<1)
LDI
ZL,LOW(TABLA<<1)
ADD ZL,TECLA
CLR TECLA
ADC ZH,TECLA
LPM AUX,Z
OUT PORTC,AUX
CLR TECLA
RJMP INICIO
TABLA:
.DB
0b00111111,0b00000110
.DB
0b01011011,0b01001111
.DB
0b01100110,0b01101101
.DB
0b01011111,0b00000111
.DB
0b01111111,0b01100111
.DB
0b01110111,0b01111100
.DB
0b00111001,0b01011110
.DB
0b01111001,0b01110001

EJEMPLO
.include "m164pdef.inc"
.def tempo=r16
.def aux=r17
.def banda=r18
.def bajo=r19
.def alto=r20

.def fin=r21

ldi aux,0

.cseg
.org 0x00
jmp inicio
.org 0x2
jmp paso1
.org 0x4
jmp paso2
.org 0x30
jmp finad

ldi tempo,0b01100000
add tempo,aux
sts admux,tempo
ldi tempo,0b1101110
sts adcsra,tempo
espera:
sbrs fin,0
rjmp espera

inicio:

out porta,alto
out portb,bajo

ldi tempo,0b11111111
out ddrb,tempo
ldi tempo,0
out portb,tempo

ldi tempo,1
add banda,tempo
out portc,banda
rjmp despliegue

ldi tempo,0b00000011
out ddrd,tempo
ldi tempo,0
out portd,tempo

paso1:
ldi banda,0
reti

ldi tempo,0
out ddra,tempo
ldi tempo,1
out ddrc,tempo
ldi tempo,0
out portc,tempo
ldi tempo,0b00000011
sts didr0,tempo
ldi tempo,0b00001111
sts eicra,tempo
ldi tempo,0b00000011
out eimsk,tempo
sei
clr peso
despliegue:
sbrc banda,0
ldi aux,1

paso2:
ldi banda,1
reti
finad:
lds bajo,adcl
lds alto,adch
ldi fin,1
reti
EJEMPLO
.include
.def
.def
.def
.def
.def
.def
.def
XD :D
.cseg
.org
rjmp
.org

"m164pdef.inc"
tempo=R16
fijol=R17
fijoh=R18
OCH=R19
OCL=R20
conta=R21
leds=R22

0x00
inicio
0x02

rjmp
.org
rjmp
.org
rjmp

subir
0x04
bajar
0x06
prender_apagar

inicio:
clr
clr
clr
clr
ser
out
clr
out
com
out
ldi
out
ldi
out

OCH
OCL
conta
leds
tempo
ddra,tempo
tempo
ddrb,tempo
tempo
portb,tempo
tempo,0b00000011
ddrc,tempo
;

tempo,0b00100000
ddrd,tempo
;salida PD5 Fast PWM
ldi
tempo,0b11011111
out
portd,tempo
;aseguro pull up
in
andi
out

tempo,MCUCR
tempo,0b11101111
MCUCR,tempo

;inicio stack pointer


ldi
tempo,high(ramend)
out
sph,tempo
ldi
tempo,low(ramend)
out
spl,tempo
;configuro interrupciones externas
ldi
sts
ldi
out
out

tempo,0b00101010
EICRA,tempo
tempo,0b00000111
EIMSK,tempo
EIFR,tempo

SEI
;configuro TIMER1
ldi
sts
ldi
sts
clr
sts
ldi

tempo,0b00000010 ;11
TCCR1A,tempo
tempo,0b00011101
TCCR1B,tempo
tempo
TCCR1C,tempo
tempo,0
; Inicio en 0 XD

sts
ldi
sts

OCR1AH,tempo
tempo,0
OCR1AL,tempo

; escribir high luego low


ldi
tempo,high(6484)
sts
ICR1H,tempo
ldi
tempo,low(6484)
sts
ICR1L,tempo
ldi
fijol,low(648)
ldi
fijoh,high(648)
ldi
tempo,0
out
porta,tempo
out
portc,tempo
SEI
LAZO:
cpi
breq cero
cpi
breq uno
cpi
breq dos
cpi
breq tres
cpi
breq cuatro
cpi
breq cinco
cpi
breq seis
cpi
breq siete
cpi
breq ocho
cpi
breq nueve
cpi
breq diez
cero:
ldi
out
out
rjmp lazo
uno:
ldi
out
rjmp lazo
dos:
ldi
out
rjmp lazo
tres:
ldi
out
rjmp lazo
cuatro:

leds,0
leds,1
leds,2
leds,3
leds,4
leds,5
leds,6
leds,7
leds,8
leds,9
leds,10
tempo,0
porta,tempo
portc,tempo
tempo,0b00000001
porta,tempo
tempo,0b00000010
porta,tempo
tempo,0b00000100
porta,tempo

ldi
out
rjmp lazo
cinco:
ldi
out
rjmp
seis:
ldi
out
rjmp
siete:
ldi
out
rjmp
ocho:
ldi
out
ldi
out
rjmp
nueve:
ldi
out
ldi
out
rjmp
diez:
ldi
out
ldi
out

lazo

RJMP

LAZO

tempo,0b00001000
porta,tempo
tempo,0b00010000
porta,tempo

tempo,0b00100000
porta,tempo
lazo

tempo,0
conti_bajar
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16

reti
tempo,0b01000000
porta,tempo

lazo
tempo,0b10000000
porta,tempo
tempo,0
portc,tempo
lazo
tempo,0
porta,tempo
tempo,0b00000001
portc,tempo
lazo
tempo,0
porta,tempo
tempo,0b00000010
portc,tempo

prender_apagar:
push
r16
in
push
r16
inc
cpi
breq

r16

apagar:
clr
ldi
sts
rjmp
encender:
ldi
sts
rjmp

conta
tempo,0b00000010 ;11
TCCR1A,tempo
conti_PA
tempo,0b10000010
TCCR1A,tempo
conti_PA
r16
sreg,r16
r16

reti
r16,SREG

r16
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16

reti

EJEMPLO
/*
* Contador_Radiacion.asm
*
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R17
NIVELL=R18
NIVELH=R19
SALIDA=R20
AUX=R21

.ORG
RJMP
.ORG
RJMP

0X00
INICIO
0X1A
DIEZMSEG

bajar:
push
in
push
lds

r16,SREG

conta
conta,1
encender

conti_PA:
pop
out
pop

subir:
push
in
push
inc
add
adc
sts
sts
pop
out
pop

cpi
breq
dec
sub
sbc
sts
sts
conti_bajar:
pop
out
pop

r16
r16,SREG

r16
tempo,OCR1AL

.ORG 0X24
RJMP DESBORDE
INICIO:
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO
LDI
TEMPO,0B11111111
OUT DDRA,TEMPO
OUT PORTB,TEMPO
;ACTIVO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;CONFIGURO TIMER 0
LDI
TEMPO,0B00000000
;NO UTILIZO COMPA,COMPB, USO
MODO NORMAL
OUT TCCR0A,TEMPO
LDI
TEMPO,0B00000110
;110(CONTADOR)
OUT TCCR0B,TEMPO
CLR TEMPO
CLR NIVELL
CLR NIVELH
LDI
TEMPO,0B00000001
STS
TIMSK0,TEMPO
;CONFIGURO TIMER 1
LDI
TEMPO,0B00000000
;NO UTILIZO COMPA,COMPB, USO
MODO CTC HASTA OCR1A
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(1249)
STS
OCR1AL,TEMPO
LDI
TEMPO,LOW(1249)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00001011
;NO FORZAR SALIDAS,MODO CTC
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00000010
STS
TIMSK1,TEMPO
SEI
MAIN:
OUT PORTA,SALIDA
RJMP MAIN
DESBORDE:
PUSH R16
IN
PUSH R16

R16,SREG

LDI
ADD
CLR
ADC
POP
OUT
POP
RETI

AUX,1
NIVELL,AUX
AUX
NIVELH,AUX
R16
SREG,TEMPO
R16

DIEZMSEG:
PUSH R16
IN
R16,SREG
PUSH R16
COMPROBAR1:
CPI
NIVELH,HIGH(10000)
BRCC COMPROBAR2
CPI
NIVELL,LOW(10000)
BRCC COMPROBAR2
LDI
SALIDA,0B00000001
SALIR:
CLR NIVELL
CLR NIVELH
POP R16
OUT SREG,TEMPO
POP R16
RETI
COMPROBAR2:
CPI
NIVELH,HIGH(30000)
BRCC COMPROBAR3
CPI
NIVELL,LOW(30000)
BRCC COMPROBAR3
LDI
SALIDA,0B00000010
RJMP SALIR
COMPROBAR3:
LDI
SALIDA,0B00000100
RJMP SALIR

EJEMPLO
/*
* Diferencia_de_se?ales.asm
*
* Created: 16/11/2013 11:31:15
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
DATO1=R17
DATO11=R18
DATO2=R19
DATO22=R20

.ORG 0X00
LDI

TEMPO,0B00000000

OUT

DDRA,TEMPO
;ENTRADA ADC0
LDI
TEMPO,0B00100000
OUT DDRD,TEMPO
;SALIDA DEL PWM
LDI
TEMPO,0B11111111
OUT PORTA,TEMPO
;CONFIGURO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;CONFIGURO A/D
LAZO:

RJMP LAZO
ESPERA:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA
RET

CANAL0:
LDI
TEMPO,0B01100000
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
CALL ESPERA
LDS DATO1,ADCL
LDS DATO11,ADCH
CANAL1:
LDI
TEMPO,0B01100001
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
CALL ESPERA
LDS DATO2,ADCL
LDS DATO22,ADCH
SUB
SBC
BRCS
RJMP

DATO1,DATO2
DATO11,DATO22
COMPLEMENTO
TIMER

COMPLEMENTO:
COM DATO1
COM DATO11
TIMER:
LDI
TEMPO,0B10000011
;CREAR UN PWM CUANDO
ESTA SUBIENDO 0L, PWM (0CR0A)
STS
TCCR1A,TEMPO
LDI
TEMPO,0B00010010
;10 MODO DE TRABAJO,010
PREESCAKER 1:8
STS
TCCR1B,TEMPO
STS
STS

OCR1AH,DATO1
OCR1AL,DATO11

EJEMPLO
/*
* POTENCIA_DE_UN_HORNO.asm
*
* Created: 17/11/2013 9:24:26
* Author: vivia_000
*/
.DEF
.DEF
.DEF

TEMPO=R16
TALTO=R17
TBAJO=R18

.ORG
RJMP
.ORG
RJMP
.ORG
RJMP

0X00
INICIO
0X02
SUBE_TALTA
0X04
BAJA_TBAJO

.ORG 0X06
RJMP ENCENDER_APAGAR
INCIO:
LDI

TEMPO,0B00100000
;SALIDA DE PWM
OUT DDRD,TEMPO
LDI
TEMPO,0B00000000
OUT DDRB,TEMPO
LDI
TEMPO,0B11111111
OUT PORTB,TEMPO
OUT PORTD,TEMPO
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

; CONFIGURO TIMER1
SUBE_TALTA:
PUSH R16
IN
R16,SREG
PUSH R16
LDI

TEMPO,0B10000011
;MI SALIDA POR COMPA UN 1L
CUANDO TA ,FAST PWM
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(31562)
STS
OCR1AH,TEMPO
LDI
TEMPO,LOW(31562)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00011101
STS
TCCR1B,TEMPO
LDI

TEMPO,

BAJA_ABAJ0:

EJEMPLO
/*
* Proyectil__Distancia.asm
.DEF
.DEF
.DEF

TEMPO=R16
TIEMPOL=R17
TIEMPOH=R18

.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP

0X00
INICIO
0X02
SUELTA
0X04
BORRAR_TIEMPO
0X18
CAPTURA

INICIO:
LDI
TEMPO,0B00000000
;ENTRADA DE LOS
PULSANTES
OUT DDRD,TEMPO
LDI
TEMPO,0B11111111

OUT
OUT

DDRA,TEMPO
DDRB,TEMPO

;CONFIGURO STACK POINTER


LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;CONFIGURO INTERRUPCIONES
LDI
TEMPO,0B00001010
;ACTIVO
INTERRUPCIONES CON FLANCO NEGATIVO
STS
EICRA,TEMPO
LDI
TEMPO,0B00000011
OUT EIMSK,TEMPO
;ACTIVO
INTO, INT1
OUT EIFR,TEMPO
;CONFIGURO TIMER1
LDI
TEMPO,0B00000000
;COMPA,COMPB
CERO PORQUE NO VOY A SACAR NADA, Y
UTILIZO MODO NORMAL PARA Q SOLO
CUENTE
STS
TCCR1A,TEMPO
LDI
TEMPO,0B11000000
;ELIMINO
RUIDO,ACTIVO CAPTURA, Y DETENDO EL
TIMER
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00100000
;ACTIVO EL BIT DE
CAPTURA
STS
TIMSK1,TEMPO
SEI
LAZO:
RJMP LAZO
SUELTA:
PUSH R16
IN
PUSH R16

R16,SREG

LDI

TEMPO,0B11000101
;UTILIZO UN
CRISTAL DE 1MHZ PARA PODER OBTENER
UN TIEMPO MAS GRANDE,PREESCALER
1024
STS
TCCR1B,TEMPO
POP R16
OUT SREG,R16
POP R16
RETI
BORRAR_TIEMPO:
PUSH R16

IN
R16,SREG
PUSH R16
LDI
TEMPO,0B11000000
;DETENGO EL TIMER
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
POP R16
OUT SREG,R16
POP R16
RETI
CAPTURA:
PUSH R16
IN
PUSH R16

R16,SREG

LDI

TEMPO,0B11000000
;DETENGO EL TIMER
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
LDS TIEMPOL,ICR1L
;RECUPERO
EL TIEMPO
LDS TIEMPOH,ICR1H
OUT PORTA,TIEMPOL
OUT PORTB,TIEMPOH
POP R16
OUT SREG,R16
POP R16
RETI

EJEMPLO

/*
* Respuesta_de_un_chofer.asm
*
* Created: 16/11/2013 16:47:13
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
TIEMPOL=R17
TIEMPOH=R18
LED=R19

.DSEG
TLOW: .BYTE 1
THIGH:
.BYTE 1
.CSEG
.ORG
RJMP
.ORG
RJMP

0X00
INICIO
0X02
CONECTAR

.ORG 0X18
RJMP CAPTURA
INICIO:
LDI
TEMPO,0B0000000
OUT DDRD,TEMPO
LDI
TEMPO,0B0000001
OUT DDRC,TEMPO
LDI
TEMPO,0B11111111
OUT PORTD,TEMPO
OUT DDRB,TEMPO
OUT DDRA,TEMPO
;ACTIVO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B00010000
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;INTERRUPCION EXTERNA
LDI
TEMPO,0B00000010
STS
EICRA,TEMPO
LDI
TEMPO,0B00000001
OUT EIMSK,TEMPO
OUT EIFR,TEMPO

LDI
LDI
STS
POP
OUT
POP
RETI

LED,1
TEMPO,0B11000001
TCCR1B,TEMPO
R16
SREG,R16
R16

CAPTURA:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
LED,0
LDI
TEMPO,0B11000000
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
LDS TIEMPOL,ICR1L
LDS TIEMPOH,ICR1H
STS
TLOW,TIEMPOL
STS
THIGH,TIEMPOH
POP R16
OUT SREG,R16
POP R16
RETI

;CONFIGURO TIMER2
LDI
STS
LDI
STS
LDI

TEMPO,0B00000010
TCCR2A,TEMPO
TEMPO,0B00000001
TCCR2B,TEMPO
TEMPO,0B00100000

;CONFIGURO TIMER1
LDI
STS
LDI
STS
LDI
STS
SEI
MAIN:
OUT
OUT
OUT
RJMP

TEMPO,0B00000000
TCCR1A,TEMPO
TEMPO,0B11000000
TCCR1B,TEMPO
TEMPO,0B00100000
TIMSK1,TEMPO

PORTC,LED
PORTB,TIEMPOL
PORTA,TIEMPOH
MAIN

CONECTAR:
PUSH R16
IN
PUSH R16

R16,SREG

EJEMPLO
/*
* Sensor_Motor_Bujia.asm
*
* Created: 14/11/2013 13:18:09
* Author: vivia_000
*/
.DEF
.DEF
.DEF

TEMPO=R20
VECES=R17
SALIDA=R18

.ORG
RJMP
.ORG
RJMP
.ORG

0X00
INICIO
0X02
CONTEO
0X1A
;TIMER1 COMPARADOR A
RJMP UNSEG
INICIO:

LDI
OUT
LDI
OUT
LDI
OUT
LDI
OUT

TEMPO,0B00000000
DDRB,TEMPO
;ENTRADA
TEMPO,0B11111111
DDRA,TEMPO
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

;CONF INTERRUPCION EXTERNA


LDI
TEMPO,0B00100000
STS
EICRA,TEMPO
LDI
TEMPO,0B00000001
OUT EIMSK,TEMPO
OUT EIFR,TEMPO
;CONFIGURO TIMER1
LDI

TEMPO,0B00000000
;MODO CTC ,NO UTILIZO
COMPA,COMPB
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(31249)
STS
OCR1AH,TEMPO
LDI
TEMPO,LOW(31249)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00001100
;0
ELIMINO RUIDO,0 MODO DE
CAPTURA,MODO CTC,1:256
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00000010
;CUANDO LA CUENTA LLEGA AL
MAX GENERA UNA INTERRUPCION
STS
TIMSK1,TEMPO
SEI
LAZO:
OUT PORTA,SALIDA
RJMP LAZO
UNSEG:
PUSH R16
IN
R16,SREG
PUSH R16
CPI
VECES,12
BRCS LED_AMARILLO
CPI
VECES,59
BRCS LED_VERDE
LED_ROJO:
LDI
SALIDA,0B00000100
RJMP SALIR
LED_VERDE:
LDI
SALIDA,0B00000010
RJMP SALIR

LED_AMARILLO:
LDI
SALIDA,0B00000001
RJMP SALIR
SALIR:
CLR VECES
POP R16
OUT SREG,R16
POP R16
RETI
CONTEO:
PUSH R16
IN
R16,SREG
PUSH R16
INC
VECES
POP R16
OUT SREG,R16
POP R16
RETI

EJEMPLO
/*
* Sensor_Motor_Bujia.asm
.DEF
.DEF
.DEF
.DEF

TEMPO=R20
VECES=R17
FRECH=R18
FRECL=R19

.ORG 0X00
RJMP INICIO
.ORG 0X1A
;TIMER1 COMPARADOR A
RJMP UNSEG
.ORG 0X24
;TIMER0 OVERFLOW
RJMP DESBORDE
INICIO:
LDI
OUT

TEMPO,0B00000000
DDRB,TEMPO
;ENTRADA

LDI
OUT
LDI
OUT
LDI
OUT
LDI
OUT

TEMPO,0B11111111
DDRA,TEMPO
TEMPO,0B11111111
DDRC,TEMPO
TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

;CONFIGURA TIMER0
LDI

TEMPO,0B00000000
;MANDO 0L NO UTILIZO COMPACOMPB, MODO NORMAL( SE DESBORDA Y
CONTINUA)
OUT TCCR0A,TEMPO
LDI
TEMPO,0B00000110
;0 NO
FORZAR SALIDAS, NORMAL,UTILIZO
CONTADOR (CUENTA FLANCOS
NEGATIVOS)
OUT TCCR0B,TEMPO
CLR TEMPO
CLR VECES
OUT TCNT0,TEMPO
LDI
TEMPO,0B00000001
;UTLIZAR EL BIT DE OVERFLOW
STS
TIMSK0,TEMPO;CONFIGURO
TIMER1
LDI
TEMPO,0B00000000
;MODO CTC ,NO UTILIZO
COMPA,COMPB
STS
TCCR1A,TEMPO
LDI
TEMPO,HIGH(31249)
STS
OCR1AH,TEMPO
LDI
TEMPO,LOW(31249)
STS
OCR1AL,TEMPO
LDI
TEMPO,0B00001100
;0
ELIMINO RUIDO,0 MODO DE
CAPTURA,MODO CTC,1:256
STS
TCCR1B,TEMPO
LDI
TEMPO,0B00000010
;CUANDO LA CUENTA LLEGA AL
MAX GENERA UNA INTERRUPCION
STS
TIMSK1,TEMPO
SEI
LAZO:
RJMP LAZO
DESBORDE:
PUSH R16
IN
R16,SREG
PUSH R16
INC
VECES
POP R16
OUT SREG,R16
POP R16

RETI
UNSEG:
PUSH R16
IN
R16,SREG
PUSH R16
MOV FRECH,VECES
IN
FRECL,TCNT0
OUT PORTC,FRECL
CPI
FRECL,12
BRLO LED_AMARILLO
CPI
FRECL,59
OUT PORTA,FRECL
BRLO LED_VERDE
LED_ROJO:
LDI
TEMPO,0B00000100
OUT PORTA,TEMPO
RJMP SALIDA
LED_VERDE:
LDI
TEMPO,0B00000010
OUT PORTA,TEMPO
RJMP SALIDA
LED_AMARILLO:
LDI
TEMPO,0B00000001
OUT PORTA,TEMPO
RJMP SALIDA
SALIDA:
CLR VECES
POP R16
OUT SREG,R16
POP R16
RETI

EJEMPLO

/*
* Ventanillas_de_banco.asm
.DEF TEMPO=R16
.DEF TECLA=R17
.DEF ANTE=R19
.DEF CONTA=R20
.ORG
RJMP
.ORG
RJMP

0X00
INICIO
0X30
INGUALDAD

INICIO :
LDI
OUT
LDI
OUT
LDI
OUT

TEMPO,0B00001111
DDRA,TEMPO
TEMPO,0B11111111
PORTA,TEMPO
TEMPO,0B11111111
DDRC,TEMPO

OUT

DDRD,TEMPO

LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
LDI
TECLA,16
LDI
ANTE,16
;CONFIGURO TIMER 0
OUT
PORTC,TECLA
LDI
TEMPO,124
OUT
OCR0A,TEMPO
LDI
TEMPO,0B00000010
OUT
TCCR0A,TEMPO
LDI
TEMPO,0B00000100
OUT
TCCR0B,TEMPO
LDI
TEMPO,0B00000010
STS
TIMSK0,TEMPO
LDI
CONTA,125
SEI
LAZO:
BARRIDO:
;HABILITO FILA 1
LDI
TEMPO,0B11111110
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,0
SBIS PINA,5
LDI
TECLA,1
SBIS PINA,6
LDI
TECLA,2
SBIS PINA,7
LDI
TECLA,3
;HABILITO FILA 2
LDI
TEMPO,0B11111101
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,4
SBIS PINA,5
LDI
TECLA,5
SBIS PINA,6
LDI
TECLA,6
SBIS PINA,7
LDI
TECLA,7
;HABILITO FILA 3
LDI
TEMPO,0B11111011
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,8
SBIS PINA,5
LDI
TECLA,9
SBIS PINA,6
LDI
TECLA,10
SBIS PINA,7
LDI
TECLA,11

;HABILITO FILA 4
LDI
TEMPO,0B11110111
OUT
PORTA,TEMPO
SBIS PINA,4
LDI
TECLA,12
SBIS PINA,5
LDI
TECLA,13
SBIS PINA,6
LDI
TECLA,14
SBIS PINA,7
LDI
TECLA,15
CP
TECLA,ANTE
BREQ BARRIDO
MOV
ANTE,TECLA
CPI
TECLA,16
BREQ BARRIDO
RJMP LAZO
INGUALDAD:
PUSH R16
IN
PUSH R16
DEC
BRNE SALIR
CLR
OUT
OUT
LDI
SALIR:
POP
OUT
POP
RETI

R16,SREG
CONTA
TEMPO
PORTC,TEMPO
PORTB,TEMPO
CONTA,125
R16
SREG,R16
R16

EJEMPLO

.include "m164pdef.inc"
.def
.def
.def
.def
.def
.def

tempo=r16
aux=r17
banda=r18
bajo=r19
alto=r20
fin=r21

.cseg
.org 0x00
jmp inicio
.org 0x2
jmp paso1
.org 0x4
jmp paso2
.org 0x30

jmp finad

rjmp espera

inicio:

out porta,alto
out portb,bajo

ldi tempo,0b11111111
out ddrb,tempo
ldi tempo,0
out portb,tempo

ldi tempo,1
add banda,tempo
out portc,banda
rjmp despliegue

ldi tempo,0b00000011
out ddrd,tempo
ldi tempo,0
out portd,tempo

paso1:
ldi banda,0
reti

ldi tempo,0
out ddra,tempo
ldi tempo,1
out ddrc,tempo
ldi tempo,0
out portc,tempo
ldi tempo,0b00000011
sts didr0,tempo
ldi tempo,0b00001111
sts eicra,tempo
ldi tempo,0b00000011
out eimsk,tempo
sei
clr peso
despliegue:
sbrc banda,0
ldi aux,1
ldi aux,0
ldi tempo,0b01100000
add tempo,aux
sts admux,tempo
ldi tempo,0b1101110
sts adcsra,tempo
espera:
sbrs fin,0

paso2:
ldi banda,1
reti
finad:
lds bajo,adcl
lds alto,adch
ldi fin,1
reti
EJEMPLO
/*
* Conversion_de_4_canales.asm
*
* Created: 26/10/2013 21:07:02
* Author: vivia_000
*/
.DEF
.DEF

TEMPO=R16
AUX=R17

.CSEG
.ORG 0X00
;CONFIGURO PUERTOS
LDI
OUT
LDI
OUT
LDI
OUT

TEMPO,0B00000000
DDRA,TEMPO
TEMPO,0B11111111
DDRB,TEMPO
TEMPO,0B00000011
DDRC,TEMPO

;CONFIGURO STACK POINTER


LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

;CONDIGURO A/D
LDI
STS

TEMPO,0B01000000
ADMUX,TEMPO

CANAL0:
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO

EJEMPLO
/*
* DEBER_AD_BALANZA.asm
*
* Created: 26/10/2013 17:32:50
* Author: Compaq
*/
.include "m164pdef.inc"
.def tempo=r16
.DEF AUX=R17
.DEF canal1=R18
.DEF canal11=R19
.DEF canal2=R25
.DEF canal22=R20
.DEF canAl3=R21
.DEF canal33=R22
.DEF canal4=R23
.DEF canal44=R24
.def cont=r21
.def cont2=r22
.dseg
PESO: .BYTE 2
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
LDI TEMPO,0B00000000
OUT DDRA,TEMPO
out porta,tempo
SER TEMPO ;DEFINO PUERTOS DE SALIDA
OUT DDRD,TEMPO
LDI TEMPO,0B00001111
OUT DDRB,TEMPO
;config puertos
;CONVERSOR AC DC
INICIO:
PESO1:
LDI
TEMPO,0B01000000
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA1:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA1
LDS CANAL1,ADCL
LDS CANAL11,ADCH
CALL BORRAR
PESO2:
LDI
TEMPO,0B01000001
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA2:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA2
LDS CANAL2,ADCL
LDS CANAL22,ADCH
CALL BORRAR
PESO3:
LDI
TEMPO,0B01000010
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA3:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA3
LDS CANAL3,ADCL
LDS CANAL33,ADCH
CALL BORRAR

PESO4:
LDI
TEMPO,0B01000011
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA4:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA4
LDS CANAL4,ADCL
LDS CANAL44,ADCH
CALL BORRAR
SUMA:
ADD CANAL1,CANAL2
ADC CANAL11,CANAL22
ADD CANAL1,CANAL3
ADC CANAL11,CANAL33
ADD CANAL1,CANAL4
ADC CANAL11,CANAL44
CLC
ROR CANAL11
ROR CANAL1
CLC
ROR CANAL11
ROR CANAL1
sts peso,CANAL1
sts peso+1,CANAL11
call bin_bcd
call bcd_7seg
call barrido
RJMP INICIO
BORRAR:
LDI
TEMPO,0B00000000
STS
ADMUX,TEMPO
STS
ADCSRA,TEMPO
STS
ADCL,TEMPO
STS
ADCH,TEMPO
RET
BIN_BCD:
PUSH R16
PUSH R17
PUSH R18
CLR R17
LDS R16,PESO ;TOMO LOS
PRIMEROS 8 BITS DEL DATO BINARIO A
CONVERTIR LSB
LDS R17,PESO+1 ;TOMO LOS
SIGUIENTES 8 BITS MSB (TOTAL 16 BITS)
CLR R18
MILES:
SUBI R16,LOW(1000)
SBCI R17,HIGH(1000)
BRCS CENTENAS

INC R18
RJMP MILES
CENTENAS:
STS BCD3,R18
CLR R18
SUBI R16,LOW(-1000)
SBCI R17,HIGH(-1000)
CENTENAS1:
;AHORA SE
RESTA 100
SUBI R16,LOW(100)
SBCI R17,HIGH(100)
BRCS DECENAS
INC R18
RJMP CENTENAS1
DECENAS:
STS BCD2,R18
CLR R18
SUBI R16,LOW(-100)
SBCI R17,HIGH(-100)
DECENAS1:
SUBI R16,LOW(10)
SBCI R17,HIGH(10)
BRCS UNIDADES
INC R18
RJMP DECENAS1
UNIDADES:
STS BCD1,R18
SUBI R16,LOW(-10)
SBCI R17,HIGH(-10)
STS BCD0,R16
POP R18
POP R17
POP R16
;AHORA TRANSFORMO A 7
SEGMENTOS
RET
BCD_7SEG:

PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH

R16
R17
ZH
ZL
YH
YL
XH
XL

LDI
LDI
LDI
LDI
LDI

YH,HIGH(BCD0)
YL,LOW(BCD0)
XH,HIGH(DIG0)
XL,LOW(DIG0)
R17,4

BCD7SEG1:
LDI
ZH,HIGH(TABLABCD7SEG<<1)
LDI
ZL,LOW(TABLABCD7SEG<<1)

LD
ADD
CLR
ADC
LPM
ST
DEC
BRNE
POP
POP
POP
POP
POP
POP
POP
POP
RET
BARRIDO:

R16,Y+
ZL,R16
R16
ZH,R16
R16,Z
X+,R16
R17
BCD7SEG1
XL
XH
YL
YH
ZL
ZH
R17
R16

PUSH R16
LDS
R16,DIG0
OUT
PORTD,R16
LDI
R16,0B11111110
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
LDS
R16,DIG1
OUT
PORTD,R16
LDI
R16,0B11111101
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
LDS
R16,DIG2
OUT
PORTD,R16
LDI
R16,0B11111011
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16

RETARDO:

LDS
R16,DIG3
OUT
PORTD,R16
LDI
R16,0B11110111
OUT
PORTB,R16
CALL RETARDO
SER
R16
OUT
PORTB,R16
POP
R16
RET

PUSH R16
LDI
R16,0B11111111
RETARDO1:
DEC

R16

BRNE RETARDO1
POP
R16
RET
TABLABCD7SEG:
.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

EJEMPLO
/*
* Medidor_de_frecuencia.asm
*
* Created: 12/11/2013 11:53:49
* Author: Rodrigo Crespo
*/
.def tempo=r16
.def aux1=r17
.def aux2=r18
.org 0x00
rjmp Inicio
.org 0x18
rjmp Capturar
Inicio:
ldi tempo, 0
out ddrD, tempo
ldi tempo, 255
out ddrA, tempo
out ddrC, tempo
;Configuracion TIMER1
ldi tempo, 0
sts TCCR1A, tempo
ldi tempo, 0b01000011
sts TCCR1B, tempo
ldi tempo, 0
sts TCCR1C, tempo
ldi tempo, 0b00100000
sts TIMSK1, tempo
;Stack pointer
ldi tempo, high(ramend)
out sph, tempo
ldi tempo, low(ramend)
out spl, tempo
sei
Main:

out portA, aux1


out portC, aux2
rjmp Main
Capturar:
lds aux1, ICR1L
lds aux2, ICR1H
ldi tempo, 0
sts TCNT1H, tempo
sts TCNT1L, tempo
reti

EJEMPLO
/*
* ECIO_2.asm
*
* Created: 11/17/2013 4:37:25 PM
* Author: Juan Fernando
*/
.include
"m164pdef.inc"
.def
tempo=R16
.def
fijol=R17
.def
fijoh=R18
.def
OCH=R19
.def
OCL=R20
.def
conta=R21
.def
leds=R22
;
XD :D
.cseg
.org
rjmp
.org
rjmp
.org
rjmp
.org
rjmp

0x00
inicio
0x02
subir
0x04
bajar
0x06
prender_apagar

inicio:
clr
clr
clr
clr
ser
out
clr
out
com
out
ldi

OCH
OCL
conta
leds
tempo
ddra,tempo
tempo
ddrb,tempo
tempo
portb,tempo
tempo,0b00000011

out
ldi
out

ddrc,tempo
;

tempo,0b00100000
ddrd,tempo
;salida PD5 Fast PWM
ldi
tempo,0b11011111
out
portd,tempo
;aseguro pull up
in
andi
out

tempo,MCUCR
tempo,0b11101111
MCUCR,tempo

;inicio stack pointer


ldi
tempo,high(ramend)
out
sph,tempo
ldi
tempo,low(ramend)
out
spl,tempo
;configuro interrupciones externas
ldi
sts
ldi
out
out

tempo,0b00101010
EICRA,tempo
tempo,0b00000111
EIMSK,tempo
EIFR,tempo

SEI
;configuro TIMER1
ldi
sts
ldi
sts
clr
sts
ldi

tempo,0b00000010 ;11
TCCR1A,tempo
tempo,0b00011101
TCCR1B,tempo
tempo
TCCR1C,tempo
tempo,0
; Inicio en 0 XD
OCR1AH,tempo
tempo,0
OCR1AL,tempo

sts
ldi
sts

; escribir high luego low


ldi
tempo,high(6484)
sts
ICR1H,tempo
ldi
tempo,low(6484)
sts
ICR1L,tempo
ldi
fijol,low(648)
ldi
fijoh,high(648)
ldi
tempo,0
out
porta,tempo
out
portc,tempo
SEI
LAZO:
cpi
breq

cero

leds,0

cpi
breq uno
cpi
breq dos
cpi
breq tres
cpi
breq cuatro
cpi
breq cinco
cpi
breq seis
cpi
breq siete
cpi
breq ocho
cpi
breq nueve
cpi
breq diez
cero:
ldi
out
out
rjmp lazo
uno:
ldi
out
rjmp lazo
dos:
ldi
out
rjmp lazo
tres:
ldi
out
rjmp lazo
cuatro:
ldi
out
rjmp lazo
cinco:
ldi
out
rjmp lazo
seis:
ldi
out
rjmp lazo
siete:
ldi
out
rjmp lazo
ocho:
ldi
out
ldi
out

leds,1
leds,2
leds,3
leds,4
leds,5
leds,6
leds,7
leds,8
leds,9
leds,10
tempo,0
porta,tempo
portc,tempo
tempo,0b00000001
porta,tempo
tempo,0b00000010
porta,tempo
tempo,0b00000100
porta,tempo
tempo,0b00001000
porta,tempo
tempo,0b00010000
porta,tempo
tempo,0b00100000
porta,tempo
tempo,0b01000000
porta,tempo
tempo,0b10000000
porta,tempo
tempo,0
portc,tempo

rjmp lazo
nueve:
ldi
out
ldi
out
rjmp lazo
diez:
ldi
out
ldi
out
RJMP LAZO

tempo,0
porta,tempo
tempo,0b00000001
portc,tempo
tempo,0
porta,tempo
tempo,0b00000010
portc,tempo

subir:
push
in
push
inc
add
adc
sts
sts
pop
out
pop

tempo,0b10000010
TCCR1A,tempo
conti_PA
r16
sreg,r16
r16

reti

r16
r16,SREG
r16
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16

bajar:
r16
r16,SREG
r16
tempo,OCR1AL
tempo,0
conti_bajar
leds
OCL,fijol
OCH,fijoh
OCR1AH,OCH
OCR1AL,OCL
r16
sreg,r16
r16

reti
prender_apagar:
push
r16
in
push
r16
inc
cpi
breq

conta
tempo,0b00000010 ;11
TCCR1A,tempo
conti_PA

EJEMPLO

reti

push
in
push
lds
cpi
breq
dec
sub
sbc
sts
sts
conti_bajar:
pop
out
pop

apagar:
clr
ldi
sts
rjmp
encender:
ldi
sts
rjmp
conti_PA:
pop
out
pop

r16,SREG

conta
conta,1
encender

/*
* Relacion_de_Trabajo_Variable.asm
*
* Created: 17/11/2013 12:05:55
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF

TEMPO=R17
THIGH=R18
TLOW=R19
AUX=R20

.ORG
RJMP
.ORG
RJMP
.ORG
RJMP
.ORG
RJMP

0X00
INICIO
0X02
AUMENTA
0X04
DISMINUYE
0X06
ONOFF

INICIO:
LDI
OUT
LDI
OUT

TEMPO,0B00000000
DDRB,TEMPO
TEMPO,0B00110000
DDRD,TEMPO

;CONFIGURO STACK POINTER


LDI
TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI
TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
;CONFIGURO INTERRUPCIONES
LDI
TEMPO,0B00101010
STS
LDI

EICRA,TEMPO
TEMPO,0B00000111

OUT

EIMSK,TEMPO

OUT

EIFR,TEMPO

;CONFIGURO TIMER1
LDI
TEMPO,0B11000010
STS
TCCR1A,TEMPO
LDI
TEMPO,0B00011000
STS
TCCR1B,TEMPO
CLR TEMPO
STS
TCNT1H,TEMPO
STS
TCNT1L,TEMPO
LDI
TEMPO,HIGH(64843)
STS
ICR1H,TEMPO
LDI
TEMPO,LOW(64843)
STS
ICR1L,TEMPO
LDI
THIGH,HIGH(32421)
STS
OCR1AH,THIGH
LDI
TLOW,LOW(32421)
STS
OCR1AL,TLOW
SEI
MAIN:
RJMP MAIN
ONOFF:
PUSH R16
IN
R16,SREG
PUSH R16
COM AUX
CPI
AUX,255
BREQ ACTIVAR
LDI
TEMPO,0B00011000
STS
TCCR1B,TEMPO
RJMP SALIR
ACTIVAR:
LDI
TEMPO,0B00011101
STS
TCCR1B,TEMPO
SALIR:
POP R16
OUT SREG,R16
POP R16
RETI
AUMENTA:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
TEMPO,LOW(3242)
ADD TLOW,TEMPO
LDI
TEMPO,HIGH(3242)
ADC THIGH,TEMPO
STS
OCR1AH,THIGH
STS
OCR1AL,TLOW
RJMP SALIR

DISMINUYE:
PUSH R16
IN
R16,SREG
PUSH R16
LDI
TEMPO,LOW(3242)
SUB TLOW,TEMPO
LDI
TEMPO,HIGH(3242)
SBC THIGH,TEMPO
STS
OCR1AH,THIGH
STS
OCR1AL,TLOW
RJMP SALIR

EJEMPLO
/*
* TIMER0_1SEG.asm
*
* Created: 11/17/2013 9:43:50 AM
* Author: Juan Fernando
*/
.include
"m164pdef.inc"
.def
tempo=r16
.def
conta=r17
.org
0x00
rjmp
inicio
.org
0x20
rjmp
um35
inicio:
ldi
out
ldi
out
ldi
out

tempo,0b00001000
ddrb,tempo
tempo,high(ramend)
sph,tempo
tempo,low(ramend)
spl,tempo

;configuracion de TIMER0
ldi
tempo,0b00000010
out
ldi
out
ldi
sts
ldi
out
ldi
SEI
lazo:
rjmp

TCCR0A,tempo
tempo,0b00000100
TCCR0B,tempo
tempo,0b00000010
TIMSK0,tempo
tempo,124
OCR0A,tempo
conta,125

lazo

um35:
push
in
push
dec
brne
ldi
in
com
out
rjmp
salir:
pop
out
pop
RETI

r16
r16
salir

salir

r16,SREG
conta
conta,125
r16,pinb
r16
portb,r16

EJEMPLO
r16
SREG,r16
r16

/*
* ECIO_1.asm
*
* Realizar un circuito que determine si la
frecuencia de la red es de 50 Hz o de 60
Hz, y si el semiciclo positivo
* dura los mismo que el negativo. Se
tiene un circuito que por la misma linea
da un pulso cuando el voltaje cruza de
subida y otro pulso
* cuando cruza de bajada. Debe
encender un LED si es de 50 Hz, y otro si
es de 60 Hz, y uno adicional si el
semiciclo positivo no dura lo
* mismo que el negativo. Usar
necesariamente Interrupciones y Timer.
Dibujar el circuito y escribir el programa
con comentarios.
* Author: Juan Fernando
*/
.include "m164pdef.inc"
.def
tempo=R16
.def
conta=R17
.def
frec=r18
.def
t1H=R19
.def
t1L=R20
.def
t2H=R21
.def
t2L=R22
.def
t3H=R23
.def
t3L=R24
; Timer0 para generar 1 seg
.org
0x00
rjmp
inicio
.org
0x18
rjmp
captura
.org
0x20
rjmp
un_seg
Inicio:
ldi
out

tempo,0b11100000
; Leds de salida
ddra,tempo

clr
tempo
out
ddrd,tempo
out
ddrb,tempo
out
ddrc,tempo
; Inicializo el Stack Pointer
ldi
tempo,high(ramend)
out
sph,tempo
ldi
tempo,low(ramend)
out
spl,tempo
clr
frec
; Configuracion del timer 0
; Objetivo generar 1 segundo
ldi
tempo,0b00000010
; Modo normal, CTC
out
TCCR0A,tempo
ldi
tempo,0b00000100
; No forzar salidas, CTC,
prescalador 256
out
TCCR0B,tempo
ldi
tempo,124
sts
OCR0A,tempo
ldi
tempo,0b00000010
; Interrupcion comparador
de A
sts
timsk0,tempo
ldi
conta,125
;Configuracion del TIMER1
ldi
tempo,0b00000000
sts
TCCR1A,tempo
ldi
tempo,0b11000010
sts
TCCR1B,tempo
ldi
tempo,0
sts
TCCR1C,tempo
ldi
tempo,0b00100000
sts
TIMSK1,tempo
SEI
main:
rjmp
main
; LOL :)
un_seg:
push
in
push
dec
brne
ldi
cpi
breq
cpi
breq
cpi
breq
cpi
breq

R16
R16
salir

R16,SREG
conta
conta,125
frec,60

frec60
frec60
frec50
frec50

frec,119
frec,50
frec,99

LDI
out
rjmp

RETI

salir

tempo,0
porta,tempo

frec60:
ldi
out
clr
rjmp salir

tempo,0b10000000
porta,tempo
frec

frec50:
ldi
out
clr
rjmp salir

tempo,0b01000000
porta,tempo
frec

salir:
pop
out
pop

captura:
push
in
push
inc
cpi
brcc
cpi
breq
cpi
breq
cpi
breq

R16
SREG,R16
R16

R16

R16,SREG

R16

frec
frec,3
continuar
frec,1
tiempo1
frec,2
tiempo2
frec,3
tiempo3

tiempo1:
lds
tempo,IL
mov
t1L,tempo
lds
tempo,TCNT1H
mov
t1H,tempo
rjmp continuar
tiempo2:
lds
tempo,TCNT1L
mov
t2L,tempo
lds
tempo,TCNT1H
mov
t2H,tempo
rjmp continuar
tiempo3:
lds
tempo,TCNT1L
mov
t3L,tempo
lds
tempo,TCNT1H
mov
t3H,tempo
rjmp continuar
continuar:

pop
out
pop
RETI

r16
SREG,r16
r16

EJEMPLO
Matriz led de munecos
.include"m164pdef.inc"
.def tempo=r19
.def a=r17
.def b=r18
.def as=r16
ser tempo
out ddra,tempo
out ddrc,tempo
;;activo STACK
ldi tempo,high(ramend) ;ACTIVANDO EL STACK
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
barrido:
ldi tempo,0b11111110
out portA,tempo
ldi tempo,0b00100100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11111101
out portA,tempo
ldi tempo,0b00010100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11111011
out portA,tempo
ldi tempo,0b00001000
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11110111
out portA,tempo
ldi tempo,0b00111100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11101111
out portA,tempo
ldi tempo,0b00001010
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11011111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo

ldi tempo,0b10111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b01111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
call retardote
barrido2:
ldi tempo,0b11111110
out portA,tempo
ldi tempo,0b01001000
out portC,tempo
ser tempo
call retardo
out porta,tempo
;;;
ldi tempo,0b11111101
out portA,tempo
ldi tempo,0b00101000
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11111011
out portA,tempo
ldi tempo,0b00001000
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11110111
out portA,tempo
ldi tempo,0b00111100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11101111
out portA,tempo
ldi tempo,0b00001010
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b11011111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b10111111
out portA,tempo
ldi tempo,0b00011100
out portC,tempo
ser tempo
call retardo
out porta,tempo
ldi tempo,0b01111111
out portA,tempo
ldi tempo,0b00011100

out portC,tempo
ser tempo
call retardo
out porta,tempo
;;
call retardote
rjmp barrido
retardo:
push r16
ldi r16,255
retardo_1:
nop
dec r16
brne retardo_1
pop r16
ret
retardote:
Lazo0: ldi r16,10;(44)
Lazo1: ldi r17,20 ;(212)
Lazo2: ldi r18,133 ;(133)
retardo1:
dec r18
brne retardo1
dec r17
brne lazo2
dec r16
brne lazo1
ret

EJEMPLO
.include "m164pdef.inc"
.def tempo=r16
.def data=r17
.def cont=r18
.def con=r21
.dseg
num: .byte 1
mayor: .byte 1
menor: .byte 1
vector: .byte 1
N: .byte 1
veces: .byte 1
.cseg
.org 0x00
;configurar entrada
ldi tempo,0b11110000
out ddra,tempo
ldi tempo,0b11111111
out ddrb,tempo
inicio:
in data,pina
sts num,data
clr cont
;Inicio del programa
;PARA <> entre los numeros del vector
ldi xh,high(vector)
ldi xl,low(vector)
ldi zh,high(tabla<<1)
ldi zl,low(tabla<<1)
lpm tempo,z+
sts N,tempo
mov con,tempo
clr tempo
lazo:
mov r19,tempo
lpm tempo,z+
st -x,tempo
cp tempo,r19
brcs menor1
brne mayor1
cp tempo,data
breq incremento
lazo1:
dec con
brne lazo
lds cont,veces
out portb,cont
clr cont
rjmp inicio
menor1:
ldi yh,high(menor)

ldi yl,low(menor)
st y,tempo
cp tempo,data
breq incremento
rjmp lazo1
mayor1:
ldi yh,high(mayor)
ldi yl,low(mayor)
st y,tempo
cp tempo,data
breq incremento
rjmp lazo1
incremento:
inc cont
sts veces,cont
rjmp lazo1
tabla:
.db 5,1,2,3,4,5

EJEMPLO
Clasificadora_de_huevos.asm
.DEF TEMPO=R16
.DEF PEQUENOS=R17
.DEF MEDIANOS=R18
.DEF GRANDES=R19
.DEF CUBETA1=R20
.DEF CUBETA2=R21
.DEF CUBETA3=R22
.DSEG
PEQUENOS1:
.BYTE 1
PEQUENOS2:
.BYTE 1
MEDIANOS1:
.BYTE 1
MEDIANOS2:
.BYTE 1
GRANDES1: .BYTE 1
GRANDES2: .BYTE 1
.CSEG
.ORG 0X00
RJMP INICIO
.ORG 0X02
RJMP HUEVOS_PEQUENOS
.ORG 0X04
RJMP HUEVOS_MEDIANOS
.ORG 0X06
RJMP HUEVOS_GRANDES
INICIO:
LDI TEMPO,0B11111111
OUT DDRA,TEMPO
OUT DDRC,TEMPO
OUT PORTB,TEMPO
OUT PORTD,TEMPO
LDI TEMPO,0B00000000
OUT DDRB,TEMPO
OUT DDRD,TEMPO
IN
TEMPO,MCUCR
ANDI TEMPO, 0B1110111
OUT MCUCR,TEMPO
LDI TEMPO,HIGH(RAMEND)
OUT SPH,TEMPO
LDI TEMPO,LOW(RAMEND)
OUT SPL,TEMPO
LDI TEMPO,0B00101010
STS EICRA,TEMPO
LDI TEMPO,0B00000111
OUT EIMSK,TEMPO
OUT EIFR,TEMPO

SEI
LAZO:
OUT PORTA,R24
OUT PORTC,R26
RJMP LAZO
HUEVOS_PEQUENOS:
PUSH R16
IN
R16,SREG
PUSH R16
INC PEQUENOS
CPI PEQUENOS,12
BREQ CUBETA_PEQUENOS
POP R16
OUT SREG,R16
POP R16
RETI
CUBETA_PEQUENOS:
CLR PEQUENOS
ADIW R25:R24,1
STS PEQUENOS1,R24
STS PEQUENOS2,R25
POP R16
OUT SREG,R16
POP R16
RETI

HUEVOS_MEDIANOS:
PUSH R16
IN
R16,SREG
PUSH R16
INC MEDIANOS
CPI MEDIANOS,12
BREQ CUBETA_MEDIANOS
POP R16
OUT SREG,R16
POP R16
RETI
CUBETA_MEDIANOS:
CLR MEDIANOS
ADIW R27:R26,1
STS MEDIANOS1,R26
STS MEDIANOS2,R27
POP R16
OUT SREG,R16
POP R16
RETI

HUEVOS_GRANDES:
PUSH R16
IN
R16,SREG
PUSH R16
INC GRANDES
CPI GRANDES,12
BREQ CUBETA_GRANDES
POP R16
OUT SREG,R16
POP R16
RETI
CUBETA_GRANDES:
CLR GRANDES
ADIW R29:R28,1
STS GRANDES1,R28
STS GRANDES2,R29
POP R16
OUT SREG,R16
POP R16
RETI

EJEMPLO
voltimetro7 led
.include "m164pdef.inc"
.def tempo=r16
.def resh=r17
.def resl=r18
.def tempo1=r19
.def tempo2=r20
.def cont=r21
.def ls=r23

.def ms=r24
.dseg
mil: .byte 1
cien: .byte 1
decen:
.byte 1
unid: .byte 1
digmil:
.byte 1
digcien:.byte 1
digdec:
.byte 1
diguni: .byte 1
.cseg
ldi tempo,0b11111111
out ddra, tempo
out ddrc,tempo
ldi tempo,0b11111111
out ddrb,tempo
out ddrd,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,0b00000001
sts didr0,tempo
ldi tempo,0b01100000
sts admux,tempo
espera1:
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera1
otro:
ldi tempo,0b11000110
sts adcsra,tempo
espera2:
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera2
lds resl,adcl
lds resh,adch
ldi tempo1,20
mul resh,tempo1
call bin_bcd_mul
call bcd_dig_mult
call barrido_mult
lds tempo,digdec
out portc,tempo
rjmp otro
bin_bcd_mul:

mov ls,r0
mov ms,r1
clr tempo
cont_miles:
subi ls,low(1000)
sbci ms,high(1000)
brcs cont_mil1
inc tempo
rjmp cont_miles
cont_mil1:
sts mil,tempo
clr tempo
subi ls,low(-1000)
sbci ms,high(-1000)
cont_cien:
subi ls,low(100)
sbci ms,high(100)
brcs cont_cien1
inc tempo
rjmp cont_cien
cont_cien1:
sts cien,tempo
clr tempo
subi ls,low(-100)
sbci ms,high(-100)
cont_dec:
subi ls,low(10)
sbci ms,high(10)
brcs con_dec1
inc tempo
rjmp cont_dec
con_dec1:
sts decen,tempo
clr tempo
subi ls,low(-10)
mov tempo,ls
sts unid,tempo
clr tempo
ret
bcd_dig_mult:
push zh
push zl
push xh
push xl
push yh
push yl
push tempo

push cont
ldi xl,low(mil)
ldi xh,high(mil)
ldi yl,low(digmil)
ldi yh,high(digmil)
ldi cont,4
bcd_dig_mult0:
ldi zl,low(tabla<<1)
ldi zh,high(tabla<<1)
ld tempo,x+
add zl,tempo
clr tempo
adc zh,tempo
lpm tempo,z
st y+,tempo
dec cont
brne bcd_dig_mult0
pop cont
pop tempo
pop yl
pop yh
pop xl
pop xh
pop zl
pop zh
ret
barrido_mult:
lds tempo,diguni
out portb,tempo
ldi tempo,0b11111110
out portd,tempo
call retardo
ldi tempo,0b11111111
out portd,tempo
lds tempo,digdec
out portb,tempo
ldi tempo,0b11111101
out portd,tempo
call retardo
ldi tempo,0b11111111
out portd,tempo
lds tempo,digcien
out portb,tempo
ldi tempo,0b11111011
out portd,tempo
call retardo
ldi tempo,0b11111111

out portd,tempo
lds tempo,digmil
ori tempo,0b10000000
out portb,tempo
ldi tempo,0b11110111
out portd,tempo
call retardo
ldi tempo,0b11111111
out portd,tempo
ret
retardo:
ldi tempo,255
lazo_retardo:dec tempo
breq salir_retardo
rjmp lazo_retardo
salir_retardo:ret
tabla:
.db 0b00111111,0b00000110
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111

;0,1
;2,3
;4,5
;6,7
;8,9

EJEMPLO
SIRENA PRSIONO PRENDO APAGO
.include "m164pdef.inc"
.def tempo=r16
.def aux=r17
.org 0x0
rjmp inicio
.org 0x2
rjmp boton
inicio:
ldi tempo,0b00000000
out ddrd,tempo
out ddrb,tempo
ldi tempo,0b11111111
out ddra,tempo
ldi tempo,0b11111111
out ddrc,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,0b00000010
sts eicra,tempo

ldi tempo,0b00000001
out eimsk,tempo
sei
clr aux
lazo:
out portc,aux
rjmp lazo
boton:
cpi aux,1
brne salir1
ldi tempo,0b00000000
out porta,tempo
rjmp salir
salir1:
inc aux
ldi tempo,0b00000001
out porta,tempo
salir:
pop r16
out sreg,r16
pop r16
reti

EJEMPLO
SEMAFORO
.include "m164pdef.inc"
.def tempo=r16
.def conta=r17
.def estado1=r19
.def estado2=r20
.def aux=r21
.org 0x0
rjmp inicio
.org 0x1a
rjmp segundo
inicio:
;CONFIGURACION DE PUERTOS
ldi tempo,0b11111111
out ddra,tempo
out ddrd,tempo
out ddrc,tempo
out ddrb,tempo
;ACTIVACION DEL STACK
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
;CONFIGURACION DE PUERTO B
COMO SALIDAS DE LOS PARLANTES
;UTILIZACION DE TIMER0
;modo desconectado al principio ctc
ldi tempo,0b00000010

out tccr0a,tempo
;modo ctc preescalador de 8 a 1
ldi tempo,0b00000010
out tccr0b,tempo
;relacion del ocr0a y ocr0b para
obtener frecuencia de 2KHz
ldi tempo,249
out ocr0a,tempo
out ocr0b,tempo
;UTILIZACION DEL TIMER1
;MODO TOGGLE Y CTC PARA
INTERRUPCION DE 1SEG
ldi tempo,0b01000000
sts tccr1a,tempo
;VALOR DEL 0CR1A QUE PRODUCE
EL RETARDO DE 1SEGUNDO
ldi tempo,low(65000)
sts ocr1al,tempo
ldi tempo,high(65000)
sts ocr1ah,tempo
;MODO CTC Y PREESCALADOR DE
RELACION 1:256
ldi tempo,0b00001101
sts tccr1b,tempo
;ACTIVASION DE INTERRUPCION EN
EL TIMER1
ldi tempo,0b00000010
sts timsk1,tempo
clr conta
clr zl
clr zh
;HABILITACION GLOBAL DE
INTERRUPCIONES
sei
lazo:
out portc,conta
;MOSTRAR ESTADO DE SEMAFORO1
out portd,estado2
;MOSTRAR ESTADO DE SEMAFORO2
out porta,estado1
rjmp lazo
segundo:
push r16
in r16,sreg
push r16

;APUNTO A LA TABLA DE
OPERACION DE FUNCIONAMIENTO
DEL PRIMER SEMAFORO
ldi zl,low(tabla_semaforo1<<1)
ldi zh,high(tabla_semaforo1<<1)
inc conta
mov aux,conta
;VERIFICO SI TRANSCURRERON LOS
60SEG DEL CICLO SI ES AS VUELVO
A APUNTAR AL INICIO
;Y SE REPITE EL CICLO
cpi conta,60
brne seguir
clr conta
mov aux,conta
;SI NO HE CULMINADO CON EL
CICLO SIGO AUMENTANDO
seguir:
add zl,aux
clr aux
adc zh,aux
lpm estado2,z
;APUNTO A LA TABLA DE
OPERACION DE FUNCIONAMIENTO
DEL SEGUNDO SEMAFORO
ldi zl,low(tabla_semaforo2<<1)
ldi zh,high(tabla_semaforo2<<1)
mov aux,conta
;VERIFICO SI TRANSCURRERON LOS
60SEG DEL CICLO SI ES AS VUELVO
A APUNTAR AL INICIO
;Y SE REPITE EL CICLO
cpi conta,60
brne seguir11
clr conta
mov aux,conta
seguir11:
add zl,aux
clr aux
adc zh,aux
;CARGO EL VALOR DEL ESTADO
lpm estado1,z
;AQUI SI VA A OBTENER EL ESTADO
DE LA ALARMA
;EN 56SEG ALARMA1 APAGADA
cpi conta,56
brne seguir1

ldi tempo,0b00010010
out tccr0a,tempo
;EN 57SEG ALARMA1 ENECENDIDA
seguir1:
cpi conta,57
brne seguir2
ldi tempo,0b00000010
out tccr0a,tempo
;EN 58SEG ALARMA1 APAGADA
seguir2:
cpi conta,58
brne seguir3
ldi tempo,0b00010010
out tccr0a,tempo
;EN 59SEG ALARMA1 ENECENDIDA
seguir3:
cpi conta,59
brne seguir7
ldi tempo,0b00000010
out tccr0a,tempo
;EN 27SEG ALARMA2 ENECENDIDA
seguir7:
cpi conta,27
brne seguir4
ldi tempo,0b01000010
out tccr0a,tempo
;EN 28SEG ALARMA2 APAGADA
seguir4:
cpi conta,28
brne seguir5
ldi tempo,0b00000010
out tccr0a,tempo
;EN 29SEG ALARMA2 ENECENDIDA
seguir5:
cpi conta,29
brne seguir6
ldi tempo,0b01000010
out tccr0a,tempo
;EN 30SEG ALARMA2 APAGADA
seguir6:
cpi conta,30
brne salir
ldi tempo,0b00000010
out tccr0a,tempo
salir:
pop r16
out sreg,r16

pop r16
reti
;A CONTINUACION SE TAN LAS
TABLAS QUE DESCRIBEN EL
COMPORTAMIENTO
;DE LOS SEMAFOROS EN EL TIEMPO
tabla_semaforo1:
.db
0b00001001,0b00001001;1seg,2se
g
.db
0b00001001,0b00001001;3seg,4se
g
.db
0b00001001,0b00010001;5seg,6se
g
.db
0b00010001,0b00010001;7seg,8se
g
.db
0b00010001,0b00010001;9seg,10s
eg
.db
0b00010001,0b00010001;11seg,12
seg
.db
0b00010001,0b00010001;13seg,14
seg
.db
0b00010001,0b00010001;15seg,16
seg
.db
0b00010001,0b00010001;17seg,18
seg
.db
0b00010001,0b00010001;19seg,20
seg
.db
0b00010001,0b00010001;21seg,22
seg
.db
0b00010001,0b00010001;23seg,24
seg
.db
0b00010001,0b00000001;25seg,26
seg

.db
0b00010001,0b00000001;27seg,28
seg
.db 0b00010001,0b00001001;
29seg,30seg
.db 0b00001100,0b00001100;
31seg,32seg
.db 0b00001100,0b00001100;
33seg,34seg
.db 0b00001100,0b00001100;
35seg,36seg
.db 0b00001100,0b00001100;
37seg,38seg
.db 0b00001100,0b00001100;
39seg,40seg
.db 0b00001100,0b00001100;
41seg,42seg
.db 0b00001100,0b00001100;
43seg,44seg
.db 0b00001100,0b00001100;
45seg,46seg
.db 0b00001100,0b00001100;
47seg,48seg
.db 0b00001100,0b00001100;
49seg,50seg
.db 0b00001100,0b00001100;
51seg,52seg
.db 0b00001100,0b00001100;
53seg,54seg
.db 0b00001100,0b00001010;
55seg,56seg
.db 0b00001010,0b00001010;
57seg,58seg
.db 0b00001010,0b00001010;
59seg 60seg
tabla_semaforo2:
.db
0b00001100,0b00001100;1seg,2se
g
.db
0b00001100,0b00001100;3seg,4se
g
.db
0b00001100,0b00001100;5seg,6se
g

.db
0b00001100,0b00001100;7seg,8se
g
.db
0b00001100,0b00001100;9seg,10s
eg
.db
0b00001100,0b00001100;11seg,12
seg
.db
0b00001100,0b00001100;13seg,14
seg
.db
0b00001100,0b00001100;15seg,16
seg
.db
0b00001100,0b00001100;17seg,18
seg
.db
0b00001100,0b00001100;19seg,20
seg
.db
0b00001100,0b00001100;21seg,22
seg
.db
0b00001100,0b00001100;23seg,24
seg
.db
0b00001100,0b00001010;25seg,26
seg
.db
0b00001010,0b00001010;27seg,28
seg
.db 0b00001010,0b00001010;
29seg,30seg
.db 0b00001001,0b00001001;
31seg,32seg
.db 0b00001001,0b00001001;
33seg,34seg
.db 0b00001001,0b00010001;
35seg,36seg
.db 0b00010001,0b00010001;
37seg,38seg
.db 0b00010001,0b00010001;
39seg,40seg
.db 0b00010001,0b00010001;
41seg,42seg

.db 0b00010001,0b00010001;
43seg,44seg
.db 0b00010001,0b00010001;
45seg,46seg
.db 0b00010001,0b00010001;
47seg,48seg
.db 0b00010001,0b00010001;
49seg,50seg
.db 0b00010001,0b00010001;
51seg,52seg
.db 0b00010001,0b00010001;
53seg,54seg
.db 0b00010001,0b00000001;
55seg,56seg
.db 0b00010001,0b00000001;
57seg,58seg
.db 0b00010001,0b00001001;
59seg 60seg

EJEMPLO
RETARDO5 SEGUNDOS
.include "m164pdef.inc"
.def tempo1=r16
.def tempo2=r17
.def tempo3=r18
.def aux=r19
.def tempo=r20
.def conta=r21
ldi tempo,0b11111111
out ddra,tempo
clr tempo
lazo0: ldi tempo1,215
lazo1: ldi tempo2,30
lazo2: ldi tempo3,255
lazo3: dec tempo3
brne lazo3
dec tempo2
brne lazo2
dec tempo1
brne lazo1
in tempo,pina
com tempo
out porta,tempo
rjmp lazo0

EJEMPLO
ONDA CUADRADA DE 100HZ
.include "m164pdef.inc"
.def tempo=r16

.def veces=r17
.org 0x0
rjmp inicio
.org 0x20
rjmp interrupcion
inicio:
ldi tempo,0b00000001
out ddra,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,124
out ocr0a,tempo
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
ldi veces,5
ldi tempo,0b00000011
out tccr0b,tempo
lazo: rjmp lazo
interrupcion:
push r16
in r16,sreg
push r16
dec veces
brne salir
in r16,pina
com r16
out porta,r16
ldi veces,5
salir:
pop r16
out sreg,r16
pop r16
reti

EJEMPLO
VOLTIMETRO
.include "m164pdef.inc"
.dseg
; Lugar donde se van a guardar los 4
dgitos
entero: .byte 1
decimal1: .byte 1
decimal2: .byte 1
decimal3: .byte 1
.cseg

.def tempo=r16
.def resh=r17
.def resl=r18
.def ls=r19
.def ms=r20
.def cinco=r22
.def diez=r23
.org 0x0
;Constante 5 de referencia de
voltaje de 5 voltios
ldi cinco,5
;Constante 10 para poder hacer
divisiones con decimales con restas
sucesivas
ldi diez,10
;Entrada CAD
ldi tempo,0b00000001
out ddra, tempo
;Salidas BARRIDO
ldi tempo,0b11111111
out ddrb,tempo
out ddrd,tempo
out ddrc,tempo
;Habilito converso ADC0
ldi tempo,0b00000001
sts didr0,tempo
;Adlar en cero ajuste a la derecha
ldi tempo,0b01000000
sts admux,tempo
espera1:
;Espera si es que ya se hizo la
conversin
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera1
otro:
;Puede realizar siguiente conversin
Habilito referencia AVCC
ldi tempo,0b11000110
sts adcsra,tempo
espera2:
;Reliza nueva conversion y sigue
con el programa
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera2

;Almaceno datos mas y menos


significativos de conversin
lds resl,adcl
lds resh,adch
;Multiplico por cinco por la
referencia de voltaje
mul resl,cinco
;Almaceno bits mas y menos
significativos resultado de la
multiplicacin por 5
mov ls,r0
mov ms,r1
mul resh,cinco
add ms,r0
clr tempo
cont_unidades:
;Con restas sucesivas voy a dividir
el resultado de la multiplicacin
para 1023
subi ls,low(1023)
sbci ms,high(1023)
brcs salir
;Tempo valor del cociente
inc tempo
rjmp cont_unidades
salir:
;Almaceno en la RAM el valor del
cociente
ldi zl,low(tabla<<1)
ldi zh, high(tabla<<1)
add zl,tempo
clr tempo
add zh,tempo
lpm tempo,z
sts entero,tempo
clr tempo
cont_decimal1:
;Con restas sucesivas calcular el
valor del primer decimal
subi ls,low(-1023)
sbci ms,high(-1023)
call mult10
clr tempo
cantidad_decimal1:
;Se encuentra el valor del primer
decimal
subi ls,low(1023)

sbci ms,high(1023)
brcs salir1
inc tempo
rjmp cantidad_decimal1
salir1:
;Almaceno en la RAM el valor del
primer decimal
ldi zl,low(tabla<<1)
ldi zh, high(tabla<<1)
add zl,tempo
clr tempo
add zh,tempo
lpm tempo,z
sts decimal1,tempo
clr tempo
cont_decimal2:
;Con restas sucesivas calcular el
valor del segundo decimal
subi ls,low(-1023)
sbci ms,high(-1023)
call mult10
clr tempo
cantidad_decimal2:
;Se encuentra el valor del segundo
decimal
subi ls,low(1023)
sbci ms,high(1023)
brcs salir2
inc tempo
rjmp cantidad_decimal2
salir2:
;Almaceno en la RAM el valor del
segundo decimal
ldi zl,low(tabla<<1)
ldi zh, high(tabla<<1)
add zl,tempo
clr tempo
add zh,tempo
lpm tempo,z
sts decimal2,tempo
clr tempo
cont_decimal3:
;Con restas sucesivas calcular el
valor del tercer decimal
subi ls,low(-1023)
sbci ms,high(-1023)
call mult10

clr tempo
cantidad_decimal3:
;Se encuentra el valor del segundo
decimal
subi ls,low(1023)
sbci ms,high(1023)
brcs salir3
inc tempo
rjmp cantidad_decimal3
salir3:
;Almaceno en la RAM el valor del
tercer decimal
ldi zl,low(tabla<<1)
ldi zh, high(tabla<<1)
add zl,tempo
clr tempo
add zh,tempo
lpm tempo,z
sts decimal3,tempo
clr tempo
;Llamo a barrido de displays
call barrido
rjmp otro
;Tabla de equivalencia de
7segmentos ctodo comn
tabla:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
;Rutina Que llama al barrido
barrido:
;Muestro Digito Entero
lds tempo,entero
ori tempo,0b10000000
out portb,tempo
ldi tempo,0b11110111
out portd,tempo
call retardo
ldi tempo,0b11111111
out portd,tempo
;Muestro Decimal1
lds tempo,decimal1
out portb,tempo
ldi tempo,0b11111011
out portd,tempo

call retardo
ldi tempo,0b11111111
out portd,tempo
;Muestro Decimal2
lds tempo,decimal2
out portb,tempo
ldi tempo,0b11111101
out portd,tempo
call retardo
ldi tempo,0b11111111
out portd,tempo
;Muestro Decimal3
lds tempo,decimal3
out portb,tempo
ldi tempo,0b11111110
out portd,tempo
call retardo
ldi tempo,0b11111111
out portd,tempo
ret
;Esta rutina sirve para multiplicar
por 10 un numero de 16 bits, la
misma que ser utilizada para
encontrar valor de decimales
mult10:
mul ls,diez
mov r2,r0
mov r3,r1
mul ms,diez
add r3,r0
mov ls,r2
mov ms,r3
ret
;Retardo para el barrido
retardo:
push r16
in r16,sreg
push r16
ldi tempo,255
lazo_retardo:
dec tempo
breq salir_retardo
rjmp lazo_retardo
salir_retardo:
pop r16
out sreg,r16
pop r16

ret

EJEMPLO
MEDIDOR DE FRECUENCIA
.include "m164pdef.inc"
.def tempo=r16
.def frec=r17
.def aux=r18
.dseg
unidad: .byte 1
decena: .byte 1
.cseg
.org 0x0
rjmp inicio
.org 0x2
rjmp capturar
.org 0x1a
rjmp segundo
inicio:
ldi tempo,low(ramend)

out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
clr tempo
out ddrd,tempo
ser tempo
out ddra,tempo
out ddrc,tempo
out ddrb,tempo
ldi tempo,0b00000010
sts eicra,tempo
ldi tempo,0b00000001
out eimsk,tempo
ldi tempo,0b00000000
sts tccr1a,tempo
ldi tempo,0b00001100
sts tccr1b,tempo
ldi tempo,high(31249)
sts ocr1ah,tempo
ldi tempo,low(31259)
sts ocr1al,tempo
ldi tempo,0b00000010
sts timsk1,tempo
ldi tempo,0b01000010
out tccr0a,tempo
ldi tempo,0b00000100
out tccr0b,tempo
ldi tempo,1
out ocr0a,tempo
sei
lazo:
rjmp lazo
capturar:
push r16
in r16,sreg
push r16
inc frec
pop r16
out sreg,r16
pop r16
reti
segundo:
push r16
in r16,sreg
push r16
subi frec,10
out ocr0a,frec

ldi zl,low(tabla_equivalente<<1)
ldi zh,high(tabla_equivalente<<1)
add zl,frec
clr frec
adc zh,frec
lpm aux,z
clr tempo
decenas:
subi aux,10
brcs seguir1
inc tempo
rjmp decenas
seguir1:
sts decena,tempo
clr tempo
subi aux,-10
unidades:
subi aux,1
brcs seguir2
inc tempo
rjmp unidades
seguir2:
sts unidad,tempo
ldi zl,low(tabla<<1)
ldi zh,high(tabla<<1)
lds tempo,unidad
add zl,tempo
clr tempo
adc zh,tempo
lpm tempo,z
out portc,tempo
ldi zl,low(tabla<<1)
ldi zh,high(tabla<<1)
lds tempo,decena
add zl,tempo
clr tempo
adc zh,tempo
lpm tempo,z
out porta,tempo
clr frec
clr aux
pop r16
out sreg,r16
pop r16
reti
tabla:
.db 0b00111111, 0b00000110

.db 0b01011011, 0b01001111


.db 0b01100110, 0b01101101
.db 0b01111101, 0b00000111
.db 0b01111111, 0b01101111
tabla_equivalente:
.db 0,5;0,1
.db 10,15;2,3
.db 20,25;4,5
.db 30,35;6,7
.db 40,45;8,9
.db 50,55;10,11
.db 60,65;12,13
.db 70,75;14,15
.db 80,85;16,17
.db 90,95;18,19
.db 100,100
EJEMPLO
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
AUX=R17
CONT1=R18
CONT2=R19
CONT3=R20

.CSEG
.ORG 0X00
LDI
OUT
LDI
OUT
LDI
OUT

TEMPO,0B11111111
DDRC,TEMPO
TEMPO,0B00000000
DDRD,TEMPO
TEMPO,0B11111111
PORTD,TEMPO

IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

INICIO:
SBIS PIND,0
RJMP COMPROBAR
RJMP COMPROBAR1

COMPROBAR:
SBIC PIND,1
RJMP FLECHA_DERECHA
RJMP APAGADO
COMPROBAR1:
SBIC PIND,1
RJMP PRENDE_APAGA
RJMP FLECHA_IZQUIERDA
APAGADO:
CLR TEMPO
OUT PORTC,TEMPO
RJMP INICIO
FLECHA_DERECHA:
LDI TEMPO,0B10111110
OUT PORTC,TEMPO
CALL RETARDO
CLR TEMPO
OUT PORTC,TEMPO
CALL RETARDO
RJMP INICIO
FLECHA_IZQUIERDA:
LDI TEMPO,0B01111101
OUT PORTC,TEMPO
CALL RETARDO
CLR TEMPO
OUT PORTC,TEMPO
CALL RETARDO
RJMP INICIO
PRENDE_APAGA:
SER TEMPO
OUT PORTC,TEMPO
CALL RETARDO
CLR TEMPO
OUT PORTC,TEMPO
CALL RETARDO
RJMP INICIO
RETARDO:
PUSH R16
LDI CONT1,2
LAZO1:
LDI CONT2,255
LAZO2:
LDI CONT3,255

LAZO3:
NOP
DEC CONT3
BRNE LAZO3
DEC CONT2
BRNE LAZO2
DEC CONT1
BRNE LAZO1
POP R16
RET
EJEMPLO
RETARDO:
PUSH R16
LDI
CONT1,2
LAZO1:
LDI
CONT2,255
LAZO2:
LDI
CONT3,255
LAZO3:
NOP
DEC
CONT3
BRNE LAZO3
DEC
CONT2
BRNE LAZO2
DEC
CONT1
BRNE LAZO1
POP
R16
RET

EJEMPLO
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
AUX=R17
CONT1=R18
CONT2=R19
CONT3=R20

.CSEG
.ORG 0X00
LDI TEMPO,0B01111111
OUT DDRC,TEMPO
LDI
OUT
LDI
OUT

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

BARRIDO:
LDI ZH,HIGH(TABLA<<1)
LDI ZL,LOW(TABLA<<1)
LDI R16,4
SER AUX
OUT PORTC,AUX
OTRO:
LPM AUX,Z+
OUT PORTC,AUX
CALL RETARDO
DEC R16
BRNE OTRO
RJMP BARRIDO
RETARDO:
PUSH R16
LDI CONT1,2
LAZO1:
LDI CONT2,255
LAZO2:
LDI CONT3,255
LAZO3:
NOP
DEC CONT3

BRNE LAZO3
DEC CONT2
BRNE LAZO2
DEC CONT1
BRNE LAZO1
POP R16
RET
TABLA:
.DB 0B00001001,0B01000000
.DB 0B01000111,0B00001000

/*
* Preparatorio_11.asm
*
* Created: 25/10/2013 17:13:34
* Author: vivia_000
*/
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF
.DEF

TEMPO=R16
NUMAA=R17
NUMBB=R18
NUMA=R19
NUMB=R20
DECENAS=R21
CENTENAS=R22
MILES=R23
AUX=R24

.DSEG
DIG0: .BYTE
DIG1: .BYTE
DIG2: .BYTE
DIG3: .BYTE
SEG0: .BYTE
SEG1: .BYTE
SEG2: .BYTE
SEG3: .BYTE

1
1
1
1
1
1
1
1

.CSEG
.ORG 0X00
;CONFIGURO PUERTOS
LDI
OUT
OUT
OUT
LDI
OUT
LDI
OUT
LDI
OUT

TEMPO,0B00000000
DDRA,TEMPO
DDRB,TEMPO
PORTA,TEMPO
TEMPO,0B00001111
DDRD,TEMPO
TEMPO,0B01111111
DDRC,TEMPO
TEMPO,0B11111111
PORTB,TEMPO

;ACTIVO PULL UP
IN
TEMPO,MCUCR
ANDI TEMPO,0B11101111
OUT MCUCR,TEMPO
;CONFIGURO STACK POINTER
LDI
OUT
LDI
OUT

EJEMPLO

MAIN:

TEMPO,HIGH(RAMEND)
SPH,TEMPO
TEMPO,LOW(RAMEND)
SPL,TEMPO

SBIS PINB,0
RJMP TEMPERATURA
RJMP POTENCIOMETRO

ADC NUMB,NUMBB
DEC AUX
BRNE SUMA1

POTENCIOMETRO:
;CONFIGURO A/D
LDI
TEMPO,0B01000000
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA
LDS NUMA,ADCL
LDS NUMB,ADCH
MOV NUMAA,NUMA
MOV NUMBB,NUMB
LDI
AUX,9

CALL
CALL
CALL
RJMP

SUMA:
ADD NUMA,NUMAA
ADC NUMB,NUMBB
DEC AUX
BRNE SUMA
CLC
ROR NUMB
ROR NUMA
CALL BINARIO_BCD
CALL BCD_7SEG
CALL BARRIDO
RJMP MAIN
TEMPERATURA:
;CONFIGURO CONVERSOR A/D
LDI
TEMPO,0B11000001
STS
ADMUX,TEMPO
LDI
TEMPO,0B11000110
STS
ADCSRA,TEMPO
ESPERA1:
LDS TEMPO,ADCSRA
SBRC TEMPO,6
RJMP ESPERA1
LDS NUMA,ADCL
LDS NUMB,ADCH
CLC
ROR NUMB
ROR NUMA
CLC
ROR NUMB
ROR NUMA
MOV NUMAA,NUMA
MOV NUMBB,NUMB
LDI
AUX,9
SUMA1:
ADD NUMA,NUMAA

BINARIO_BCD
BCD_7SEG
BARRIDO
MAIN

BINARIO_BCD:
CLR
CLR
CLR

DECENAS
CENTENAS
MILES

MILES1:
SUBI
SBCI
BRCS
INC
RJMP

NUMA,LOW(1000)
NUMB,HIGH(1000)
CENTENAS1
MILES
MILES1

CENTENAS1:
STS
SUBI
SBCI

DIG3,MILES
NUMA,LOW(-1000)
NUMB,HIGH(-1000)

CENTENAS2:
SUBI
SBCI
BRCS
INC
RJMP

NUMA,LOW(100)
NUMB,HIGH(100)
DECENAS1
CENTENAS
CENTENAS2

DECENAS1:
STS
SUBI
SBCI

DIG2,CENTENAS
NUMA,LOW(-100)
NUMB,HIGH(-100)

DECENAS2:
SUBI
BRCS
INC
RJMP

NUMA,10
UNIDADES1
DECENAS
DECENAS2

UNIDADES1:
STS
SUBI
STS
RET

DIG1,DECENAS
NUMA,-10
DIG0,NUMA

BCD_7SEG:

OUT
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH

R16
R17
ZL
ZH
XL
XH
YL
YH

LDI
LDI
LDI
LDI
LDI

YH,HIGH(DIG0)
YL,LOW(DIG0)
XH,HIGH(SEG0)
XL,LOW(SEG0)
R17,4

BCD_7SEG1:
LDI
ZH,HIGH(TABLA_7SEG<<1)
LDI
ZL,LOW(TABLA_7SEG<<1)
LD
R16,Y+
ADD ZL,R16
CLR R16
ADC ZH,R16
LPM R16,Z
ST
X+,R16
DEC R17
BRNE BCD_7SEG1
POP
POP
POP
POP
POP
POP
POP
POP
RET

YH
YL
XH
XL
ZH
ZL
R17
R16

BARRIDO:
PUSH R16
PUSH R17
PUSH R18
PUSH XH
PUSH XL
LDI
R16,4
LDI
XH,HIGH(SEG0)
LDI
XL,LOW(SEG0)
SEC
LDI
R18,0B11111110
SER R17
OUT PORTC,R17
OTRO_DIG:
OUT PORTD,R18
LD
R17,X+
OUT PORTC,R17
CALL RETARDO
SER R17

PORTC,R17

ROL R18
DEC R16
BRNE OTRO_DIG
POP
POP
POP
POP
POP
RET

XL
XH
R18
R17
R16

RETARDO:
PUSH R16
LDI
R16,255
LAZO_RETARDO:
NOP
DEC R16
BRNE LAZO_RETARDO
POP
RET

R16

TABLA_7SEG:
.DB
0B1000000,0B1111001
;0,1
.DB
0B0100100,0B0110000
;2,3
.DB
0B0011001,0B0010010
;4,5
.DB
0B0000011,0B1111000
;6,7
.DB
0B0000000,0B0010000
;8,9

.include "m164pdef.inc"
.def
.def
.def
.def
.def
.def
.def

conta1=r16
conta2=r17
conta3=r18
conta4=r19
tempo=r20
ante=r21
aux=r22

.dseg

numero1:
numero2:
numero3:
numero4:

.byte
.byte
.byte
.byte

1
1
1
1

.cseg
.org 0x0
jmp inicio
;Apunto al puerto b interrupciones
con cambio de estado para
jugadores
.org 0xA
jmp jugadores
inicio:
;HABILITACION DEL STACK
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo

EJEMPLO

;SALIDAS DE DISPLAYS
ldi tempo,0b11111111
out ddra,tempo
out ddrc,tempo
out ddrd,tempo

;HABILITACION DE INTERRUPCION
POR CAMBIO DE ESTADO AL PUERTO
B
ldi tempo,0b00000010
sts pcicr,tempo
ldi tempo,0b00001111
sts pcmsk1,tempo

sbrc tempo,2
call jugador3
sbrc tempo,3
call jugador4
pop r16
out sreg,r16
pop r16
reti

;HABILITACION GLOBAL DE
INTERRUPCIONES
sei

jugador1:

clr
clr
clr
clr

sbrc ante,0
ret
inc conta1
ret

conta1
conta2
conta3
conta4

;LEER ESTADO ANTERIOR PARA


COMPARACION
in ante,pinb
programa:
out portd,conta1
call bcd_7seg
call barrido

jugador2:
sbrc ante,1
ret
inc conta2
ret

jugador3:
rjmp programa
jugadores:
push r16
in r16,sreg
push r16
in tempo,pinb
eor tempo,ante
in ante,pinb
sbrc tempo,0
call jugador1
sbrc tempo,1
call jugador2

sbrc ante,2
ret
inc conta3
ret

jugador4:
sbrc ante,3
ret
inc conta4
ret

brne retardo_1
pop r16
barrido:
ret
lds tempo,numero1;A
out portc,tempo
ldi tempo,0b11111110
out porta,tempo
call retardo
ldi tempo,0b11111111
out porta,tempo
lds tempo,numero2;L
out portc,tempo
ldi tempo,0b11111101
out porta,tempo
call retardo
ldi tempo,0b11111111
out porta,tempo
lds tempo,numero3;O
out portc,tempo
ldi tempo,0b11111011
out porta,tempo
call retardo
ldi tempo,0b11111111
out porta,tempo
lds tempo,numero4;H
out portc,tempo
ldi tempo,0b11110111
out porta,tempo
call retardo
ldi tempo,0b11111111
out porta,tempo

ret
retardo:
push r16
ldi r16,255

bcd_7seg:
push
push
push
push
push
push
push
push
push
push
push

xl
xh
yl
yh
zl
zh
conta1
conta2
conta3
conta4
tempo

ldi xl,low(numero1)
ldi xh,high(numero1)

ldi zl,low(tabla<<1)
ldi zh,high(tabla<<1)
mov tempo,conta1
add zl,tempo
lpm tempo,z
st x+,tempo
mov tempo,conta2
add zl,tempo
lpm tempo,z
st x+,tempo

mov tempo,conta3
add zl,tempo
lpm tempo,z
st x+,tempo

retardo_1:

mov tempo,conta4
add zl,tempo

dec r16

lpm tempo,z

st x+,tempo
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
ret

tempo
conta4
conta3
conta2
conta1
zh
zl
yh
yl
xh
xl

tabla:
.db 0b00111111,0b00000110
.db 0b01011011,0b01001111

EJEMPLO
CONVERSOR AD 10 LEDS
.include "m164pdef.inc"
.def tempo=r16
.def resh=r17
.def resl=r18
.org 0x0
ldi tempo,0b00000001
out ddra, tempo
ldi tempo,0b11111111
out ddrb,tempo
out ddrc,tempo
ldi tempo,0b00000001
sts didr0,tempo
ldi tempo,0b01100000
sts admux,tempo

espera1:
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera1
otro:
ldi tempo,0b11000110
sts adcsra,tempo
espera2:
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera2
lds resl,adcl
lds resh,adch
out portb,resh
out portc,resl
rjmp otro

EJEMPLO
Clave auto
.include "m164pdef.inc"
;=====================
========DEFINICION DE
VARIABLES===============
===========
.def tempo=r16
;Variable
temporal
.def pulsos=r17
;Variable
de conteo de pulsaciones
.def tempo2=r18
;Variable
temporal2
.def espera=r19
;Variable
de espera
.def veces=r20
;Variable
conteo numero de fallos
.def senal_paro=r21
;Variable que da la senal de
paro

.def boton=r22
;Variable
temporal del boton oprimido
.def clave=r23
;Variable
temporal de la secuencia correcta
.def flag=r24
;Variable
que indica si ha pasado 1 seg
.def conta_int=r25 ;Variable que
cuenta el numero de interrupciones
generadas por el timer0
;
======================
========ESPACIO EN LA
SRAM==================
=============
.dseg
PASSWORD: .byte 6
;
======================
========SALTOS A
PROGRAMAS==============
=================
.cseg
;INICIO DEL PROGRAMA PRINCIPAL
.org 0x00
rjmp principal
;INICIO DE SUBRUTINA DE
INTERRUPCION PARA PCINT0
.org 0x08
rjmp secuencia
;INICIO DE SUBRUTINA POR
INTERRUPCION DE DESBORDE DEL
TIMER0
.org 0x09
rjmp int_tmr0
;========CONFIGURACION DE
PORTICOS, INTERRUPCIONES Y
MEMORIA
RAM================
principal:
;STACK POINTER
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,high(ramend)
out sph,tempo
;PORTICOS DE ENTRADA Y DE
SALIDA
ldi tempo,0b00000000

out ddra,tempo
;PULL UP
ldi tempo,255
out porta,tempo
ldi tempo,255
out ddrb,tempo
;CONFIGURACION DE
INTERRUPCIONES POR CAMBIO DE
ESTADO
ldi tempo,0b00000000
out eimsk,tempo
;HABILITACION DE INTERRUPCIONES
POR CAMBIO DE ESTADO EN PCINT0PCINT7
ldi tempo,0b00000001
sts pcicr,tempo
;CONFIGURACION DE MASCARAS DE
PCINT0-PCINT5 (PUERTO A:
PULSANTES)
ldi tempo,0b00011111
sts pcmsk0,tempo
ldi veces,3 ;contador para
bloquear luego de 3 intentos fallidos
;
======================
=====CONFIGURACION
INICIAL=================
==============
config_ini:
;PUNTERO AL ESPACIO DE
ALMACENAMIENTO DE LA
SECUENCIA
ldi xl,low(PASSWORD)
ldi xh,high(PASSWORD)
;INICIO VARIABLES
clr senal_paro
cli
;BORRADO DE LA BANDERA
DE INTERRUPCION
;NUMERO MAX DE PULSACIONES
ldi pulsos,6
;CONFIGURO ESPERA EN CERO PARA
BUCLE QUE TERMINA CON LA
PRIMERA INTERRUPCION
ldi espera,0
;
======================
=======INICIO DEL

PROGRAMA===============
================
espera_inicio:
;PRENDE EL LED AMARILLO
MIENTRAS ESPERA POR EL INGRESO
DE LA CLAVE
cli
;LED AMARILLO SE PRENDE EN PB0
ldi tempo,0b00000001
out portb,tempo
;LA ESPERA TERMINA SI SE PULSA
UNA TECLA (ESPERA=1)
sei
cpi espera,0
brne comprob_bloqueo
rjmp espera_inicio
;
==============COMPROBAC
ION DEL BLOQUEO POR NUMERO DE
INTENTOS================
==
comprob_bloqueo:
;LLAMADO AL RETARDO DE 5 SEG
CON TIMER
rcall timer_5
cpi veces,0
brne bloqueo_tempo
;
======================
=VERIFICACION DE LA
CLAVE==================
==============
;comprobar2:
;llamado al
led rojo en caso de que no se haya
ingresado la clave en los 5
sgeundos
;
rcall comprobar
;llamado a la rutina de
comprobacion de la secuencia
ingresada
;
rjmp inicio
;regreso para ingresar
nuevamente una secuencia
verif_clave:
;PUNTERO A LA SECUENCIA
CORRECTA
ldi zl,low(tabla_sec<<1)

ldi zh,high(tabla_sec<<1)
;CARGA DE PUNTEROS DE
SECUENCIA CORRECTA Y
SECUENCIA INGRESADA
ld clave,z+
ld boton,-x
;COMPARACION DE BOTON
APLASTADO Y CLAVE
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
ld boton,z+
ld clave,-x
cp boton,clave
brne bloqueo_tempo
rjmp sec_correcta
;
====================BL
OQUEO TEMPORAL ANTES DE 3
INTENTOS================
=======
bloqueo_tempo:
cli
;PRENDO EL LED ROJO QUE ESTA EN
EL SEGUNDO PIN DEL PORTICO B
ldi tempo,0b00000010
out portb,tempo
;LLAMO AL RETARDO DE 5 SEG
rcall timer_5
;DECREMENTO Y COMPARACION DEL
CONTADOR DEL NUMERO DE VECES
FALLIDAS
dec veces
cpi veces,0
;SALTO AL BLOQUEO PERMANENTE
DEL UC

breq bloqueo_perman
rjmp espera_inicio
;
==================BLOQ
UEO TEMPORAL DESPUES DE 3
INTENTOS================
=======
bloqueo_perman:
;PRENDO EL LED ROJO QUE ESTA EN
EL SEGUNDO PIN DEL PORTICO B
ldi tempo,0b00000010
out portb,tempo
;LLAMO AL RETARDO DE 5 SEG
rcall timer_5
;BUCLE INFINITO
rjmp bloqueo_perman
;
======================
========SECUENCIA
CORRECTA===============
================
sec_correcta:
cli
;PRENDO EL LED VERDE QUE ESTA
EN EL TERCER PIN DEL PORTICO B
ldi tempo,0b00000100
out portb,tempo
;LLAMO AL RETARDO DE 5 SEG
rcall timer_5
rjmp principal
;
======================
====IDENTIFICACION DE
PULSACION===============
===========
secuencia:
clr tempo2
;VERIFICO CUAL ES EL PIN QUE NO
ESTA SETEADO
sbis pina,0
rcall boton1
sbis pina,1
rcall boton2
sbis pina,2
rcall boton3
sbis pina,3
rcall boton4

sbis pina,4
rcall boton5
;VERIFICO QUE SE HAYA APLASTADO
UN BOTON
cpi tempo2,0
;SI NO SE HA APLASTADO UN BOTON
REGRESA A COMPROBAR LA CLAVE
breq regresar
dec pulsos
regresar:
cpi senal_paro,6
breq verif_clave
reti
;
==================SUBR
UTINAS DE ALMACENAMIENTO DE
SECUENCIA===============
=====
;SI EL BOTON 1 (PA0) SE HA
PRESIONADO
boton1:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,1
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 2 (PA1) SE HA
PRESIONADO
boton2:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,2
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 3 (PA2) SE HA
PRESIONADO

boton3:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,3
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 4 (PA3) SE HA
PRESIONADO
boton4:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,4
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;SI EL BOTON 5 (PA4) SE HA
PRESIONADO
boton5:
;SE CARGA LOS DATOS EN EL
ESPACIO DE MEMORIA PASSWORD
ldi tempo2,5
st x+,tempo2
ldi espera,1
;SE AUMENTA LA SENAL DE PARO
QUE AL LLEGAR A 6 SALTA A
VERIFICAR LA SECUENCIA
inc senal_paro
ret
;
======================
=======RETARDO DE 5 SEG POR
TIMER==================
======
timer_5:
ldi veces,5
timer_51:
ldi tempo2,0

;COMPRUEBO SI HA PASADO 5
VECES LA RUTINA DE 1 SEGUNDO
cp veces, tempo2
;SI HAN PASADO 5 VECES REGRESO
DE LA SUBRUTINA
brne timer_1
ret
timer_1:
;PONEMOS A CERO LA BANDERA Y
EL CONTADOR
clr flag
clr conta_int
;CONFIGURO EL TIMER0 CON
PREESCALER=256
ldi tempo,4
out tccr0A,tempo
;CONFIGURO LA PRECARGA PARA
CONTAR SOLAMENTE 125 ESTADO
DE TIMER
ldi tempo,130
out tcnt0,tempo
loop:
;SE CONFIRMA SI HA PASADO 1 SEG
cpi flag,255
;SALTO A DECREMENTO DEL
CONTADOR
breq toggle
rjmp loop
toggle:
dec veces
clr flag
;REGRESO A COMPROBAR SI HAN
PASADO LOS 5 SEG
rjmp timer_51
;===============RUTINA DE
INTERRUPCION POR DESBORDE DEL
TIMER0=================
=
int_tmr0:
;INCREMENTO DEL CONTADOR
inc conta_int
;VERIFICAR SI HAN PASADO 125
INTERRUPCIONES
cpi conta_int,125
;SI NO, SALIR DE LA RUTINA
brne salir1

;SI HAN PASADO LAS 125


INTERRUPCIONES ACTIVAR LA
BANDERA
ser flag
clr conta_int
;RUTINA PARA SALIR DE LA
INTERRUPCION
salir1:
;SETEO EL VALOR DE PRECARGA
PARA CONTAR SOLO 125 ESTADOS
DEL TIMER
ldi tempo,130
out tcnt0,tempo
reti
;TABLA DE ALMACENAMIENTO DE LA
SECUENCIA CORRECTA
tabla_sec:
.db 3
.dB 5
.dB 2
.dB 1
.dB 4
.dB 5

.def aux2=r18
.def datos_in=r19 ;datos de
seleccion de salidas adc
.def alta=r20
;bits altos de adc
.def baja=r21
;bits bajos de
adc
;configuro puerto a como entrada
adc
ldi tempo,0
out ddra,tempo
out porta,tempo
ldi tempo,254
sts didr0,tempo
;configuracion de puertob como
entrada de datos
config_in:
ldi tempo,0
out ddrb,tempo
out portb,tempo
ldi aux,0

.include "m164pdef.inc"
.def tempo=r16
.def aux=r17

;entrada de byte de datos


selec:
in datos_in,porta ;Cargo datos de
entrada al porta
sbrc datos_in,0 ;Compruebo si el pin
esta en cero
inc aux
;INcremento registro
auxiliar para posterior analisis
sbrc datos_in,1
inc aux
sbrc datos_in,2
inc aux
sbrc datos_in,3
inc aux
sbrc datos_in,4
inc aux
sbrc datos_in,5
inc aux
sbrc datos_in,6
inc aux
sbrc datos_in,7
rjmp config_in
;Comprobacion de paridad

par:
ror aux ;Divido para 2
brcs error ;Si el carry se setea es
impar
rol aux
cpi aux,0 ;Compruebo dato fuera de
rango
breq error
;Configuracion del portb como salida
de datos
config_out:
ldi tempo,1
out ddrb,tempo
ldi tempo,0
out portb,tempo

;Cargo registro alto y bajo de cad


lds alta,adch
lds baja,adcl
ret
;Subrutina de retardo para evitar
error de frame
retardo:
ldi tempo,138
lazo: dec tempo
nop
nop
nop
brne lazo
ret

;rutina para salida de datos


salida:
rcall conver
out portb,alta
rcall retardo
out portb,baja
rcall retardo
dec aux
cpi aux,0
breq config_in
rjmp salida
error:
rjmp error
;Subrutina de conversion ad
conver:
mov aux2,aux
ldi tempo,0b01000000
add tempo,aux2 ;Sumo el bit de
datos de seleccion para elegir la
entrada adc requerida
sts admux,tempo
ldi tempo,0b11000100
sts adcsra,tempo
espera: ;rutina de espera para fin de
cad
lds tempo,adcsra
sbrc tempo,6
rjmp espera

condicion: .byte 1
vmin: .byte 1
vmax: .byte 1
segmentos: .byte 4
.cseg
.org 0x00
rjmp principal
.org 0x06
rjmp cambio
principal:

ldi tempo,0b11111010
out ddra,tempo
com tempo
out porta,tempo
ldi tempo,0b00000000
out portc,tempo
com tempo
out ddrc,tempo
ldi tempo,0b00001111
out ddrd,tempo
com tempo
out portd,tempo
ldi tempo,0b00000000
out ddrb,tempo
com tempo
out portb,tempo

ldi tempo, high(ramend)


out sph,tempo
ldi tempo, low(ramend)
out spl,tempo

EJEMPLO
Voltimetro y termmetro prepa10
.include "m164pdef.inc"
.def tempo=r16
.dseg
numero1: .byte 1
numero2: .byte 1
numero3: .byte 1
numero4: .byte 1
numero5: .byte 1
digito: .byte 4

;Configuracion A/D
ldi tempo,0b01000000
sts admux,tempo
ldi tempo,0b00000101
sts didr0,tempo
ldi tempo,0b00100000
sts eicra,tempo
ldi tempo,0b00000100
out eimsk,tempo
sei
ldi tempo,0
sts condicion,tempo
pulsador:
lds r18,condicion
cpi r18,0

breq voltimetro
call termometro
retorno:
rjmp pulsador

sts numero3,r19
sts numero4,r24
call bin_bcd
call bcd_7seg
call barrido
rjmp retorno
bin_bcd:

voltimetro:
ldi tempo,0b11000110
sts adcsra,tempo
interrup11:
lds tempo,adcsra
sbrc tempo,6
rjmp interrup11
lds tempo,adcl
sts vmin,tempo
lds tempo,adch
sts vmax,tempo
lds r20,vmin
lds r21,vmax
ldi r22,low(9775)
ldi r23,high(9775)
mul r20,r22
mov r24,r0
mov r25,r1
mul r20,r23
mov r16,r0
mov r17,r1
ldi r18,0
add r25,r16
adc r17,r18
sts numero1,r24
mul r21,r22
mov r24,r0
mov r18,r1
add r25,r24
sts numero2,r25
adc r17,r18
clr r18
mul r21,r23
mov r19,r0
mov r24,r1
add r19,r17
adc r24,r18

push
push
push
push
push
push
push
push
push
push
push
push
push
push

r16
r17
r18
r19
r20
r21
r22
r23
r24
r25
xl
xh
zl
zh

clr R16
lds
r17,numero1
lds
r18,numero2
lds
r19,numero3
lds
r20,numero4
ldi
r21,4
ldi
xl,low(digito)
ldi
xh,high(digito)
ldi
zl,low(constantes<<1)
ldi
zh,high(constantes<<1)
bin_bcd0:
lpm
lpm
lpm
lpm
lpm

r22,z+
r22,z+
r23,z+
r24,z+
r25,z+

bin_bcd1:
sub
r17,r25
sbc
r18,r24
sbc
r19,r23
sbc
r20,r22
brcs bin_bcd2
inc
r16
rjmp bin_bcd1
bin_bcd2:
add
adc
adc

r17,r25
r18,r24
r19,r23

adc
r20,r22
st
x+,r16
clr
r16
dec
r21
brne bin_bcd0

ret

pop
pop

r17
r16

barrido:
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop

zh
zl
xh
xl
r25
r24
r23
r22
r21
r20
r19
r18
r17
r16

push
push
push
push
push
ldi
ldi
ldi
ldi

ser
r16
out
portd,r16
ld
r16,x+
cpi
r17,4
brne punto
ori
r16,0b10000000

bcd_7seg:

ldi
ldi
ldi
ldi
ldi

r16
r17
xl
xh
yl
yh
zl
zh

punto:
out
portc,r16
out
portd,r18
call retardo_barrido
sec
ror
r18
dec
r17
brne barrido0
ser
r16
out
portd,r16

xh,high(segmentos)
xl,low(segmentos)
yh,high(digito)
yl,low(digito)
r17,4

bcd_7seg0:
ldi
zh,high(tabla_seg<<1)
ldi
zl,low(tabla_seg<<1)
ld
r16,y+
add
zl,r16
clr
r16
adc
zh,r16
lpm
r16,z
st
x+,r16
dec
r17
brne bcd_7seg0
pop
pop
pop
pop
pop
pop

zh
zl
yh
yl
xh
xl

r17,4
xh,high(segmentos)
xl,low(segmentos)
r18,0b11110111

barrido0:

ret

push
push
push
push
push
push
push
push

r16
r17
r18
xl
xh

ret

pop
pop
pop
pop
pop

xh
xl
r18
r17
r16

retardo_barrido:
push r16
ldi
r16,255
retardo0:
nop
dec
r16
brne retardo0
ret

pop r16

call barrido2
termometro:
ldi tempo,0b11000110
sts adcsra,tempo
interrup111:
lds tempo,adcsra
sbrc tempo,6
rjmp interrup111
lds tempo,adcl
sts vmin,tempo
lds tempo,adch
sts vmax,tempo

ret
barrido2:
push
push
push
push
push
push
push
push
push
push
push

.EQU SEGME = PORTC


.EQU DISPL = PORTD
lds r21,vmax
ldi r22,0
cp r21,r22
brne barrido3
lds r20,vmin
ldi r22,205
cp r20,r21
breq barrido3
cp r20,r21
brcc barrido3
rjmp barrido1

lds r20,vmin
lds r21,vmax
ldi r22,low(25024)
ldi r23,high(25024)
mul r20,r22
mov r24,r0
mov r25,r1
mul r20,r23
mov r16,r0
mov r17,r1

barrido3:

ldi r18,0
add r25,r16
adc r17,r18

ldi
ldi
ldi
ldi

sts numero1,r24
mul r21,r22
mov r24,r0
mov r18,r1
add r25,r24
sts numero2,r25
adc r17,r18
clr r18
mul r21,r23
mov r19,r0
mov r24,r1
add r19,r17
adc r24,r18
sts numero3,r19
sts numero4,r24
call bin_bcd
call bcd_7seg

r16
r17
r18
r19
r20
r21
r22
xl
xh
yl
yh

xl,LOW(segmentos)
xh,HIGH(segmentos)
r18,0b11110111
r17,4

barrido4:
ser R16
out portd,R16
escan:
ld r16,X+
cpi r17,3
brne continua1
ori r16,0b10000000
continua1:
out SEGME,r16
out DISPL,r18
call retardo_barrido2
sec
ror r18
dec r17
brne barrido4

ser r16
out portd,r16
rjmp salto2
barrido1:

ret

cambio:
push r16
in r16,sreg

ldi xl,LOW(segmentos)
ldi xh,HIGH(segmentos)
ldi r18,0b11110111
ldi r17,4

push r17
push r18
push r19
clr r17
clr r18
clr r19

barrido5:
ser r16
out portd,r16
ld r16,x+
cpi r17,4
brne continua2
ori r16,0b10000000

lds r17,admux
sbrs r17,1
rjmp leer
ldi r19,0
ldi r18,0b01000000
rjmp salir

continua2:
out SEGME,r16
out DISPL,r18
call retardo_barrido2
sec
ror r18
dec r17
brne barrido5
ser r16
out portd,r16

leer:
ldi r19,1
ldi r18,0b11000010
salir:

salto2:
nop

ret

pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop

brne salto
pop r16

sts condicion,r19
sts admux,r18
pop r19
pop R18
pop r17
out sreg,R16
pop R16

reti
yh
yl
xh
xl
r22
r21
r20
r19
r18
r17
r16

retardo_barrido2:
push r16
ldi r16,255

constantes:
.db 0b00000000, 0b00000000
.db 0b00001111, 0b01000010
.db 0b01000000, 0b00000000
.db 0b00000000, 0b00000001
.db 0b10000110, 0b10100000
.db 0b00000000 , 0b00000000
.db 0b00000000, 0b00100111
.db 0b00010000, 0b00000000
.db 0b00000000, 0b00000000
.db 0b00000011, 0b11101000
.db 0b00000000, 0b00000000
.db 0b00000000, 0b00000000
.db 0b01100100, 0b00000000
.db 0b00000000, 0b00000000
.db 0b00000000, 0b00001010
tabla_seg:

salto:
dec R16

.db 0b00111111,0b00000110

.db
.db
.db
.db

0b01011011,0b01001111
0b01100110,0b01101101
0b01111101,0b00000111
0b01111111,0b01101111

EJEMPLO
/*
* debertimer0.asm
*
* Created: 12/01/2015 17:30:49
* Author: Edder
*/
.include"m164pdef.inc"
.def tempo=r16
.def cont=r17
.def aux=r18
.def veces=r19

.def cont1=r20
.org 0x00
rjmp inicio
.org 0x02
rjmp encendido
.org 0x04
rjmp subir
.org 0x06
rjmp bajar
.org 0x20
rjmp tiempo
inicio:
ldi tempo,0b00000000
out ddrb,tempo
out ddrd,tempo
ldi tempo,0b11111111
out ddrc,tempo
out ddra,tempo
out portb,tempo
out portd,tempo
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,0b00101010
sts EICRA,tempo
ldi tempo,0b00000111
out EIMSK,tempo
out EIFR,tempo
clr cont
SEI
apagado:
clr aux
out porta,aux
lazo:
cpi cont,0
breq apagado
cpi cont1,0
breq cuartoseg
cpi cont1,1
breq medioseg
cpi cont1,2
breq unseg
cpi cont1,3
breq dosseg
rjmp lazo
cuartoseg:
ldi tempo,0b01000010
out tccr0a,tempo
ldi tempo,124
out ocr0a,tempo
ldi veces,125

ldi tempo,0b00000101
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
lazo1:
rjmp lazo1
medioseg:
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,124
out ocr0a,tempo
ldi veces,125
ldi tempo,0b00000100
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
rjmp lazo
unseg:
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,249
out ocr0a,tempo
ldi veces,125
ldi tempo,0b00000100
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
rjmp lazo
dosseg:
ldi tempo,0b00000010
out tccr0a,tempo
ldi tempo,249
out ocr0a,tempo
ldi veces,250
ldi tempo,0b00000100
sts tccr0b,tempo
ldi tempo,0b00000010
sts timsk0,tempo
sei
rjmp lazo
tiempo:
push r16
in r16,sreg
push r16
dec veces
brne salir
in r16,pina
com r16
out porta,tempo
cpi cont1,0
breq cuarto
cpi cont1,1
breq medio
cpi cont1,2

breq uno
cpi cont1,3
breq dos
cuarto:
ldi veces,125
rjmp salir
medio:
ldi veces,125
rjmp salir
uno:
ldi veces,125
rjmp salir
dos:
ldi veces,250
rjmp salir
salir:
pop r16
out sreg,r16
pop r16
reti

encendido:
push r16
in r16,sreg
push r16
inc cont
cpi cont,2
brne siga
ldi cont,0
siga:
pop r16
out sreg,r16
pop r16
RETI
subir:
push r16
in r16,sreg
push r16
inc cont1
cpi cont1,4
breq redefinir1
rjmp saltoo
redefinir1:
ldi cont1,3
saltoo:
pop r16
out sreg,r16
pop r16
reti
bajar:
push r16
in r16,sreg
push r16

cpi cont1,0
breq redefinir
dec cont1
rjmp saltoo1
redefinir:
ldi cont1,0
saltoo1:
pop r16
out sreg,r16
pop r16
reti

dato: .byte 1
valor_a: .byte 1
valor_b: .byte 1
valor_c: .byte 1
valor_x: .byte 1
respta: .byte 2
res0: .byte 1
res1: .byte 1
res2: .byte 1
binlow: .byte 1
binhigh: .byte 1
bcd0: .byte 1
bcd1: .byte 1
bcd2: .byte 1
bcd3: .byte 1
bcd4: .byte 1
dig0: .byte 1
dig1: .byte 1
dig2: .byte 1
dig3: .byte 1

.cseg
.org 0x000
rjmp inicio
.org 0x002
rjmp teclado
.org 0x040
inicio:

ldi tempo,0b00001111
out ddrb,tempo
ldi tempo,0
out ddrd,tempo
ldi tempo,255
out ddra,tempo
out ddrc,tempo
out portb,tempo
out portd,tempo

EJEMPLO
.include"m164pdef.inc"
.def tempo=r16
.def tecla=r17
.def catodo=r18
.def aux=r19
.def num1=r22
.def num2=r23
.def num3=r20
.def num4=r24
.def aux1=r21
.def display=r3
.dseg

in tempo, mcucr ;activo las


resistencias del pullup
andi tempo, 0b11101111
out mcucr, tempo
ldi tempo,0b00000010 ;Cargo en
el registro EICRA
sts EICRA,tempo
ldi tempo,0b00000001
out EIMSK,tempo
sei
clr tempo
out portb,tempo
ldi tecla,0xbb
lazo:
cpi tecla, 0xbb ;compara si no se a
presionado ninguna tecla

breq barrido0 ;salta si es igual


cpi tecla,0xD
breq borrar
cpi tecla,0x0a
brne datoa1
rjmp datoa
datoa1:
cpi tecla,0x0b
brne datob1
rjmp datob
datob1:
cpi tecla,0x0c
brne datoc1
rjmp datoc
datoc1:
cpi tecla,0x0f
brne datox1
rjmp datox
datox1:
cpi tecla,0x0e
brne igual
rjmp resultado
igual:
ldi num3,0
mov num2,num1
mov num1,tecla
ldi aux,10
mul num2,aux
add r0,num1
sts dato,r0
ldi tecla,0xbb
rjmp barrido0
borrar:
clr num1
clr num2
clr num3
clr num4
ldi tecla,0xbb
barrido0:
ldi catodo,0b11111110
out porta,catodo
mov display, num1
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num2
call bin_7seg
out portc,display
call retardo

ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num3
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num4
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
rjmp lazo
datoa:
lds aux1,dato
sts valor_a,aux1
rjmp borrar
datob:
lds aux1,dato
sts valor_b,aux1
rjmp borrar
datoc:
lds aux1,dato
sts valor_c,aux1
rjmp borrar
datox:
lds aux1,dato
sts valor_x,aux1
rjmp borrar
resultado:
lds r18,valor_a
lds r19,valor_c
lds r20,valor_b
lds r21,valor_x
mul r21,r21; x por x
mov r5,r0 ;parte baja de x^2
mov r6,r1;parte alta de x^2
mov r7,r18;valor de a
mul r5,r7;a x parte baja de x^2
sts res2,r0
mov r8,r1
mul r7,r6
add r8,r0
sts res1,r8
ldi r22,0
adc r22,r1
sts res0,r22

mul r19,r21
lds r22,res2
lds r23,res1
lds r24,res0
add r22,r0
;adc r22,r20
adc r23,r1
ldi r18,0
adc r24,r18
adc r22,r20
adc r23,r18
add r24,r18
add r18,r19
add r20,r18
add r23,r20
ldi r23,0x10
ldi r23,0x27
cp r22,r23
cpc r23,r23
brcs rangovalido
ldi num1,16
ldi num2,16
ldi num3,16
ldi num4,16
ldi tecla,0xbb
rjmp barrido0
rangovalido:
sts binlow,r22
sts binhigh,r23
call binbcd
lds num4,bcd3
lds num3,bcd2
lds num2,bcd1
lds num1,bcd0
rjmp barrido0
ldi tecla,0xbb
rjmp lazo
teclado:
push r16
in r16,sreg
push r16
ldi tempo,0b00000111
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x1
sbis pinb,5
ldi tecla,0x4
sbis pinb,6
ldi tecla,0x7
sbis pinb,7
ldi tecla,0xD

ldi tempo,0b00001011
out portb,tempo
sbis pinb,4// salta si esta en 1l

ldi tecla,0x2
sbis pinb,5
ldi tecla,0x5
sbis pinb,6
ldi tecla,0x8
sbis pinb,7
ldi tecla,0x0
ldi tempo,0b00001101
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x3
sbis pinb,5
ldi tecla,0x6
sbis pinb,6
ldi tecla,0x9
sbis pinb,7
ldi tecla,0xE
ldi tempo,0b00001110
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0xA
sbis pinb,5
ldi tecla,0xB
sbis pinb,6
ldi tecla,0xC
sbis pinb,7
ldi tecla,0xF
clr tempo
out portb,tempo
pop r16
out sreg,r16
pop r16
reti
bin_7seg:
ldi zh, high(tabla7<<1)
ldi zl, low(tabla7<<1)
add zl,display
lpm display,z
ret
binbcd:
push r17
push
push
push
push

r18
r19
r20
r21

lds r18,binlow
lds r19,binhigh
clr r17
otradecmil:
subi r18,16

sbci r19,39
brcs decmil
inc r17
rjmp otradecmil

decmil:
ldi r20,16
add r18,r20
ldi r20,39
adc r19,r20
sts bcd4,r17
clr r17
otramil:
subi r18,232
sbci r19,3
brcs cent
inc r17
rjmp otramil
cent:
ldi r20,232
add r18,r20
ldi r20,3
adc r19,r20
sts bcd3,r17
clr r17

otracent:
subi r18,100
sbci r19,0
brcs decenas
inc r17
rjmp otracent
decenas:
ldi r20,100
add r18,r20
ldi r20,0
adc r19,r20
sts bcd2,r17
clr r17
otrodec:
subi r18,10
sbci r19,0
brcs unidades
inc r17
rjmp otrodec
unidades:
ldi r20,10
add r18,r20
ldi r20,0
adc r19,r20
sts bcd1,r17
sts bcd0,r18
pop
pop
pop
pop
pop

r21
r20
r19
r18
r17

ret
retardo:
; ldi r23,10
;lazo3:
ldi r26,10
lazo2:
ldi r25,255; retardo
lazo1:
dec r25
brne lazo1
dec r26
brne lazo2
;dec r23
;brne lazo3
ret
tabla7:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111
.db 0b01110111,0b01111100
(A),11 (b)
.db 0b10111001,0b01011110
(C),13 (d)
.db 0b01111001,0b01110001
(E),15 (F)
.db 0b01000000,0

;2,3
;4,5
;6,7
;8,9
;10
;12
;14

valor_b: .byte 1
valor_c: .byte 1
valor_x: .byte 1
respta: .byte 2
res0: .byte 1
res1: .byte 1
res2: .byte 1
binlow: .byte 1
binhigh: .byte 1
bcd0: .byte 1
bcd1: .byte 1
bcd2: .byte 1
bcd3: .byte 1
bcd4: .byte 1
dig0: .byte 1
dig1: .byte 1
dig2: .byte 1
dig3: .byte 1

.cseg
.org 0x000
rjmp inicio
.org 0x002
rjmp teclado
.org 0x040
inicio:

EJEMPLO
/*
* prepa8.asm
*
* Created: 12/15/2014 3:59:52 PM
* Author: Hector Naranjo
*/
.include"m164pdef.inc"
.def tempo=r16
.def tecla=r17
.def catodo=r18
.def aux=r19
.def num1=r22
.def num2=r23
.def num3=r20
.def num4=r24
.def aux1=r21
.def display=r3
.dseg
dato: .byte 1
valor_a: .byte 1

ldi tempo,0b00001111
out ddrb,tempo
ldi tempo,0
out ddrd,tempo
ldi tempo,255
out ddra,tempo
out ddrc,tempo
out portb,tempo
out portd,tempo
in tempo, mcucr ;activo las
resistencias del pullup
andi tempo, 0b11101111
out mcucr, tempo
ldi tempo,0b00000010 ;Cargo en
el registro EICRA
sts EICRA,tempo
ldi tempo,0b00000001
out EIMSK,tempo
sei
clr tempo
out portb,tempo
ldi tecla,0xbb
lazo:
cpi tecla, 0xbb ;compara si no se a
presionado ninguna tecla
breq barrido0 ;salta si es igual
cpi tecla,0xD

breq borrar
cpi tecla,0x0a
brne datoa1
rjmp datoa
datoa1:
cpi tecla,0x0b
brne datob1
rjmp datob
datob1:
cpi tecla,0x0c
brne datoc1
rjmp datoc
datoc1:
cpi tecla,0x0f
brne datox1
rjmp datox
datox1:
cpi tecla,0x0e
brne igual
rjmp resultado
igual:
ldi num3,0
mov num2,num1
mov num1,tecla
ldi aux,10
mul num2,aux
add r0,num1
sts dato,r0
ldi tecla,0xbb
rjmp barrido0
borrar:
clr num1
clr num2
clr num3
clr num4
ldi tecla,0xbb
barrido0:
ldi catodo,0b11111110
out porta,catodo
mov display, num1
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num2
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo

sec
rol catodo
out porta,catodo
mov display, num3
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
sec
rol catodo
out porta,catodo
mov display, num4
call bin_7seg
out portc,display
call retardo
ser tempo
out porta,tempo
rjmp lazo
datoa:
lds aux1,dato
sts valor_a,aux1
rjmp borrar
datob:
lds aux1,dato
sts valor_b,aux1
rjmp borrar
datoc:
lds aux1,dato
sts valor_c,aux1
rjmp borrar
datox:
lds aux1,dato
sts valor_x,aux1
rjmp borrar
resultado:
lds r18,valor_a
lds r19,valor_c
lds r20,valor_b
lds r21,valor_x
mul r21,r21; x por x
mov r5,r0 ;parte baja de x^2
mov r6,r1;parte alta de x^2
mov r7,r18;valor de a
mul r5,r7;a x parte baja de x^2
sts res2,r0
mov r8,r1
mul r7,r6
add r8,r0
sts res1,r8
ldi r22,0
adc r22,r1
sts res0,r22
mul r19,r21
lds r22,res2

lds r23,res1
lds r24,res0
add r22,r0
;adc r22,r20
adc r23,r1
ldi r18,0
adc r24,r18
adc r22,r20
adc r23,r18
add r24,r18
add r18,r19
add r20,r18
add r23,r20
ldi r23,0x10
ldi r23,0x27
cp r22,r23
cpc r23,r23
brcs rangovalido
ldi num1,16
ldi num2,16
ldi num3,16
ldi num4,16
ldi tecla,0xbb
rjmp barrido0
rangovalido:
sts binlow,r22
sts binhigh,r23
call binbcd
lds num4,bcd3
lds num3,bcd2
lds num2,bcd1
lds num1,bcd0
rjmp barrido0
ldi tecla,0xbb
rjmp lazo
teclado:
push r16
in r16,sreg
push r16
ldi tempo,0b00000111
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x1
sbis pinb,5
ldi tecla,0x4
sbis pinb,6
ldi tecla,0x7
sbis pinb,7
ldi tecla,0xD

ldi tempo,0b00001011
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x2
sbis pinb,5

ldi tecla,0x5
sbis pinb,6
ldi tecla,0x8
sbis pinb,7
ldi tecla,0x0
ldi tempo,0b00001101
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0x3
sbis pinb,5
ldi tecla,0x6
sbis pinb,6
ldi tecla,0x9
sbis pinb,7
ldi tecla,0xE
ldi tempo,0b00001110
out portb,tempo
sbis pinb,4// salta si esta en 1l
ldi tecla,0xA
sbis pinb,5
ldi tecla,0xB
sbis pinb,6
ldi tecla,0xC
sbis pinb,7
ldi tecla,0xF
clr tempo
out portb,tempo
pop r16
out sreg,r16
pop r16
reti
bin_7seg:
ldi zh, high(tabla7<<1)
ldi zl, low(tabla7<<1)
add zl,display
lpm display,z
ret
binbcd:
push r17
push
push
push
push

r18
r19
r20
r21

lds r18,binlow
lds r19,binhigh
clr r17
otradecmil:
subi r18,16
sbci r19,39
brcs decmil

inc r17
rjmp otradecmil

decmil:
ldi r20,16
add r18,r20
ldi r20,39
adc r19,r20
sts bcd4,r17
clr r17
otramil:
subi r18,232
sbci r19,3
brcs cent
inc r17
rjmp otramil
cent:
ldi r20,232
add r18,r20
ldi r20,3
adc r19,r20
sts bcd3,r17
clr r17

otracent:
subi r18,100
sbci r19,0
brcs decenas
inc r17
rjmp otracent
decenas:
ldi r20,100
add r18,r20
ldi r20,0
adc r19,r20
sts bcd2,r17
clr r17
otrodec:
subi r18,10
sbci r19,0
brcs unidades
inc r17
rjmp otrodec
unidades:
ldi r20,10
add r18,r20
ldi r20,0
adc r19,r20
sts bcd1,r17
sts bcd0,r18
pop
pop
pop
pop
pop
ret

r21
r20
r19
r18
r17

retardo:
; ldi r23,10
;lazo3:
ldi r26,10
lazo2:
ldi r25,255; retardo
lazo1:
dec r25
brne lazo1
dec r26
brne lazo2
;dec r23
;brne lazo3
ret
tabla7:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111
.db 0b01100110,0b01101101
.db 0b01111101,0b00000111
.db 0b01111111,0b01101111
.db 0b01110111,0b01111100
(A),11 (b)
.db 0b10111001,0b01011110
(C),13 (d)
.db 0b01111001,0b01110001
(E),15 (F)
.db 0b01000000,0

;2,3
;4,5
;6,7
;8,9
;10
;12
;14

inicio: ldi tempo,0b00000000


;definicin de puertos
out ddrb,tempo
out ddrc,tempo
out ddrd,tempo
ldi tempo,0b11111111
out portb,tempo
out portc,tempo
out portd,tempo
ldi tempo,0b01111111
out ddra,tempo
ldi tempo,0b10000000
out porta,tempo
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo
ldi tempo,high(ramend)
;definicin del Stack
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo

EJEMPLO
/*
* Manejo_de_interrupciones.asm
*
* Created: 30/12/2014 19:29:52
* Author: EDDERGAIBOR
*/
.include "m164pdef.inc"
.def tempo=r16
.def ante=r17
.def aux=r18
.def xpasos=r19
.def aux1=r20
.def antem=r21
.def anted=r22

ldi tempo,0b00101010
;habilitacion
interrupciones externas
sts eicra,tempo
ldi tempo,0b00000111
out eimsk,tempo
ldi tempo,0b00000111
out eifr,tempo
ldi tempo,0b00000100
;habilitacion de
interrupciones del puerto C
sts pcicr,tempo
ldi tempo,0b00000011
sts pcmsk2,tempo
ldi tempo,0b00000100
out pcifr,tempo
sei
ldi tempo,0b00000000
sts LEDS,tempo
ldi aux,0b11111111
ldi aux1,0b11110000
ldi xpasos,0b00000000

.dseg
LEDS: .BYTE 1
.cseg
.org 0x00
rjmp inicio
.org 0x02
rjmp modo
.org 0x04
rjmp tipo
.org 0x06
rjmp sentido
.org 0x0C
rjmp pasos

lazo:

lds ante,LEDS
lds tempo,LEDS
out porta,tempo
sbrc tempo,4
;determino que
modo de operacin se est ejecutando
call automatico
rjmp lazo

automatico:
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,6
;determino el
sentido de giro
rjmp antihorario
horario:
sbrc tempo,5
;determino el tipo
de paso
rjmp dobleh
simple:
ori tempo,0b00000001

el led A

el led B

el led C

el led D

out porta,tempo
;se prende

call retardo
andi tempo,0b11110011
ori tempo,0b00001001
out porta,tempo
;se prende
el led D y A

ret
antihorario:
sbrc tempo,5
;determino el tipo
de paso
simplea:

call retardo
andi tempo,0b11111110
ori tempo,0b00000010
out porta,tempo
;se prende

el led D

call retardo
andi tempo,0b11111101
ori tempo,0b00000100
out porta,tempo
;se prende

el led C

call retardo
andi tempo,0b11111011
ori tempo,0b00001000
out porta,tempo
;se prende

el led B

call retardo
andi tempo,0b11110111
ret
dobleh:

el led A y B

el led B y C

el led C y D

rjmp doblea
ori tempo,0b00001000
out porta,tempo
;se prende
call retardo
andi tempo,0b11110111
ori tempo,0b00000100
out porta,tempo
;se prende
call retardo
andi tempo,0b11111011
ori tempo,0b00000010
out porta,tempo
;se prende
call retardo
andi tempo,0b11111101
ori tempo,0b00000001
out porta,tempo
;se prende

el led A
ori tempo,0b00000011
out porta,tempo
;se prende

call retardo
andi tempo,0b11110110

doblea:

call retardo
andi tempo,0b11111100
ori tempo,0b00000110
out porta,tempo
;se prende

el led D y A

call retardo
andi tempo,0b11111001
ori tempo,0b00001100
out porta,tempo
;se prende

el led C y D

call retardo
andi tempo,0b11111110
ret

ori tempo,0b00001001
out porta,tempo
;se prende
call retardo
andi tempo,0b11110110
ori tempo,0b00001100
out porta,tempo
;se prende
call retardo
andi tempo,0b11110011
ori tempo,0b00000110

el led B y C

el led A y B

out porta,tempo
;se prende

apagar:

call retardo
andi tempo,0b11111001
ori tempo,0b00000011

tipo:

out porta,tempo
;se prende
call retardo
andi tempo,0b11111100
ret

retardo:

lazo1:
lazo2:

lds r20,LEDS
cp ante,r20
brne salir
push r16
push r19
push r18
ldi r16,36
ldi r19,100

ldi r18,255
lazo3: dec r18
brne lazo3
dec r19
brne lazo2
dec r16
brne lazo1
pop r18
pop r19
pop r16
ret
salir: lds tempo,LEDS
andi tempo,0b11110000
sts LEDS,tempo
ldi xpasos,0b00000000
ldi aux1,0b11110000
rjmp lazo
modo:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,4
rjmp apagar
ori ante,0b00010000
guardar:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti

andi ante,0b11101111
rjmp guardar

push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,5
rjmp apagar1
ori ante,0b00100000
guardar1:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar1:
andi ante,0b11011111
rjmp guardar1
sentido:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,6
rjmp apagar2
ori ante,0b01000000
guardar2:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar2:
andi ante,0b10111111
rjmp guardar2
pasos:

abandonar:

push tempo
in tempo,sreg
push tempo
lds tempo,LEDS
sbrc tempo,4
rjmp abandonar
in tempo,pinc
eor tempo,aux
sbrc tempo,0
rcall avanzar
sbrc tempo,1
rcall retroceder
pop tempo

out sreg,tempo
pop tempo

or tempo,xpasos
sts LEDS,tempo
ldi antem,0
lds anted,LEDS

reti
avanzar:
push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblem
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentes
ldi xpasos,0b00000000
normalmentes:
cpi xpasos,0b00000000
breq arreglo
clc
rol xpasos
continuar:
cpi xpasos,0b00010000
brne mostrar
rcall final
mostrar:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
arreglo:
sec
rol xpasos
rjmp continuar
final:
ldi xpasos,0b00000001
andi tempo,0b11110111
ret
doblem:

normalmente:

continuard:

mostrard:

andi antem,0b00001111
cpi antem,0b00000000
breq normalmente
ldi xpasos,0b00000000
cpi xpasos,0b00000000
breq arreglod
clc
inc xpasos
cpi xpasos,0b00010010
brne continuard
rcall finaldd
cpi xpasos,0b00011000
brne mostrard
rcall finald

arreglod:

pop tempo
ret
ldi xpasos,0b00000011
rjmp continuard

finald:
finaldd:

ldi xpasos,0b00001001
ret
ldi xpasos,0b00000011
ret

retroceder:

push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblemr
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentesr
ldi xpasos,0b00000000
normalmentesr:
clc
ror xpasos
cpi xpasos,0b00000000
brne mostrar1
rcall final1
mostrar1:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
final1:
ldi xpasos,0b00001000
andi tempo,0b11111110
ret
doblemr:

andi antem,0b00001111
cpi antem,0b00000000
breq normalmenter
ldi xpasos,0b00000000

normalmenter:
cpi xpasos,0b00000000
breq arreglodr
clc
ror xpasos
cpi xpasos,0b00000100
brne continuardr

rcall finalddr
continuardr:

mostrardr:

arreglodr:

out ddrd,tempo
ldi tempo,0b11111111
out portb,tempo
out portc,tempo
out portd,tempo
ldi tempo,0b01111111
out ddra,tempo
ldi tempo,0b10000000
out porta,tempo
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo

cpi xpasos,0b00000001
brne mostrardr
rcall finaldr
or tempo,xpasos
sts LEDS,tempo
ldi antem,0
lds anted,LEDS
pop tempo
ret
ldi xpasos,0b00001001
rjmp continuard

finaldr:
finalddr:

EJEMPLO

ldi xpasos,0b00001001
ret
ldi xpasos,0b00001100
ret

/*
* Manejo_de_interrupciones.asm
*
* Created: 30/12/2014 19:29:52
* Author: EDDERGAIBOR
*/
.include "m164pdef.inc"
.def tempo=r16
.def ante=r17
.def aux=r18
.def xpasos=r19
.def aux1=r20
.def antem=r21
.def anted=r22
.dseg

.cseg

ldi tempo,high(ramend)
;definicin del Stack
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
ldi tempo,0b00101010
;habilitacion
interrupciones externas
sts eicra,tempo
ldi tempo,0b00000111
out eimsk,tempo
ldi tempo,0b00000111
out eifr,tempo
ldi tempo,0b00000100
;habilitacion de
interrupciones del puerto C
sts pcicr,tempo
ldi tempo,0b00000011
sts pcmsk2,tempo
ldi tempo,0b00000100
out pcifr,tempo
sei
ldi tempo,0b00000000
sts LEDS,tempo
ldi aux,0b11111111
ldi aux1,0b11110000
ldi xpasos,0b00000000

LEDS: .BYTE 1

.org 0x00
rjmp inicio
.org 0x02
rjmp modo
.org 0x04
rjmp tipo
.org 0x06
rjmp sentido
.org 0x0C
rjmp pasos

inicio: ldi tempo,0b00000000


;definicin de puertos
out ddrb,tempo
out ddrc,tempo

lazo:

lds ante,LEDS
lds tempo,LEDS
out porta,tempo
sbrc tempo,4
;determino que
modo de operacin se est ejecutando
call automatico
rjmp lazo
automatico:

lds tempo,LEDS
andi tempo,0b11110000

sbrc tempo,6
;determino el
sentido de giro
rjmp antihorario
horario:
sbrc tempo,5
;determino el tipo
de paso
rjmp dobleh
simple:
ori tempo,0b00000001

el led D y A

call retardo
andi tempo,0b11110110
ret
antihorario:
de paso

out porta,tempo
;se prende
el led A

el led B

el led C

el led D

simplea:

call retardo
andi tempo,0b11111110
ori tempo,0b00000010
out porta,tempo
;se prende

el led D

call retardo
andi tempo,0b11111101
ori tempo,0b00000100
out porta,tempo
;se prende

el led C

call retardo
andi tempo,0b11111011
ori tempo,0b00001000
out porta,tempo
;se prende

el led B

el led A

el led A y B

el led B y C

el led C y D

ori tempo,0b00001000
out porta,tempo
;se prende
call retardo
andi tempo,0b11110111
ori tempo,0b00000100
out porta,tempo
;se prende
call retardo
andi tempo,0b11111011
ori tempo,0b00000010
out porta,tempo
;se prende

out porta,tempo
;se prende

doblea:

call retardo
andi tempo,0b11111100
ori tempo,0b00000110
out porta,tempo
;se prende

el led D y A

call retardo
andi tempo,0b11111001
ori tempo,0b00001100
out porta,tempo
;se prende

el led C y D

call retardo
andi tempo,0b11110011
ori tempo,0b00001001

rjmp doblea

call retardo
andi tempo,0b11111110
ret

ori tempo,0b00000011
out porta,tempo
;se prende

sbrc tempo,5
;determino el tipo

call retardo
andi tempo,0b11111101
ori tempo,0b00000001

call retardo
andi tempo,0b11110111
ret

dobleh:

out porta,tempo
;se prende

el led B y C

ori tempo,0b00001001
out porta,tempo
;se prende
call retardo
andi tempo,0b11110110
ori tempo,0b00001100
out porta,tempo
;se prende
call retardo
andi tempo,0b11110011
ori tempo,0b00000110
out porta,tempo
;se prende

call retardo
andi tempo,0b11111001
ori tempo,0b00000011
out porta,tempo
;se prende
el led A y B

retardo:

lazo1:

call retardo
andi tempo,0b11111100
ret

lds r20,LEDS
cp ante,r20
brne salir
push r16
push r19
push r18
ldi r16,36
ldi r19,100

lazo2:

ldi r18,255
lazo3: dec r18
brne lazo3
dec r19
brne lazo2
dec r16
brne lazo1
pop r18
pop r19
pop r16
ret
salir: lds tempo,LEDS
andi tempo,0b11110000
sts LEDS,tempo
ldi xpasos,0b00000000
ldi aux1,0b11110000
rjmp lazo
modo:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,4
rjmp apagar
ori ante,0b00010000
guardar:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar:
andi ante,0b11101111

rjmp guardar
tipo:
push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,5
rjmp apagar1
ori ante,0b00100000
guardar1:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar1:
andi ante,0b11011111
rjmp guardar1
sentido:

push tempo
push ante
in tempo,sreg
push tempo
lds ante,LEDS
sbrc ante,6
rjmp apagar2
ori ante,0b01000000
guardar2:sts LEDS,ante
pop tempo
out sreg,tempo
pop ante
pop tempo
reti
apagar2:
andi ante,0b10111111
rjmp guardar2
pasos:
push tempo
in tempo,sreg
push tempo
lds tempo,LEDS
sbrc tempo,4
rjmp abandonar
in tempo,pinc
eor tempo,aux
sbrc tempo,0
rcall avanzar
sbrc tempo,1
rcall retroceder
abandonar:

pop tempo
out sreg,tempo
pop tempo

reti

lds anted,LEDS

avanzar:
push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblem
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentes
ldi xpasos,0b00000000
normalmentes:
cpi xpasos,0b00000000
breq arreglo
clc
rol xpasos
continuar:
cpi xpasos,0b00010000
brne mostrar
rcall final
mostrar:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
arreglo:
sec
rol xpasos
rjmp continuar
final:
ldi xpasos,0b00000001
andi tempo,0b11110111
ret
doblem:

normalmente:

continuard:

mostrard:

andi antem,0b00001111
cpi antem,0b00000000
breq normalmente
ldi xpasos,0b00000000
cpi xpasos,0b00000000
breq arreglod
clc
inc xpasos
cpi xpasos,0b00010010
brne continuard
rcall finaldd

pop tempo
ret
arreglod:
finald:

ldi xpasos,0b00001001
ret
finaldd:
retroceder:

ldi xpasos,0b00000011
ret

push tempo
lds tempo,LEDS
andi tempo,0b11110000
sbrc tempo,5
rjmp doblemr
andi anted,0b00001111
cpi anted,0b00000000
breq normalmentesr
ldi xpasos,0b00000000
normalmentesr:
clc
ror xpasos
cpi xpasos,0b00000000
brne mostrar1
rcall final1
mostrar1:
or tempo,xpasos
sts LEDS,tempo
lds antem,LEDS
ldi anted,0
pop tempo
ret
final1:
ldi xpasos,0b00001000
andi tempo,0b11111110
ret
doblemr:
andi antem,0b00001111
cpi antem,0b00000000
breq normalmenter
ldi xpasos,0b00000000
normalmenter:
cpi xpasos,0b00000000
breq arreglodr
clc
ror xpasos
cpi xpasos,0b00000100
brne continuardr
rcall finalddr

cpi xpasos,0b00011000
brne mostrard
rcall finald
or tempo,xpasos
sts LEDS,tempo
ldi antem,0

ldi xpasos,0b00000011
rjmp continuard

continuardr:

cpi xpasos,0b00000001

mostrardr:

brne mostrardr
rcall finaldr
or tempo,xpasos
sts LEDS,tempo
ldi antem,0
lds anted,LEDS
pop tempo
ret

arreglodr:
finaldr:

ldi xpasos,0b00001001
rjmp continuard
ldi xpasos,0b00001001
ret

finalddr:

EJEMPLO

ldi xpasos,0b00001100
ret

*
* PWM_1Hz_Timer1.asm
*
* Created: 15/01/2015 23:49:51
* Author: usuario
*/
.include "m164pdef.inc"
.def tempo=r16
.cseg
.org 0x0
ldi tempo,0b00100000
out ddrd,tempo
ldi tempo,0b01000000
sts tccr1a,tempo
ldi tempo,0b00001100
sts tccr1b,tempo
ldi tempo,high(15624)
sts ocr1ah,tempo
ldi tempo,low(15624)
sts ocr1al,tempo
fin:
rjmp fin

EJEMPLO
/*
* ConversorAD.asm
*
* Created: 08/01/2015 7:10 PM
* Author: Pablo
*/
.include "m164pdef.inc"
.def tempo=r16
.def cont=r17
.dseg
NUM1H:
.byte
NUM2H:
.byte
NUM3H:
.byte
NUM4H:
.byte
NUM1L:
.byte
NUM2L:
.byte
NUM3L:
.byte
NUM4L:
.byte
bcd5:
.byte 1
bcd4:
.byte 1
bcd3:
.byte 1
bcd2:
.byte 1
bcd1:
.byte 1
nx5:
.byte 1
nx4:
.byte 1
nx3:
.byte 1
nx2:
.byte 1
nx1:
.byte 1
.cseg
.org 0X00
ldi
tempo,0xFF
out ddrb,tempo
out ddrd,tempo
ldi
tempo,0x00

1
1
1
1
1
1
1
1

out ddra,tempo
ldi
tempo,high(ramend)
out sph,tempo
ldi
tempo,low(ramend)
out spl,tempo
ldi
tempo,0x0F
sts didr0,tempo
again:
ldi
XH,high(NUM1L)
ldi
XL,low(NUM1L)
ldi
YH,high(NUM1H)
ldi
YL,low(NUM1H)
ldi
tempo,0b01000000
;Referencias y AX
sts admux,tempo
;Referencias
ldi
cont,0
;;
otro:
ldi
tempo,0b01000000
;;
add tempo,cont
;;
sts admux,tempo
;;
ldi
tempo,0b11000110
sts adcsra,tempo
espera:
lds tempo,adcsra
sbrc tempo,adsc
rjmp espera
lds tempo,adcl
st
x+,tempo
lds tempo,adch
andi tempo,0b00000011
st
y+,tempo
CALL MOSTRAR
inc cont
;;
cpi cont,4
;;
breq again
rjmp otro
RETARDO:
push r16
in

r16,sreg

Push r16
push r17
ldi
r16,255
lazret:
ldi
r17,1
lazret2:
dec r17
brne lazret2
dec r16
brne lazret
pop
pop
out
pop

r17
r16
sreg,r16
r16

RET
MOSTRAR:
Push r16
push r17
Push r18
push r19
push r20
push xl
push xh
push yl
push yh
lds r16,NUM1L
lds r17,NUM1H
lds r18,NUM2L
lds r19,NUM2H
add r16,r18
adc r17,r19
lds r18,NUM3L
lds r19,NUM3H
clc
add r16,r18
adc r17,r19
lds r18,NUM4L
lds r19,NUM4H
clc
add r16,r18
adc r17,r19
mov r18,r16
mov r19,r17

ldi r20,0x00
dec5:
ldi r16,low(10000)
ldi r17,high(10000)
sub r18,r16
sbc r19,r17
brcs st5
inc r20
rjmp dec5
st5:
sts nx5,r20
clr r20
add r18,r16
adc r19,r17
dec4:
ldi r16,low(1000)
ldi r17,high(1000)
sub r18,r16
sbc r19,r17
brcs st4
inc r20
rjmp dec4
st4:
sts nx4,r20
clr r20
add r18,r16
adc r19,r17
dec3:
ldi r16,low(100)
ldi r17,high(100)
sub r18,r16
sbc r19,r17
brcs st3
inc r20
rjmp dec3
st3:
sts nx3,r20
clr r20
add r18,r16
adc r19,r17
dec2:
ldi r16,low(10)
ldi r17,high(10)
sub r18,r16
sbc r19,r17
brcs st2
inc r20

rjmp dec2
st2:
sts nx2,r20
clr r20
add r18,r16
adc r19,r17
sts nx1,r18
ldi xh,high(nx5)
ldi xl,low(nx5)
ldi r20,5
ldi r19,0b11101111
BCD_lazo:
ldi zh,high(display<<1)
ldi zl,low(display<<1)
ld r18,x+
add zl,r18
lpm r18,z
out portb,r18
out portd,r19
call retardo
ldi r18,0xFF
out portd,r18
sec
ror r19
dec r20
breq fin
rjmp BCD_lazo
fin:
pop yh
pop yl
pop xh
pop xl
pop r20
pop r19
pop r18
pop r17
pop r16
RET

display:
.db
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x

7D,0x7,0x7F,0x67,0x77,0x7C,0x39,
0x5E,0x79,0x71

S-ar putea să vă placă și