Witam. Programuję właśnie pulpit wyświetlacza.. albo raczej próbuję. Jestem w tym początkujący ale trochę się orientuję. Wyświetlacz jest w układzie pulpitu wyświetlającego komendy pochodzące od czujników, sterowany przez ATmege128, ale krótko.... nie trzeba się teraz nad tym rozpisywać. Porty mam na pewno podłączone dobrze, tzn.
RS PORTC->1
E PORTC->3
DB(4..7) PORTC->4..7
Pomijam R/W.
Także do samego wyświetlacza też wszystko jest podłączone jak trzeba.
Wykorzystuję na razie program napisany przez Pana R. Kwietnia.
Nie wiem tylko jak z tego zrobić, aby mój program obsługiwał wszystkie 4 linie, może wprowadzić adresowanie. Ogólnie po uruchomieniu inicjalizuje się wyświetlacz, pojawia się migający kursor w lewym górnym rogu i to wszystko. Poniżej zamieszczam soft, proszę o jakieś podpowiedzi albo ukierunkowania. (od razu powiem, że naprawdę długo szukałem na forum i takiej wskazówki nie znalazłem, tzn konkretnych wyjaśnień).
---------------------------------------------------------
RS PORTC->1
E PORTC->3
DB(4..7) PORTC->4..7
Pomijam R/W.
Także do samego wyświetlacza też wszystko jest podłączone jak trzeba.
Wykorzystuję na razie program napisany przez Pana R. Kwietnia.
Nie wiem tylko jak z tego zrobić, aby mój program obsługiwał wszystkie 4 linie, może wprowadzić adresowanie. Ogólnie po uruchomieniu inicjalizuje się wyświetlacz, pojawia się migający kursor w lewym górnym rogu i to wszystko. Poniżej zamieszczam soft, proszę o jakieś podpowiedzi albo ukierunkowania. (od razu powiem, że naprawdę długo szukałem na forum i takiej wskazówki nie znalazłem, tzn konkretnych wyjaśnień).
---------------------------------------------------------
#include <avr/io.h>
//
#define LCD PORTC
#define E 3
#define RS 1
//
#define SET_E LCD |= _BV(E)
#define CLR_E LCD &= ~_BV(E)
//
#define SET_RS LCD |= _BV(RS)
#define CLR_RS LCD &= ~_BV(RS)
// funkcja opóźniająca o x*1ms
void waitms(char x)
{
unsigned char a, b;
for( ; x > 0; --x)
for(b = 10; b > 0; --b)
for(a = 100; a > 0; --a)
__asm("nop"); // opóźnienie o 1 cykl
// razem to da opóźnienie ok. x * 1ms
// x od 0 do 255
}
// prcodedura zapisu bajtu do wyświetlacza LCD
// bez rozróżnienia instrukcja/dana
// najpierw zapisuje pierwszą połówkę bajtu, później drugą
void write_to_lcd(char x)
{
SET_E;
LCD = ((LCD & 0x0F) | (x & 0xF0));
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
SET_E;
LCD = ((LCD & 0x0F) | ((x & 0x0F)<<4));
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
waitms(1);
}
// procedura zapisu instrukcji do wyświetlacza LCD
void write_command(char x)
{
CLR_RS; // niski stan na RS -> zapis instrukcji
write_to_lcd(x); // zapis do LCD
}
// procedura zapisu danej do wyświetlacza LCD
void write_char(char x)
{
SET_RS; // wysoki stan na RS -> zapis danej
write_to_lcd(x); // zapis do LCD
}
// procedura zapisu tekstu do wyświetlacza LCD
void write_text(char * s)
{
while(*s) // do napotkania 0
{
write_char(*s); // zapisz znak wskazywany przez s na LCD
s++; // zwiększ s (przygotuj nastepny znak)
}
}
// procedura inicjalizacji wyświetlacza LCD
void lcd_init(void)
{
waitms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
CLR_E; // E = 0
CLR_RS; // RS = 0
char i; // zmienna licznikowa
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
{
SET_E; // E = 1
LCD &= 0x3F; //
CLR_E; // E = 0
waitms(5);
}
SET_E; // E = 1
LCD &= 0x2E; //
CLR_E; // E = 0
waitms(1); // czekaj 1ms
write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
write_command(0x08); // wyłącz LCD, kursor i miganie
write_command(0x01); // czyść LCD
write_command(0x06); // bez przesuwania w prawo
write_command(0x0C); // włącz LCD, bez kursora i mrugania
}
// program główny
int main(void)
{
// konfiguracja portów we/wy
DDRC = 0xff;
PORTC = 0xff;
// inicjalizacja LCD
lcd_init();
// zapisz na LCD przykładowy tekst
write_text("Ala ma kota");
// petla nieskończona
while(1);
return 0;
}