Untitled

 avatar
unknown
plain_text
a year ago
10 kB
5
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <libpic30.h>
#include <math.h>


#include "adc.h"
#include "buttons.h"
#include <xc.h>
#include "lcd.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 LCD_print_number(unsigned int number) {
    char buffer[6]; // buffer to hold the string representation of the number
    sprintf(buffer, "%u", number); // convert number to string
    LCD_print((unsigned char*)buffer); // print the string
}

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_number(minutes);
            LCD_setCursor(2,3);
            LCD_print(":");
            LCD_setCursor(2,5);
            LCD_print_number(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_number(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_number(minutes);
            LCD_setCursor(2,3);
            LCD_print(":");
            LCD_setCursor(2,5);
            LCD_print_number(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_number(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_number(minutes);
            LCD_setCursor(2,3);
            LCD_print(":");
            LCD_setCursor(2,5);
            LCD_print_number(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


    int program = 1;


    while (1){
//        if(!BUTTON_IsPressed(BUTTON_S3)){
//            if(program==0){
//                program=4;
//            }else{
//                program--;
//                __delay32(150000);
//            }
//        }
//        if(!BUTTON_IsPressed(BUTTON_S4)){
//            if(program==5){
//                program=1;
//            }else{
//                program++;
//                __delay32(150000);
//            }
//        }

        switch(program){
            case 1:
                while(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);
                __delay_ms(100);

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

                if(BUTTON_IsPressed(BUTTON_S3)){
                    program=4;
                    __delay32(15000);
                }else if(BUTTON_IsPressed(BUTTON_S4)){
                    program=2;
                    __delay32(15000);
                 }

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


            case 2:
                while(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("2. popcorn");
                __delay_ms(1000);
                LCD_sendCommand(LCD_CLEAR);
                __delay_ms(100);

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

                if(BUTTON_IsPressed(BUTTON_S6)){
                    uruchomprogram(program);
                    program = 1;
                    break;
                   }
                }
                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;
}
Editor is loading...
Leave a Comment