Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

LCD, AVR, C i przejście do drugiej linii

seru1983
-
-
Posty: 1
Rejestracja: 20 kwie 2007, o 06:18
Lokalizacja: Białystok

LCD, AVR, C i przejście do drugiej linii

Postautor: seru1983 » 16 gru 2007, o 11:27

Mam problem z przejściem w LCD do następnej linii. Wyswietlacz 2x16, sterowanie 4bitowe. Nie powinien to być problem hardwarowy, gdyż pod Bascomem obsługuje mi dwie linie bez problemu. Tutaj, gdy wyśle komende 0x40 po napisie "Ala ma kota Very Happy" pojawia mi sie jakiś krzak i pierwsza litera drugiego zdania czyli "K". Gdy wysyłam komendę 0xC0, nic się nie dzieje. Kod programu:

Konfiguracja portu:
DB4- PORTC.0
DB5- PORTC.1
DB6- PORTC.2
DB7- PORTC.3
E- PORTC.4
RS- PORTC.5

Kod:

Kod: Zaznacz cały

#include <avr/io.h> // #define LCD PORTC #define E 4 #define RS 5 // #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; // zmnienne licznikowe for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy for(b = 10; b > 0; --b) // a ta 10 razy for(a = 100; a > 0; --a) // natomiast ta 100 razy __asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl // razem to da opóźnienie ok. x * 1ms // x od 0 do 255 } // pcodedura zapisu bajtu do wyświetlacza LCD // bez rozróżnienia instrukcja/dana void write_to_lcd(char x) { SET_E; LCD=(LCD & 0xF0) | (x >>4); CLR_E; SET_E; LCD=(LCD & 0xF0) | (x & 0x0F); CLR_E; waitms(1); // czekaj 1ms } // 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; // zmianna licznikowa for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji { LCD =0x3F;//&= 0x3F; // SET_E; // E = 1 waitms(5); CLR_E; // E = 0 waitms(5); // czekaj 5ms } LCD = 0x2E; // SET_E; // E = 1 waitms(5); 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) { DDRC = 0xFF; PORTC = 0xFF; lcd_init(); write_text("Ala ma kota :D"); write_command(0xc0); write_text("Kot ma AIDS"); while(1); return 0; }
Z góry dziękuję za pomoc![/code]

czopas
-
-
Posty: 3
Rejestracja: 18 maja 2005, o 20:44
Lokalizacja: Gdynia

Postautor: czopas » 3 sty 2008, o 21:39

Ja to rozwiązałem tak:

Kod: Zaznacz cały

/*** dla wyświetlacza 16*1 ***/ void x_lcd(unsigned char x) { if(x<8) write_command(x|0x80); else write_command((x+56)|0x80); } /*** dla wyświetlacza 16*2 ***/ void xy_lcd(unsigned char x, unsigned char y) { write_command((x*0x40+y)|0x80); }
Powinno pomóc :D

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 92 gości