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;
           }
        }
     }
  }
}