Untitled
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