Sterowanie wyświetlaczem przez USART
1. Cele
Opracować moduł umożliwiający komunikację z wyświetlaczem 16×1 przez USART. By wysłać dane na wyświetlacz należy wydać instrukcję informującą o rozpoczęciu transmisji „[„. Instrukcja „]” informuje mikrokontroler o zakończeniu danych przeznaczonych dla wyświetlacza. Dodatkowa instrukcja „#” pozwala na wyczyszczenie zawartości ekranu. Ponieważ wyświetlacz 16×1 podzielony jest na dwie części (po 8 znaków) mikrokontroler dba o poprawne przejście napisu na drugą połowę ekranu. W chwili zapełnienia znakami całego ekranu i otrzymania 17 znaku ekran jest czyszczony i 17 znak pojawia się jako 1 znak na ekranie.
2. Diagram wdrożenia
2.1 Komunikacja mikrokontrolera z komputerem PC
Mikrokontroler PIC16F84A komunikuje się z komputerem PC wykorzystując w tym celu port COM. Konieczne jest użycie układu MAX232 by dostosować napięcia TTL (5V) mikrokontrolera do standardu RS232 (12V) które występują na porcie COM.
Rys. 1 Komunikacja PIC16F84A z PC
2.2 Komunikacja mikrokontrolera z innym mikrokontrolerem
Mikrokontroler PIC16F84A komunikuje się z innym mikrokontrolerem wykorzystując do tego celu USART.
Rys. 2 Komunikacja PIC16F84A z innym uC
3. Schemat elektryczny
Rys. 3 Schemat elektryczny
4. Protokół transmisji danych
Tab. 1 Instrukcje sterujące
Kod ASCII | Instrukcja |
---|---|
[ | Rozpoczęcie odbioru danych |
] | Zakończenie odbioru danych |
# | Wyczyszczenie ekranu |
5. Algorytm programu
Rys. 4 Algorytm programu
6. Kod programu
/** * Wyswietlanie na LCD danych pobranych * przez USART. */ #include #fuses XT,NOPROTECT,NOWDT #use delay(clock=4000000) //RX RA2 PIN 1 //TX RA3 PIN 2 #use rs232(baud=300,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=9) #include "wlcd.c" main() { char c; char i=0; /* //Informacja o sterowaniu wyslana na rs232 printf("\fLCD OK\n"); printf("[ - begin\n"); printf("] - end\n"); printf("# - clear\n"); */ //inicjacja lcd lcd_init(); //napis testowy na lcd lcd_putc("\fLCD 2.2"); delay_ms(800); lcd_putc("\f"); //glowna petla programu for(;;){ //pobranie znaku z usart c = getc(); //komenda - czyszczenie wyswietlacza if (c=='#'){ i = 0; lcd_putc("\f"); } //komenda - rozpoczecie wyswietlania if (c == '['){ for(;;){ //pobranie znaku do wyswietlenia c = getc(); //jesli nie jest to znak konca transmisji dla wyswietlania, to znak na ekran if (c!=']'){ //jesli koniec linii (polowa ekranu) to przejscie na 2 polowe ekranu if (i==8){ lcd_putc("\n"); } //jesli koniec ekranu to zaczynamy od nowa if (i==16){ lcd_putc("\f"); i=0; } //dodanie znaku do wyswietlacza lcd_putc(c); i++; } //byl znak konca transmisji na wyswietlacz if (c==']') { break; } } } } }