Untitled
unknown
plain_text
a year ago
4.5 kB
5
Indexable
#include "xc.h" #include <libpic30.h> // Definicja makr tak by kod by? czytelny, przejrzysty, deskryptywny i przyjazny u?ytkownikowi #define FCY 4000000UL // cz?stotliwo?? robocza oscylatora jako po?owa cz?stotliwo?ci (FNOSC = FRC -> FCY = 4000000) // Zdefiniowanie poszczególnych pingów jako odpowiednie makra #define LCD_E LATDbits.LATD4 #define LCD_RW LATDbits.LATD5 #define LCD_RS LATBbits.LATB15 #define LCD_DATA LATE // Przypisanie warto?ci poszczególnych komend do w?a?ciwych makr #define LCD_CLEAR 0x01 //0b00000001 #define LCD_HOME 0x02 //0b00000010 #define LCD_ON 0x0C //0b00001100 #define LCD_OFF 0x08 //0b00001000 #define LCD_CONFIG 0x38 //0b00111000 #define LCD_CURSOR 0x80 //0b10000000 #define LINE1 0x00 #define LINE2 0x40 #define LCD_CUST_CHAR 0x40 //0b01000000 #define LCD_SHIFT_R 0x1D //0b00011100 #define LCD_SHIFT_L 0x1B //0b00011000 // Definicja funkcji delay w us i ms - operuj?cych na jednostkach czasu zamiast cykli pracy oscylatora void __delay_us(unsigned long us){ __delay32(us*FCY/1000000); } void __delay_ms(unsigned long ms){ __delay32(ms*FCY/1000); } // Definicja funkcji wysy?aj?cych komendy (RS = 0) i dane (RS = 1) za pomoc? magistrali równoleg?ej (LCD_DATA). Znaki i komendy maj? 8 bitów! void LCD_sendCommand(unsigned char command){ LCD_RW = 0; // Zapis LCD_RS = 0; // Przesy?anie komend LCD_E = 1; // Otwarcie transmisji danych LCD_DATA = command; __delay_us(50); // Opó?nienie konieczne dla zapisania danych. LCD_E = 0; // Konieczne zablokowanie transmisji po przes?aniu komunikatu. } void LCD_sendData(unsigned char data){ LCD_RW = 0; LCD_RS = 1; // Przesy?anie danych LCD_E = 1; LCD_DATA = data; __delay_us(50); LCD_E = 0; } // Funkcja print wy?wietlaj?ca kolejne 8-bitowe znaki w p?tli while, * oznacza przypisanie nie warto?ci zmiennej lecz jej adresu. void LCD_print(unsigned char* string){ while(*string){ LCD_sendData(*string++); } } // Funkcja ustawiaj?ca kursor w wybranym miejscu void LCD_setCursor(unsigned char row, unsigned char col){ unsigned char address; if (row == 1){ address = LCD_CURSOR + LINE1 + col; } if (row == 2){ address = LCD_CURSOR + LINE2 + col; } LCD_sendCommand(address); } // Funkcja ZAPISUJ?CA znak (zmienna array) do PAMI?CI CGRAM na wybranym slocie od 0 do 7 void LCD_saveCustChar(unsigned char slot, unsigned char *array) { unsigned char i; LCD_sendCommand(LCD_CUST_CHAR + (slot*8)); for(i=0;i<8;i++){ LCD_sendData(array[i]); } } // Wybór znaku do wy?wietlenia z tablicy void LCD_displayCharacter(unsigned char characterCode) { LCD_sendData(characterCode); } // Funkcja inicjalizuj?ca wy?wietlacz LCD. Wysy?a niezb?dne komendy jak LCD_CONFIG i LCD_ON void LCD_init(){ __delay_ms(20); LCD_sendCommand(LCD_CONFIG); __delay_us(50); // opó?nienia wynikaj? ze specyfikacji wy?wietlacza i czasu przetwarzania poszczególnych komend LCD_sendCommand(LCD_ON); __delay_us(50); LCD_sendCommand(LCD_CLEAR); __delay_ms(2); } // Zdefiniowanie znaku niestandardowego w postaci tablicy 8x5 (8 linii po 5 kropek) // Zdefiniowanie kolejnych symboli unsigned char symbol1[8] = { 0b00110, 0b01010, 0b01110, 0b11110, 0b01110, 0b01010, 0b00110, 0b00000 }; unsigned char symbol2[8] = { 0b01110, 0b10001, 0b11111, 0b10101, 0b10001, 0b11111, 0b10001, 0b01110 }; int main(void) { TRISB = 0x7FFF; // Ustawienie rejestrów kierunku TRISD = 0x0000; TRISE = 0x0000;\ // Zapisanie symboli do pami?ci CGRAM LCD_saveCustChar(0, symbol1); LCD_saveCustChar(1, symbol2); // Mrugaj?cy tekst for (int i = 0; i < 3; i++) { // Pierwsza linia LCD_setCursor(1, 0); for (int j = 0; j < 3; j++) { LCD_sendData(0); // Wy?wietlanie symbolu 1 z pami?ci CGRAM } LCD_print(" Wind "); for (int j = 0; j < 3; j++) { LCD_sendData(0); // Wy?wietlanie symbolu 1 z pami?ci CGRAM } // Druga linia LCD_setCursor(2, 0); for (int j = 0; j < 3; j++) { LCD_sendData(1); // Wy?wietlanie symbolu 2 z pami?ci CGRAM } LCD_print(" Breaker "); for (int j = 0; j < 3; j++) { LCD_sendData(1); // Wy?wietlanie symbolu 2 z pami?ci CGRAM } __delay_ms(500); // Opó?nienie LCD_sendCommand(LCD_CLEAR); // Wyczyszczenie ekranu __delay_ms(500); // Opó?nienie } return 0; }
Editor is loading...
Leave a Comment