Estoy aprendiendo la interconexión de Atmega 16a con 16X2 LCD. He escrito un archivo de encabezado para las rutinas que se usan con frecuencia y cada vez que quiero conectarme con la pantalla LCD utilizando Atmega 16a, uso este archivo de encabezado.
aquí está mi archivo de cabecera LCD:
#include<stdlib.h>
#include<avr/io.h>
#include<util/delay.h>
int cx=1;
int cy=1;
void LCD_Send(unsigned char c,unsigned char DC)
{
if(DC==0)
{
PORTC=0x0F & (c>>4);
PORTC=PORTC|(1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
PORTC=0x0F & (c);
PORTC=PORTC | (1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
}
else if(DC==1)
{
PORTC=0x0F & (c>>4);
PORTC=PORTC | (1<<7);
PORTC=PORTC|(1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
PORTC=0x0F & (c);
PORTC=PORTC | (1<<7);
PORTC=PORTC | (1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
}
return ;
}
void LCD_init(void)
{
DDRC=0b11101111;
LCD_Send(0x01,0);
LCD_Send(0x0F,0);
LCD_Send(0x28,0);
cx=1;cy=1;
return ;
}
void LCD_Send_String(char* s)
{
for(int i=0;s[i]!='#include"lcd.h"
int main(void)
{
LCD_init();
char s[20]="1234567890123456789";
LCD_Send_String(s);
return 0;
}
';i++)
{
LCD_Send(s[i],1);
if(cx==16)
{
cx=1;cy++;
LCD_Send(0xC0,0);
}
else
cx++;
}
return ;
}
void LCD_GotoXY(unsigned int x,unsigned int y)
{
if(y==1)
{
char addr=0x80;
addr=addr+(x-1);
LCD_Send(addr,0);
}
else if(y==2)
{
char addr=0xC0;
addr=addr+(x-1);
LCD_Send(addr,0);
}
cx=x; cy=y;
return ;
}
void LCD_Print(int data,unsigned int x,unsigned int y)
{
char string[10];
LCD_GotoXY(x,y);
itoa(data,string,10);
LCD_Send_String(string);
return ;
}
Aquí, RS, R / W y E son PC7, PC6 y PC5 respectivamente, DB4, DB5, DB6, DB7 son PC0, PC1, PC2, PC3 respectivamente. Estoy usando el modo de 4 bits para la entrada.
aquí está mi archivo main.c (el código que se ejecutará en el microprocesador):
#include<stdlib.h>
#include<avr/io.h>
#include<util/delay.h>
int cx=1;
int cy=1;
void LCD_Send(unsigned char c,unsigned char DC)
{
if(DC==0)
{
PORTC=0x0F & (c>>4);
PORTC=PORTC|(1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
PORTC=0x0F & (c);
PORTC=PORTC | (1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
}
else if(DC==1)
{
PORTC=0x0F & (c>>4);
PORTC=PORTC | (1<<7);
PORTC=PORTC|(1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
PORTC=0x0F & (c);
PORTC=PORTC | (1<<7);
PORTC=PORTC | (1<<5);
_delay_ms(1);
PORTC=PORTC & (~(1<<5));
_delay_ms(1);
}
return ;
}
void LCD_init(void)
{
DDRC=0b11101111;
LCD_Send(0x01,0);
LCD_Send(0x0F,0);
LCD_Send(0x28,0);
cx=1;cy=1;
return ;
}
void LCD_Send_String(char* s)
{
for(int i=0;s[i]!='#include"lcd.h"
int main(void)
{
LCD_init();
char s[20]="1234567890123456789";
LCD_Send_String(s);
return 0;
}
';i++)
{
LCD_Send(s[i],1);
if(cx==16)
{
cx=1;cy++;
LCD_Send(0xC0,0);
}
else
cx++;
}
return ;
}
void LCD_GotoXY(unsigned int x,unsigned int y)
{
if(y==1)
{
char addr=0x80;
addr=addr+(x-1);
LCD_Send(addr,0);
}
else if(y==2)
{
char addr=0xC0;
addr=addr+(x-1);
LCD_Send(addr,0);
}
cx=x; cy=y;
return ;
}
void LCD_Print(int data,unsigned int x,unsigned int y)
{
char string[10];
LCD_GotoXY(x,y);
itoa(data,string,10);
LCD_Send_String(string);
return ;
}
Cuando flasheo la memoria con el archivo HEX y luego reinicio, la pantalla LCD se muestra bien
Luego,cuandoreinicio,luegosemuestranlasvariablesaleatorias(dehechopuedoverquelasegundalíneanocambiaenabsoluto,significaquelapantallanoseborraperoseescribióuncomandoenLCD_init()
paraborrarlapantalla)
Estoy bastante seguro de que no hay ningún problema con la placa y las conexiones porque funciona con otros archivos de encabezado, estoy bastante seguro de que hay un error en mi código. Realmente agradecería si alguien me ayudara a arreglar este código. Si vuelvo a restablecer, muestra la secuencia correcta como en la primera imagen