Untitled
unknown
plain_text
a year ago
10 kB
9
Indexable
#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;
}
Editor is loading...
Leave a Comment