Wydział Informatyki Katedra Systemów Czasu Rzeczywistego Laboratorium Architektury Komputerów |
Data 28.10.2009 |
Ćwiczenie nr 3 Temat: Oprogramowanie wyświetlacza LCD z wykorzystaniem kontrolera Hitach HD 44780. Zespół nr 2 1. Robert Jarocki Grupa nr 6 2. Jarosław Jastrzębski |
Prowadzący …...................... Ocena …...................... |
ZADANIE 3
W zadaniu należy wyświetlić napis składający się z 5 liter w taki sposób aby przechodził jednej linii- lewej do drugiej- prawej. Jak napis dojdzie do końca prawej krawędzi LCD powinien się zatrzymać.
Rozwiązanie :
Rozwiązaliśmy problem programując w odpowiedni sposób płytkę EasyWeb2 w środowisku IAR w języku C.
Kod:
#include<msp430x14x.h>
#include "lcd.h"
#include "portyLcd.h"
unsigned char i,j;
unsigned char z,k,m,w,y;
void main( void )
{
z='A';
k='B';
m='C';
w='D';
y='E';
P2DIR |= BIT1; // STATUS LED
WDTCTL=WDTPW+ WDTHOLD; // zatrzymanie WDT
InitPortsLcd(); // inicjalizacja portów
InitLCD(); // inicjalizacja LCD
clearDisplay(); // czyszczenie LCD
SEND_CHAR(z);
SEND_CHAR(k);
SEND_CHAR(m);
SEND_CHAR(w);
SEND_CHAR(y);
clearDisplay();
SEND_CMD(DD_RAM_ADDR2);
SEND_CHAR(z);
SEND_CHAR(k);
SEND_CHAR(m);
SEND_CHAR(w);
SEND_CHAR(y);
;
for (i=0;i<11;i++)
{
SEND_CMD(DATA_ROL_RIGHT); // przesuwanie napisu w lewo
Delayx100us(150); // opóźnienie
}
SEND_CMD(DD_RAM_ADDR); // opóźnienie
while (1) // nieskoñczona pętla
{
P2OUT ^=BIT1; // zmiana stanu diody na przeciwny
}
}
Opis działania:
Na początku rozwiązania całego zadania dodaliśmy potrzebną bibliotekę- „msp430x14x.h” oraz pliki odpowiedzialne za poprawne działanie programu „lcd.h”, który zawiera następujące funkcje:
void InitLCD(void);
void clearDisplay();
void SEND_CHAR (unsigned char c);
void SEND_CMD (unsigned char e);
void MAKE_DEFINED_CHAR(unsigned char c);
void Delayx100us(unsigned char b);
oraz plik „portyLcd.h” zawierający potrzebne definicje komend wyświetlacza:
#define LCD_Data P2OUT
#define _100us 100 //
#define _10us 10 //
#define E 3 //P2.3
#define RS 2 //P2.2
#define CLR_DISP 0x01 // clear display
#define CUR_HOME 0x02 // return home
#define ENTRY_INC 0x06 // entry mode increment
#define ENTRY_INC_ROL 0x07 // entry mode increment with rol data
#define ENTRY_DEC 0x04 // entry mode decrement
#define ENTRY_DEC_ROL 0x05 // entry mode decrement witch rol dat
#define DISP_OFF 0x08 // all display off
#define DISP_ON 0x0c // all display on
#define DATA_ROL_LEFT 0x18 // rol data left
#define DATA_ROL_RIGHT 0x1c // rol data right
#define CUR_SHIFT_LEFT 0x10 // shift coursor left
#define CUR_SHIFT_RIGHT 0x14 // shift coursor right
#define DD_RAM_ADDR 0x80 // set DD_RAM
#define DD_RAM_ADDR2 0xc0 // set CG_RAM
#define DD_RAM_ADDR3 0x28
#define CG_RAM_ADDR 0x40
void InitPortsLcd(void);
Następnie zadeklarowaliśmy potrzebne zmienne- „i” potrzebne do pętli for aby móc przesuwać napis, oraz zmienne „z, k, m, w, y”, które przechowują poszczególne litery, kolejno od A do E. Kolejnym podjętym przez nas krokiem było ustawienie portu P2DIR |= BIT1, dzięki czemu dioda statusu będzie nam się świeciła podczas działania programu. Po zainicjalizowaniu portow LCD oraz wyświetlacza funkcjami InitPortsLcd ( ) i InitLCD ( ) kazaliśmy naszemu programowi wysłać zadeklarowane znaki poprzez SEND_CHAR ( ). Na końcu napisaliśmy dwie pętle- pierwsza jest odpowiedzialna za przesuwanie napisu w prawą strone i zatrzymanie go, gdy dojdzie do końca, druga zaś za ciągłe świecenie się diody status.