/* * File: main_wyswietlacz_LCD_16x2_odczyt_z_AD.c * Author: elektronika w ¶rode inspirowany ksiażk± "Mikrokontrolery PIC w praktycznych zastosowaniach" Pawła Borkowskiego * hardware: PIC16F1827 i LCD 16x2 */ // PIC16F1827 Configuration Bit Settings // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #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 jest na 18 MHz potrzebne jako odniesienie do makra __delay_ void main(void) { TRISAbits.TRISA0=1; //wej¶cie ANSELAbits.ANSA0=1; //analogowe // ADCON1=0b11010000; // poniżej jest to samo rozpisane na bity ADCON1bits.ADFM = 1; // justowanie w prawo w rejestach ADRESH i ADRESL ADCON1bits.ADCS = 0b101; // ustawienie zegara nie może bnyć za szybki dlatego FOSC/16 ADCON1bits.ADPREF = 0b00; // napięcie Vdd jako referencja //ADCON0=0b00000001; // poniżej jest to samo rozpisane na bity ADCON0bits.CHS = 0b00000; // wybór AN0 jako kanału ADCON0bits.ADON = 1; // uruchomienie przetwornika ADC ANSELB = 0b00000000; //wył±czenie linii analogowych (wszystkie linie cyfrowe) // pierwsza napis dla jednej linii char napis1[] = "Pomiar:"; // drugi napis dla drugiej lini // char napis2[] = ""; nie używany // wyliczenie długo¶ci wyrazów int dlugosc1 = 0; // deklaracja zmiennych typu int // int dlugosc2 = 0; nie uzywany int dlugosc_bufor = 0; 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; nie używany char bufor[8]; // zmienna potrzebna do zmiany liczby na znak WlaczLCD(); //inicjalizacja wy¶wietlacza LCD UstawKursorLCD(1, 2); //wiersz 1. kolumna 2. WyswietlLCD(napis1, dlugosc1); //wyświetl napis unsigned int result=0; unsigned int result_bis = 0; while(1){ int ilosc_cyfr_w_result = 0; // zmienna potrzebna do wylicznia ile cyfr jest w liczbie result // odczyt wartości z przetwornika ADC ADCON0bits.GO_nDONE = 1; // ustawienie bitu aby przetwornik wystartował while (ADCON0bits.GO_nDONE); // gdy pomiar zostanie wykonany pętla się skończy result = ((unsigned int) ADRESH << 8) | ADRESL; // i rezultat zostanie zapisany w ADRESH i ADRESL, które zostan± przepisane do zeminne result, najpierw ADRSHzpsyanie przesuniety ,w result o 8 bitów, aby zwolnić miejsce dla ADRESL, dlatego justowanie było do prawej result = result_bis =result *5; while (result_bis > 0) { // pętla licząca ilość cyfr w result result_bis /= 10; ilosc_cyfr_w_result++; } sprintf(bufor, "%d", result); // konwersja liczby na napis aby przyjęła go funkcja WyswietlLCD() dlugosc_bufor = sizeof(bufor) / sizeof(bufor[0])-1; // konieczne, ponieważ kompilator którego używamy XC8 nie pozwala zainicjować tablicy za pomocą zmiennej (linia 76) // tam gdzie nie ma cyfr powinny być spacje for (int i=ilosc_cyfr_w_result; i < dlugosc_bufor; i++){ bufor[i] = ' '; } UstawKursorLCD(2, 2); WyswietlLCD(bufor, dlugosc_bufor); //wyświetl napis } }