Hola a toda la comunidad!
Soy nuevo en este foro y también estoy empezando con la programación de AVR.
Antes de empezar les agradezco de antemano toda la ayuda que me puedan ofrecer y de igual forma tratare de ayudar en lo que pueda.
Pues veran, tengo el siguiente problema.
Yo programo un ATMEGA8 con AVRStudio en lenguaje assembler. En los últimos días he estado intentando programar un LCD de 16x2 pero hasta el momento solo me enciende y por más que vario el contraste no logro que me aparezca el texto.
Aquí dejo el programa:
;------------------------------- INICIO DE PROGRAMA
.include "m8def.inc"
.def temp = r16
.def argument = r17
.def return = r18
.equ DDRLCD = DDRD
.equ PORTLCD = PORTD
.equ PINLCD = PIND
.equ LCD_RS = 1
.equ LCD_E = 3
.equ LCD_RW = 2
.equ BF = 3
.org 0x00
rjmp reset
reset:
ldi temp,low(RAMEND)
nop
nop
cbi PORTLCD,LCD_E
cbi PORTLCD,LCD_RS
in temp,DDRLCD
cbr temp,0b11110000
out DDRLCD,temp
ret
LCD8bits:
in temp,DDRLCD
sbr temp,0b11110000
out DDRLCD,temp
in temp,PORTLCD
cbr temp,0b11110000
cbr argument,0b00001111
or temp,argument
out PORTLCD,temp
sbi PORTLCD,LCD_E
nop
nop
nop
cbi PORTLCD,LCD_E
in temp,DDRLCD
cbr temp,0b11110000
out DDRLCD,temp
ret
LCD_command:
push argument
in temp,DDRLCD
sbr temp,0b11110000
out DDRLCD,temp
in temp,PORTLCD
cbr temp,0b11111110
cbr argument,0b00001111
or temp,argument
out PORTLCD,temp
sbi PORTLCD,LCD_E
nop
nop
nop
cbi PORTLCD,LCD_E
pop argument
cbr temp,0b11110000
swap argument
cbr argument,0b00001111
or temp,argument
out PORTLCD,temp
sbi PORTLCD,LCD_E
nop
nop
nop
cbi PORTLCD,LCD_E
in temp,DDRLCD
cbr temp,0b11110000
out DDRLCD,temp
ret
LCD_getaddr:
in temp,DDRLCD
andi temp, 0b00001111
out DDRLCD,temp
cbi PORTLCD,LCD_RS
sbi PORTLCD,LCD_RW
sbi PORTLCD,LCD_E
nop
in temp,PINLCD
andi temp,0b11110000
mov return,temp
cbi PORTLCD,LCD_E
nop
nop
sbi PORTLCD,LCD_E
nop
in temp,PINLCD
andi temp,0b11110000
swap temp
or return,temp
cbi PORTLCD,LCD_E
cbi PORTLCD,LCD_RW
ret
LCD_wait:
rcall LCD_getaddr
andi return,0x80
brne LCD_wait
ret
LCD_delay:
clr r4
LCD_delay_outer:
clr r5
LCD_delay_inner:
dec r5
brne LCD_delay_inner
dec r4
brne LCD_delay_outer
ret
LCD_inicia:
ldi temp,0b00001111
out DDRLCD,temp
rcall LCD_delay
ldi argument,0x20
rcall LCD8bits
rcall LCD_wait
ldi argument,0x28
rcall LCD_command
rcall LCD_wait
ldi argument,0x0C
rcall LCD_command
rcall LCD_wait
ldi argument,0x01
rcall LCD_command
rcall LCD_wait
ldi argument,0x06
rcall LCD_command
ret
texto0:
.db "BIENVENIDO",0
texto1:
.db "Sistemas",0
;------------------------------- FIN DE PROGRAMA
Al cargarlo en el AVR, no me presenta errores el software por lo que estoy casi seguro de que la falla no esta en el programa sino en el LCD.
No se mucho sobre LCD y solo elabore el programa de acuerdo a la funcion de los 16 pines del LCD.
Si me pudieran rayudar con mi problema les agradeceria mucho.
De igual forma si pueden brindarme información sobre los AVR y LCD se los agradeceria.
En fin es todo por el momento.
GRACIAS