Aktualizacja: 2012-07-13

Sterowanie wyświetlaczem przez USART

1. Cele

Opracować moduł umożliwiający komunikację z wyświetlaczem 16x1 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 16x1 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 <16F84.h>
#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;
}
}
}
}
}
 

Wyślij komentarz