Mam problem z programem do obsługi lcd. Napisałem całość i niby wszystko gra, program się kompiluje a na wyświetlaczu jest tylko podświetlenie. Dodam że sterowanie jest 8-bitowe bez odczytu flagi zajętości (R/W zwarty do masy, regulacja kontrastu również)
Linia danych podłączona do portu C. Kto tu widzi jakiś błąd?
Dodano po 12 [minuty]:
Wziąłem przed chwilą miernik do ręki i na wyjściu portu rzeczywiście jest stan odpowiadający "dużej literze A". Więc wyświetlacz dostaje informację co ma wyświetlić ale tego nie robi.
Może problem tkwi w konfiguracji?
#include <avr/io.h>
#include<util/delay.h>
#define LCD PORTC
#define SET_E PORTD|=0x40 //ustawienie bitu 6 portu D pod któty podpięty jest Enable signal
#define CLR_E PORTD^=0x40 //wyzerowanie bitu 6 portu D pod któty podpięty jest Enable signal
#define SET_RS PORTD|=0x80 //ustawienie bitu 7 portu D pod któty podpięty jest Register select (wysoki stan na RS -> zapis danej)
#define CLR_RS PORTD^=0x80 //wyzerowanie bitu 7 portu D pod któty podpięty jest Register select (niski stan na RS -> zapis instrukcji)
//-----------------------------------------wysłanie danych do LCD---------------------------------------------------
void zapis_do_lcd(char x)
{
SET_E; //ustawienie E w stan wysoki
LCD=x; // wysłanie bajtu na port danych wyświetlacza
CLR_E; //ustawienie E w stan niski -> zapis do wyświetlacza
_delay_ms(1); // opużnienie na zapamiętanie bajtu
}
//-------------------------------------------zapis instrukcji do LCD----------------------------------------------------
void zapis_instrukcji(char x)
{
CLR_RS; // niski stan na RS odpowiada zapisowi instrukcji
zapis_do_lcd(x); // zapis do LCD
}
//------------------------------------zapis danej do wyświetlacza LCD-------------------------------------------
void zapis_danej(char x)
{
SET_RS; // wysoki stan na RS odpowiada zapisowi danej
zapis_do_lcd(x); // zapis do LCD
}
//----------------------------------zapis tekstu do wyświetlacza LCD------------------------------------------
void zapis_tekstu(char * s)
{
while(*s) // pętla trwa do napotkania 0
{
zapis_danej(*s); // zapisz znak wskazywany przez "s" na LCD
s++; // zwiększ s (przygotuj nastepny znak)
}
}
//----------------------------------inicjalizacja wyświetlacza LCD---------------------------------------------
void lcd_inicjal(void)
{
char i;
_delay_ms(15);// opuźnienie dla ustabilizowania się napięcia
CLR_RS;
CLR_E;
for(i = 0; i < 3; i++)
{
SET_E;
LCD=0x30;
CLR_E;
_delay_ms(5);
}
zapis_instrukcji(0x38); // interfejs 8-bity, 2-linie, znak 5x7
zapis_instrukcji(0x0F); //wyłączenie LCD, kursora i migania
zapis_instrukcji(0x01); // czyszczenie wyświetlacza
zapis_instrukcji(0x06); // kursor przesówa się w prawo
}
//----------------------------------program główny-----------------------------------------------------
int main(void)
{
DDRC=0xff;
DDRD=0xff;
// inicjalizacja LCD
lcd_inicjal();
// zapisz na LCD przykładowy tekst
zapis_tekstu("A");
while(1);
return 0;
}Linia danych podłączona do portu C. Kto tu widzi jakiś błąd?
Dodano po 12 [minuty]:
Wziąłem przed chwilą miernik do ręki i na wyjściu portu rzeczywiście jest stan odpowiadający "dużej literze A". Więc wyświetlacz dostaje informację co ma wyświetlić ale tego nie robi.
Może problem tkwi w konfiguracji?