Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
10 kB
5
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#include <libpic30.h>
#include <math.h>


#include "adc.h"
#include "buttons.h"
#include "xc.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 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);
}

void uruchomprogram(int program){
    if(program == 1){
            unsigned char minutes = 0;
            unsigned char secs = 0;
            int czas_dla_prog1;

            while(1){
                LCD_setCursor(1,0);
                LCD_print("podaj czas");
                LCD_setCursor(2,0);
                czas_dla_prog1 = ADC_Read10bit(ADC_CHANNEL_POTENTIOMETER);

                if (czas_dla_prog1 == 0xFFFF) {
                    continue;
                }

                minutes = czas_dla_prog1 / 60;
                secs = czas_dla_prog1 % 60;
                LCD_print(minutes);
                LCD_setCursor(2,3);
                LCD_print(":");
                LCD_setCursor(2,5);
                LCD_print(secs);
                if(BUTTON_IsPressed(BUTTON_S5)) break;
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                __delay_ms(1000);
                if(BUTTON_IsPressed(BUTTON_S5)) break;
            }

            while(1){
                LCD_setCursor(1,0);
                LCD_print("podaj moc");
                LCD_setCursor(2,0);
                int moc1 = ADC_Read10bit(ADC_CHANNEL_POTENTIOMETER) / 100;

                if (moc1 == 0xFFFF) {
                    continue;
                }
                moc1 = moc1 * 100;
                LCD_print(moc1);

                if(BUTTON_IsPressed(BUTTON_S5)) break;
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                __delay_ms(1000);
                if(BUTTON_IsPressed(BUTTON_S5)) break;
            }

            while(1){
                LCD_setCursor(1,0);
                LCD_print("pozostalo");
                LCD_setCursor(2,0);

                minutes = czas_dla_prog1 / 60;
                secs = czas_dla_prog1 % 60;
                LCD_print(minutes);
                LCD_setCursor(2,3);
                LCD_print(":");
                LCD_setCursor(2,5);
                LCD_print(secs);

                if(BUTTON_IsPressed(BUTTON_S5)) break;

                LCD_sendCommand(LCD_CLEAR);
                __delay32(4000000); //czekamy sekundę
                czas_dla_prog1--;

                if(czas_dla_prog1 < 1) break;
                if(BUTTON_IsPressed(BUTTON_S5)) break;
            }


    }else if(program == 2){
            unsigned char minutes = 0;
            unsigned char secs = 0;
            int waga;
            int czas;

            while(1){
                LCD_setCursor(1,0);
                LCD_print("podaj wage");
                LCD_setCursor(2,0);
                waga = ADC_Read10bit(ADC_CHANNEL_POTENTIOMETER)/100;

                if (waga == 0xFFFF) {
                    continue;
                }

                waga = waga * 100;

                czas = (waga / 2) + 30;

                LCD_print(waga);
                LCD_setCursor(2,5);
                LCD_print("gram");

                if(BUTTON_IsPressed(BUTTON_S5)) break;
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                __delay_ms(1000);
                if(BUTTON_IsPressed(BUTTON_S5)) break;
            }

            while(1){
                LCD_setCursor(1,0);
                LCD_print("pozostalo");
                LCD_setCursor(2,0);

                minutes = czas / 60;
                secs = czas % 60;
                LCD_print(minutes);
                LCD_setCursor(2,3);
                LCD_print(":");
                LCD_setCursor(2,5);
                LCD_print(secs);

                if(BUTTON_IsPressed(BUTTON_S5)) break;

                LCD_sendCommand(LCD_CLEAR);
                __delay32(4000000); //czekamy sekundę
                czas--;

                if(czas < 1) break;
                if(BUTTON_IsPressed(BUTTON_S5)) break;
            }



    }else if(program == 3){

    }else if(program == 4)
    {

    }

}

int main(void) {
    // Domyślna konfiguracja ADC
    ADC_SetConfiguration(ADC_CONFIGURATION_DEFAULT);
    // ADC ma czytać potencjometr
    ADC_ChannelEnable(ADC_CHANNEL_POTENTIOMETER);

    // output LEDów PORT A
    TRISA = 0x0000;

    TRISB = 0x7FFF; // Ustawienie rejestrów kierunku
    TRISD = 0x0000;
    TRISE = 0x0000;
    LCD_init(); // Inicjalizacja wyświetlacza

    unsigned int value;
    int program = 0;


    while (1)
    {
        // Czytanie 10-bit wartości z potencjometru
        value = ADC_Read10bit(ADC_CHANNEL_POTENTIOMETER);
        // Błąd?
        if (value == 0xFFFF) {
        // W razie czego przechodzimy do kolejnej iteracji
            continue;
        }

        if(BUTTON_IsPressed(BUTTON_S3)){
            if(program==1){
                program=4;
            }else{
                program--;
                __delay32(1500000);
            }
        }
        if(BUTTON_IsPressed(BUTTON_S4)){
            if(program==4){
                program=1;
            }else{
                program++;
                __delay32(1500000);
            }
        }

        switch(program){
            case 1:
                LCD_setCursor(1,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("<-- S3   S4 -->");
                LCD_setCursor(2,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("1. wlasne");
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);

                if(BUTTON_IsPressed(BUTTON_S4) || BUTTON_IsPressed(BUTTON_S3)) break;

                if(BUTTON_IsPressed(BUTTON_S5)){
                    uruchomprogram(program);
                    program = 1;
                    break;
                }
                break;

            case 2:
                LCD_setCursor(1,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("<-- S3   S4 -->");
                LCD_setCursor(2,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("2. popcorn");
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                break;

            case 3:
                LCD_setCursor(1,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("<-- S3   S4 -->");
                LCD_setCursor(2,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("3. Podgrzewanie");
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                break;

            case 4:
                LCD_setCursor(1,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("<-- S3   S4 -->");
                LCD_setCursor(2,0); // Ustawienie kursora na początku drugiej linii
                LCD_print("4. Rozmrazanie");
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                break;

            default:
                break;
        }



    }
 return 0;
}
Leave a Comment