Problema con LCD y pic 16f628a

Buenas chic@s,
Espero que habra este post de forma correcta,estoy haciendo un pequeño codigo para el manejo de un lcd que reproducta el texto "Introduzca Importe",bien hasta ahi me lo hace correctamente desplazandose de derecha a izquierda pero cuando finaliza la palabra importe me rellena con e todo el lcd del siguente modo: importeeeeeeeeee hasta que acaba y no se solventarlo llevo intentandolo tiempo y no encuentro el fallo:cabezon: entonces solicitaba una pequeña ayuda.tambien agradeciria si me indicases como una vez desplazado el texto de izquierda a derecha empezase a pintar por el otro lado para que hiciese el efecto de como si girase me supongo que sea jugando con la posicion de X e y del lcd,espero haberme explicado y os ajunto el codigo y el proyecto en Mplab 8.83 y el archivo en proteus.
gracias por todo es para un proyecto de clase (una makina de cafe con automatas finitos)

#include <16f628a.h>
#use delay(clock=4000000,restart_wdt)

void lcd_instruccion();//función para mandar una instrucción al lcd
void lcd_caracter(char *carac) ;//función para mandar un caracter al lcd
void lcd_gotoxy(int x,int y);//función para dirigirme a una posición en el lcd
void lcd_iniciar();//funcion para linea de comandos de inicio del lcd

void main()
{
char cadena[20],nCont=0,str[20];
strcpy(cadena,"Introduzca importe");//pasamos a cadena "introduzca importe
strcpy(str,cadena);//hacemos copia de cadena en str
set_tris_a(0);//Configuramos el puerto como salida
lcd_iniciar();//llamamos a la funcion de comando de inicio lcd

while(true)
{
lcd_gotoxy(1,1);//Nos posicionamos en la posicion 1 del eje x e Y de lcd
lcd_caracter(str);//Pasamos nuestro texto a imprimir con la funcion de impresion
delay_ms(100);//Retardo de 100ms
nCont++;//Iniciamos contador para impresion
strcpy(str,&cadena[nCont]);///pasamos el contenido de la cadena determinado por el cont

if(nCont>20)//Bucle de cuenta maximo
nCont=0;//Iniciamos contardor a 0
}
}

void lcd_instruccion() //función para mandar una instrucción al lcd
{
set_tris_b(0x00);//configuramos puerto como salida
output_a(0x00);//sacamos por el puerto a completo el valor 0
delay_cycles(10);
output_a(0x04);//habilitamos pantalla, bit enable es negado!!
delay_ms(2);
}

void lcd_caracter(char *carac) //función para mandar un caracter al lcd
{
set_tris_b(0x00);//configuramos puerto como salida
do {
output_b(*carac);//mandamos por el puerto la primera posicion de la array cadeana
output_a(0x01);
delay_cycles(10);
output_a(0x04); //habilitamos pantalla, bit enable es negado!!
delay_ms(2);
carac++;//Incremento de la letras a imprimir
}
while(*carac!=0);//Bucle de impresion entre 0 y 18
}

void lcd_gotoxy(int x,int y) //función para dirigirme a una posición en el lcd
{
set_tris_b(0x00);//configuramos puerto como salida
if(y>=3) //si y es mayor a dos, la línea por defecto es uno
{
y=1;
}

if(x>40)
{
x=1;
}

if(y==1) //si y es uno, la linea es uno
{
output_b(0x80+(x-1));
lcd_instruccion();//se llama a función para mandar una instrucción al lcd
}

if(y==2) //si y es dos, la linea es dos
{
output_b(0xC0+(x-1));
lcd_instruccion();//se llama a función para mandar una instrucción al lcd
}
}

void lcd_iniciar() //funcion para linea de comandos de inicio del lcd
{
set_tris_b(0x00);

output_b(0x30); //bus de 8 bits
lcd_instruccion();
output_b(0x38); //lcd a dos lineas (toca por separado) "por defecto"
lcd_instruccion();
output_b(0x0c); //encendido de pantalla, cursor off, sin parpadeo "por defecto"
lcd_instruccion();
output_b(0x06); //desplazamiento del cursor a la derecha display quieto "por defecto"
lcd_instruccion();
}
 

Adjuntos

  • manejo lcd.rar
    35.2 KB · Visitas: 26
Atrás
Arriba