/* * File: main_wyswietlacz_LCD_16x2.c * Author: elektronikawsrode inspirowany ksiażką "Mikrokontrolery PIC w praktycznych zastosowaniach" Pawła Borkowskiego * hardware: PIC16F1827 i LCD 16x2 */ // PIC16F1827 Configuration Bit Settings // CONFIG1 #pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled) /* * podstawiając odpowiednie wartości rejestrów syfrowych wejść i wyjść(I/O), czyli rejestru TRIS i PORT dla odpowiednich portów * własnego mikrokontrolera (zobacz to w datasheet) uczynimy skrypt naprawdę uniwesalnym */ #define TRIS_RS_LCD TRISBbits.TRISB2 // podstaw własny bit rejestru TRIS poru I/O swojego PICa który podłączony jest do wyświetlacza na RS #define TRIS_EN_LCD TRISBbits.TRISB3 // podstaw własny bit rejestru TRIS poru I/O swojego PICa który podłączony jest do wyświetlacza na EN #define TRIS_DB4_LCD TRISBbits.TRISB4 // podstaw własny bit rejestru TRIS poru I/O swojego PICa który podłączony jest do wyświetlacza na DB4 #define TRIS_DB5_LCD TRISBbits.TRISB5 // podstaw własny bit rejestru TRIS poru I/O swojego PICa który podłączony jest do wyświetlacza na DB5 #define TRIS_DB6_LCD TRISBbits.TRISB6 // podstaw własny bit rejestru TRIS poru I/O swojego PICa który podłączony jest do wyświetlacza na DB6 #define TRIS_DB7_LCD TRISBbits.TRISB7 // podstaw własny bit rejestru TRIS poru I/O swojego PICa który podłączony jest do wyświetlacza na DB7 #define RS_LCD PORTBbits.RB2 // podstaw odpowiednie bit rejestru PORT twojego kontrolera podobnie jak wyżej #define EN_LCD PORTBbits.RB3 #define DB4_LCD PORTBbits.RB4 #define DB5_LCD PORTBbits.RB5 #define DB6_LCD PORTBbits.RB6 #define DB7_LCD PORTBbits.RB7 #include #include // potrzebne aby działały np. takie funkcje jak sprintf() #include "lcd16x2.h" // nasz plik nagłówkowy #define _XTAL_FREQ 18000000 // rezonator zewnętrzny jest na 18 MHz potrzebne jako odniesienie do makra __delay_ void main(void) { // pierwsza napis dla jednej lini char napis1[] = "Odliczanie"; // drugi napis dla drugiej lini char napis2[] = "Ka Bummm!!!"; // wyliczenie długości wyrazów int dlugosc1 = 0; int dlugosc2 = 0; // deklaracja zmiennych typu int dlugosc1 = sizeof(napis1) / sizeof(napis1[0])-1; // wyliczenie długości naspisu 1 (pomniejszone o 1 aby dobrze wpisywało się w liczenie tablicowe) dlugosc2 = sizeof(napis2) / sizeof(napis2[0])-1; // wyliczenie długości naspisu 2 (pomniejszone o 1 aby dobrze wpisywało się w liczenie tablicowe) char bufor[2]; // zmienna potrzebna do zmiany liczby na znak unsigned int i; // zmienna i do pętli for ANSELB = 0b00000000; //wyłączenie linii analogowych (wszystkie linie cyfrowe) WlaczLCD(); //inicjalizacja wyświetlacza LCD UstawKursorLCD(1, 2); //wiersz 1. kolumna 2. WyswietlLCD(napis1, dlugosc1); //wyświetl napis // odliczanie for(i=9; i>0; i--) { sprintf(bufor, "%d", i); // konwersja liczby na napis aby przyjęła go funkcja WyswietlLCD() UstawKursorLCD(1,15); //wiersz 1. kolumna 15. WyswietlLCD(bufor, 1); //wyświetl napis __delay_ms(1000); //zaczekaj 1 s } UstawKursorLCD(2, 4); //wiersz 2. kolumna 4. WyswietlLCD(napis2, dlugosc2); //wyświetl napis while(1); //pętla nieskończona }