Вы находитесь на странице: 1из 6

; ******************************************************

; Inicio 26/05/2010
; 26/05/10: manejo de LCD con ATMEGA16
; ******************************************************
.include "C:\VMLAB\include\m16def.inc"
; Define here the variables
;
.def temp =R16
.def dato_lcd = R17
; Define here Reset and interrupt vectors, if any
;
reset:
rjmp start
reti
; Addr $01
reti
; Addr $02
reti
; Addr $03
reti
; Addr $04
reti
; Addr $05
reti
; Addr $06
Use 'rjmp myVector'
reti
; Addr $07
to define a interrupt vector
reti
; Addr $08
reti
; Addr $09
reti
; Addr $0A
reti
; Addr $0B
This is just an example
reti
; Addr $0C
Not all MCUs have the same
reti
; Addr $0D
number of interrupt vectors
reti
; Addr $0E
reti
; Addr $0F
reti
; Addr $10
; Program starts here after Reset
;
start:
ldi R16, HIGH(RAMEND) ; Inicializacin de pila
out SPH, R16
; Stack pointer initialization
ldi R16, LOW(RAMEND)
out SPL, R16
rcall conf_port ; configura puertos
rcall ini_LCD
; inicializa LCD
rcall clr_LCD
; reset LCD
rcall r_50ms
ldi ZH, HIGH(msj_1*2) ; Apunta a msj_1
ldi ZL, LOW(msj_1*2)
rcall envia_msj

forever:
nop
nop
; Infinite loop.
nop
; Define your main system
nop
; behaviour here
rjmp forever
; ******************************************************
; CONFIGURACION DE PUERTOS
; LCD : PB0..7 + PC0, PC1y PC6
; ******************************************************
conf_port:
ldi R16, 0b11111111 ; LCD
out DDRC, R16
; PINES DE CONTROL RS, RW Y ENABLE
ldi R16, 0b11111111 ; LCD
out DDRB, R16
; PINES DE DATOS
ret
; ******************************************************
; CONFIGURACION LCD
; ******************************************************
ini_LCD:
ldi dato_lcd, 0b00111100 ; dos lneas, DISPLAY on
rcall envia_ir
rcall r_15u
ldi dato_lcd, 0b00001111 ; Display ON, cursor ON,
rcall envia_ir
; Blink ON (parpadeo del cursor)
rcall r_15u
ldi dato_lcd, 0b00000001
rcall envia_ir
rcall r_15u
ldi dato_lcd, 0b00000110 ; modo incremental: el cursor se mueve a la derecha
rcall envia_ir
; y la direeccin de memoria aumenta en 1
ret
; ******************************************************
; ENVIA INSTRUCCION AL LCD
; ENTRADA R17= dato-lcd
; PC0..1= RS; RW, PC6= E
; RS='0'; RW='0';
; ******************************************************
envia_ir:
ldi R16,0
out PORTC, R16 ; RS='0', RW='0', E='0'
nop
sbi PORTC,6 ; E='1'
nop
out PORTB, dato_lcd ;
rcall r_15u

cbi PORTC,6
; E='0'
nop
ret
;*******************************************************
; ENVIA DATO AL LCD - send data to LCD
; PC0..1= RS; RW, PC6= E
; RS='1'; RW='0';
; Entrada: dato-lcd (required input)
;*******************************************************
envia_dr:
ldi R16,0
out PORTC, R16 ; RS='0', RW='0', E='0'
nop
sbi PORTC, 6
; E='1'
nop
sbi PORTC, 0
; RS='1'
nop
out PORTB, dato_lcd
rcall r_15u
cbi PORTC, 6
; E='0'
cbi PORTC, 0
; Rs='0'
nop
ret
; ******************************************************
; ENVIA MSJ AL LCD
; ENTRADA: DIRECCIN DEL MENSAJE A MOSTRAR
; NECESITA CARGAR ANTES LA DIRECCION DEL MENSAJE EN Z
; ******************************************************
envia_msj:
lpm dato_lcd, Z+
; carga dato de mensaje
cpi dato_lcd,'*'
; Indicador de cambio de lnea
breq sec_line
cpi dato_lcd, 0
; Indicador de fin de mensaje
breq end_envia_msj
rcall envia_dr
rjmp envia_msj
sec_line:
ldi dato_lcd, 0b11000000
rcall envia_ir
rjmp envia_msj
end_envia_msj:
ret
; ******************************************************
; LIMPIA LCD
; COLOCA PUNTERO AL INICIO DE PANTALLA
; ******************************************************

clr_lcd:
push R16
in R16, SREG
push R16
ldi dato_lcd,$01
rcall envia_ir

; instruccin para limpiar pantalla

pop R16
out SREG, R16
pop R16
ret
; ******************************************************
; RETARDO 15us
; REGISTRO MODIFICADO NINGUNO
; ******************************************************
r_15u:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
ret
; ******************************************************
; RETARDO 100us
; REGISTRO MODIFICADO NINGUNO
; ******************************************************
r_100u:
push R16
in R16, SREG
push R16
ldi R16,25
lazo_r_100u:
dec R16
brne lazo_r_100u
pop R16
out SREG, R16
pop R16
ret
; ******************************************************

; RETARDO 50 ms
; REGISTRO MODIFICADO NINGUNO
; ******************************************************
r_50ms:
push R16
in R16, SREG
push R16
push R18
ldi R18,60
lazo0_r_50ms:
ldi R16,$FF
lazo1_r_50ms:
dec R16
brne lazo1_r_50ms
dec R18
brne lazo0_r_50ms
pop R18
pop R16
out SREG, R16
pop R16
ret
; ******************************************************
; RETARDO 300 ms
; REGISTRO MODIFICADO ninguno
; ******************************************************
r_300ms:
push R16
in R16, SREG
push R16
push R18
rcall r_50ms
rcall r_50ms
rcall r_50ms
rcall r_50ms
rcall r_50ms
rcall r_50ms
pop R18
pop R16
out SREG, R16
pop R16
ret
; ******************************************************
; RETARDO 1s
; REGISTRO MODIFICADO NINGUNO

; ******************************************************
r_1s:
push R16
in R16, SREG
push R16
push R18
push R19
ldi R19,6
lazo2_r_1s:
ldi R18,$FF
lazo0_r_1s:
ldi R16,$FF
lazo1_r_1s:
dec R16
brne lazo1_r_1s
dec R18
brne lazo0_r_1s
dec R19
brne lazo2_r_1s
pop R19
pop R18
pop R16
out SREG, R16
pop R16
ret
; ******************************************************
; TABLAS Y MENSAJES
; ******************************************************
msj_1:
.dB "Hola",'*',"Mundo",0

Вам также может понравиться