Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
4.5 kB
2
Indexable
Never
#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;
}
Leave a Comment