Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
II. OBJETIVOS
inicio:
Se tomó el puerto C para el teclado matricial, para la
pantalla se utilizó los pines B4,B5,B6,B7 del puerto B ya LDI R16, HIGH(RAMEND)
que esta en modo de 4bits, para RS,RW,E se utilizó OUT SPH, R16
A0,A1,A2. Y para los leds se utilizo D0, D1,D2. LDI R16, LOW(RAMEND)
OUT SPL, R16
2. Diagrama esquemático para el ejercicio del
sumador o restador. //configuracion de puertos
//inicializacion
led2: clavecorrecta:
LDI R16,$03 ; enciendo el primer y segundo leds //borro lcd
OUT PORTD,R16 LDI R18,$01 ;borro lcd
CPI R18,$06 ; compara si la tecla presionada es 2 CALL comando
BREQ correcto2; si es asi salta correcto2 //ubico
RET LDI R18,$85; ubico cursor en linea1 posicion 4
CALL comando
led3: //Iniciar el puntero Z para "Wrong"
LDI R16,$07 ; enciendo primer segundo y tercer led
OUT PORTD,R16 LDI ZH, HIGH (m3<<1)
CPI R18,$02 ;comparo si la tecla presionada es 1 LDI ZL, LOW (m3<<1)
BREQ correcto3 ; si es correcta salta a correcto3 //mostrar mensaje
JMP claveincorrecta; sino es asi salta a claveincorrecta CALL mostrar
//ubico
nopresion: LDI R18,$C4 ;ubico cursor linea2 pocision 4
JMP arranca CALL comando
//Iniciar el puntero Z para "Password"
correcto1: LDI ZH, HIGH (m5<<1)
LDI R25,$01 ;cargo R25 $01 LDI ZL, LOW (m5<<1)
ret ; y retorno //mostrar mensaje
correcto2: CALL mostrar
INC R25 ;cargo R26 $01 CALL espera2s; muestro espero 2 segundos
ret ; y retorno LDI R18,$01 ; borro lcd y me devuelvo mensaje
correcto3: CALL comando ; Acces by keyboard
INC R25 ; cargo R27 $01 JMP llegada
JMP sies ; salto a la subrutina
sies: ciclo:
CPI R25, $03 JMP ciclo
BREQ clavecorrecta
JMP claveincorrecta ;salto a clavecorrecta mostrar:
LPM R18, Z+ ;carga he incrementa puntero
CPI R18, $00 ;compara si R18 es 0
claveincorrecta: BREQ fin ;si es asi salta a fin
//borro lcd CALL dato; sino llama a dato
LDI R18,$01 ;borro lcd JMP mostrar
CALL comando
//ubico
LDI R18,$85; ubico cursor en linea1 posicion 4 fin:RET
CALL comando
//Iniciar el puntero Z para "Wrong" dato:
SBI PORTA, 0 ; rs en 1
LDI ZH, HIGH (m4<<1) JMP enter
LDI ZL, LOW (m4<<1)
//mostrar mensaje comando:
CALL mostrar
//ubico CBI PORTA, 0 ;rs 0
LDI R18,$C4 ;ubico cursor linea2 pocision 4 JMP enter
CALL comando
//Iniciar el puntero Z para "Password" enter:
LDI ZH, HIGH (m5<<1) CBI PORTA, 1 ;rw en 0
LDI ZL, LOW (m5<<1) OUT PORTB, R18
//mostrar mensaje SBI PORTA, 2 ; enable en 1
CALL mostrar CALL espera2ms
CALL espera2s; muestro espero 2 segundos CBI PORTA, 2 ;enable en 0
LDI R18,$01 ; borro lcd y me devuelvo mensaje SWAP R18
OUT PORTB, R18 CALL dato
SBI PORTA, 2; enable en 1 LDI R21,$6C
CALL espera2ms CALL dato
CBI PORTA, 2 LDI R21,$00
RET CALL dato
LDI R21,$81
CALL dato
3. Programa para el ejercicio del sumador o restador. LDI R21,$42
CALL dato
.include "m16def.inc" LDI R21,$3C
CALL dato
.device ATMEGA16
LDI R21,$00
CALL dato
//caracter 2
.org $0000 LDI R21,$50
CALL espera2ms CALL comando
JMP inicio LDI R21,$00
CALL dato
.org $0004 LDI R21,$7C
JMP cambio CALL dato
LDI R21,$EE
.org $0200 CALL dato
m1: .DB $01,$02, 0 LDI R21,$FC
CALL dato
inicio: LDI R21,$F8
LDI R16, HIGH(RAMEND) CALL dato
OUT SPH, R16 LDI R21,$F8
LDI R16, LOW(RAMEND) CALL dato
OUT SPL, R16 LDI R21,$FE
CALL dato
//configuracion de puertos LDI R21,$7E
LDI R16, $80 CALL dato
OUT MCUCSR, R16 /*
LDI R16,$FF ; configuro como salidas el puerto A ;caracter 3
OUT DDRA,R16 LDI R21,$48
LDI R16,$FF; configuro como salidas el puerto B CALL comando
OUT DDRB,R16 LDI R21,$0E
LDI R16,$0F ; configuro la parte alta como entradas CALL dato
OUT DDRC,R16 ; y la parte baja como salidas del teclado LDI R21,$1F
LDI R16,$F7 ; configuro como salidas el puerto D CALL dato
OUT DDRD,R16 LDI R21,$15
CALL dato
//inicializacion LDI R21,$1F
CALL dato
LDI R16,$00 ; inicio todos los puertos apagados LDI R21,$1F
OUT PORTA,R16 CALL dato
LDI R16,$00 LDI R21,$1F
OUT PORTB,R16 CALL dato
LDI R16,$00 LDI R21,$15
OUT PORTC,R16 CALL dato
LDI R16,$00 LDI R21,$00
OUT PORTD,R16 CALL dato
//caracter 4
//escribo caracteres LDI R21,$50
;caracter 1 CALL comando
LDI R21,$48 LDI R21,$00
CALL comando CALL dato
LDI R21,$00 LDI R21,$00
CALL dato CALL dato
LDI R21,$6C LDI R21,$1B
CALL dato OUT PORTC,R16
LDI R21,$00 JMP barrido
CALL dato
LDI R21,$00 linea2:
CALL dato INC R19
LDI R21,$1F INC R18
CALL dato LDI R16,$02
LDI R21,$00 OUT PORTC,R16
CALL dato JMP barrido
LDI R21,$00
CALL dato linea3:
*/ INC R19
INC R18
//Configuracion LCD a 4 bits LDI R16,$04
LDI R21, $20 OUT PORTC,R16
OUT PORTB, R21 //configuro la lcd a 4 bits JMP barrido
SBI PORTA, 2
CALL espera2ms linea4:
CBI PORTA, 2 INC R19
INC R18
//confi. lcd LDI R16,$08
LDI R21, $28 ; a modo de 4 bits, 2 líneas, 5x7 OUT PORTC,R16
CALL comando JMP barrido
LDI R21, $06 ;movimiento del cursor a la
derecha, quelinea:
CALL comando ;sin desplazamiento automático de la CPI R19,$00
pantalla BREQ linea2
LDI R21, $0C ;pantalla encendida, cursor CPI R19,$01
invisible, BREQ linea3
CALL comando ;cursor sin parpadeo. CPI R19,$02
LDI R21, $01 BREQ linea4
CALL comando CPI R19,$03
BREQ nopresion
;Configurar la interrupcion externa INT1
LDI R16, $08 barrido:
OUT MCUCR, R16 ; 0000 SBIC PINC,4
1000 JMP presion
LDI R16, $80 INC R18
OUT GICR, R16 ; 1000 CALL espera2ms
0000 SBIC PINC,5
LDI R16, $00 JMP presion
OUT GIFR, R16 ; INC R18
Limpia las banderas CALL espera2ms
;NO OLVIDAR ACTIVAR LA INTERRUPCION SBIC PINC,6
GLOBAL JMP presion
SEI INC R18
CALL espera2ms
CLR R20 ;de que ya presiono SBIC PINC,7
CLR R23 JMP presion
CLR R26 CALL espera2ms
CLR R25 JMP quelinea
CLR R27
nopresion:
arranca: JMP arranca
CLR R16
CLR R18//tecla actual presion:
CLR R19//linea barrido INC R20
CPI R20, $01
linea1: BREQ presiono1
LDI R16,$01 CPI R20, $02
BREQ presiono2 seis:
JMP arranca LDI R21, '6'
CALL dato
presiono1: JMP suma
JMP presiono1a siete:
presiono2: LDI R21, '7'
JMP presiono2a CALL dato
JMP suma
presiono1a: ocho:
CALL centrar1 LDI R21, '8'
CPI R18, $00 CALL dato
BREQ uno JMP suma
CPI R18, $01 nueve:
BREQ cuatro LDI R21, $39
CPI R18, $02 CALL dato
BREQ siete JMP suma
CPI R18, $04 error:
BREQ dos CALL error1
CPI R18, $05 LDI R20, $00
BREQ cinco JMP arranca
CPI R18, $06
BREQ ocho presiono2a:
CPI R18, $07 CALL centrar2
BREQ cero CPI R18, $07
CPI R18, $08 BREQ cero
BREQ tres CPI R18, $00
CPI R18, $09 BREQ uno
BREQ seis CPI R18, $01
CPI R18, $0A BREQ cuatro
BREQ nueve CPI R18, $02
CPI R18, $03 BREQ siete
BREQ error CPI R18, $04
CPI R18, $0B BREQ dos
BRSH error CPI R18, $05
JMP presiono1 BREQ cinco
CPI R18, $06
cero: BREQ ocho
LDI R21, '0' CPI R18, $08
CALL dato BREQ tres
JMP suma CPI R18, $09
uno: BREQ seis
LDI R21, '1' CPI R18, $0A
CALL dato BREQ nueve
JMP suma CPI R18, $03
dos: BREQ error
LDI R21, '2' CPI R18, $0B
CALL dato BRSH error
JMP suma JMP presiono1
tres:
LDI R21, '3'
CALL dato error1:
JMP suma CALL centrar1
cuatro: LDI R21, 'I'
LDI R21, '4' CALL dato
CALL dato LDI R21, 'N'
JMP suma CALL dato
cinco: LDI R21, 'C'
LDI R21, '5' CALL dato
CALL dato LDI R21, 'O'
JMP suma CALL dato
LDI R21, 'R' JMP arranca
CALL dato
LDI R21, 'R' resultado:
CALL dato CALL caracter
LDI R21, 'E' MOV R25, R28
CALL dato CPI R27, $01
LDI R21, 'C' BREQ resta
CALL dato CPI R27, $02
LDI R21, 'T' BREQ sumardenuevo
CALL dato JMP resultado
LDI R21, 'O'
CALL dato resta: JMP restan
CALL espera1s
LDI R21, $01 sumardenuevo:
CALL comando CALL centrar3
RET LDI R21, '+'
CALL dato
centrar1: LDI R27, $00
LDI R21, $83 LDI R21, $8B
CALL comando CALL comando
RET LDI R21, ' '
centrar2: CALL dato
LDI R21, $87 LDI R21, ' '
CALL comando CALL dato
RET LDI R21, $8B
CALL comando
centrar3: ;mas ADD R25, R26
LDI R21, $85 CPI R25, $60
CALL comando BREQ cero1
RET CPI R25, $61
centrar4: ;igual BREQ uno1
LDI R21, $89 CPI R25, $62
CALL comando BREQ dos1
RET CPI R25, $63
centrar5: ;resultado BREQ tres1
LDI R21, $8B CPI R25, $64
CALL comando BREQ cuatro1
RET CPI R25, $65
BREQ cinco1
igual: CPI R25, $66
MOV R26, R23 BREQ seis1
CALL centrar4 CPI R25, $67
LDI R21, '=' BREQ siete1
CALL dato CPI R25, $68
CALL centrar5 BREQ ocho1
JMP sumar CPI R25, $69
BREQ nueve1
suma: CPI R25, $6A
CPI R20, $02 BRSH unob
BREQ igual
CPI R20, $03 sumar:
BREQ resultado INC R20
CPI R27, $01 ADD R25, R26
BREQ resultado CPI R25, $60
MOV R25, R23 BREQ cero1
MOV R28, R25 CPI R25, $61
CALL centrar3 BREQ uno1
LDI R21, '+' CPI R25, $62
CALL dato BREQ dos1
CALL espera1s CPI R25, $63
BREQ tres1 MOV R23, R21
CPI R25, $64 CBI PORTA, 1 ;rw en 0
BREQ cuatro1 OUT PORTB, R21
CPI R25, $65 SBI PORTA, 2 ; enable en 1
BREQ cinco1 CALL espera2ms
CPI R25, $66 CBI PORTA, 2 ;enable en 0
BREQ seis1 SWAP R21
CPI R25, $67 OUT PORTB, R21
BREQ siete1 SBI PORTA, 2; enable en 1
CPI R25, $68 CALL espera2ms
BREQ ocho1 CBI PORTA, 2
CPI R25, $69 RET
BREQ nueve1
CPI R25, $6A cambio: ;Interrupcion
BRSH unob INC R27
JMP sumar RETI
CKOPT: Este fusible selecciona entre dos modos de RET realiza un retorno de subrutina. La dirección de
amplificador del oscilador. Cuando esta programado el reloj retorno es cargada de la pila. El Stack Pointer (puntero de
es mas inmune al ruido y se pueden manejar un rango pila) utiliza durante el RET un esquema de post-
amplio de frecuencias, aunque con un consumo mayor de decremento.
portencia.
La diferencia entre RET y RETI es leve, porque ambos
EESAVE: La habilitación de este fusible genera que los toman la dirección de retorno de la pila. Lo que es diferente
datos en la memoria EEPROM no sean borrados cuando se es que RETI ('RETurn from Interrupt') libera las
realice una operación de borrado del microcontrolador. interrupciones del mismo nivel de prioridad que la
interrupción que ha causado la derivación, y RET (RETurn)
BOOTSZ1:0: Estos fusibles establecen el tamaño del no lo hace.
Bootloader.
C) Explique las instrucciones LPM y LD en qué se parecen
BOOTRST: Cuando este fusible es programado, el y en qué se diferencian.
dispositivo salta a la dirección de reset asignada con los
fusibles BOOTSZ1:0. Si no es programado, iniciara en la LD carga indirecta con Post-Incremento o Pre-
posición cero. Decremento
VI. REFERENCIAS