// CONFIG2 #pragma config POSCMOD = XT #pragma config OSCIOFNC = ON #pragma config FCKSM = CSDCMD #pragma config FNOSC = PRI #pragma config IESO = ON // CONFIG1 #pragma config WDTPS = PS32768 #pragma config FWPSA = PR128 #pragma config WINDIS = ON #pragma config FWDTEN = ON #pragma config ICS = PGx2 #pragma config GWRP = OFF #pragma config GCP = OFF #pragma config JTAGEN = OFF #include <xc.h> #include <stdint.h> #include <stdbool.h> #include "libpic30.h" #include "adc.h" #include "buttons.h" #define FCY 16000000UL // LED3–LED6 #define LED3 LATDbits.LATD6 #define LED4 LATDbits.LATD7 #define LED5 LATDbits.LATD13 #define LED6 LATAbits.LATA7 #define LED3_TRIS TRISDbits.TRISD6 #define LED4_TRIS TRISDbits.TRISD7 #define LED5_TRIS TRISDbits.TRISD13 #define LED6_TRIS TRISAbits.TRISA7 typedef enum { IDLE, MIGANIE, ALARM_AKTYWNY } ALARM_STATE; void init(void) { LED3_TRIS = 0; LED4_TRIS = 0; LED5_TRIS = 0; LED6_TRIS = 0; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0; ADC_SetConfiguration(ADC_CONFIGURATION_DEFAULT); ADC_ChannelEnable(ADC_CHANNEL_5); BUTTON_Enable(BUTTON_S3); } void zgasLEDy(void) { LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0; } void zapalLEDy(void) { LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; } int main(void) { init(); ALARM_STATE state = IDLE; uint32_t czas_migania = 0; while (1) { uint16_t adcVal = ADC_Read10bit(ADC_CHANNEL_5); bool przycisk = BUTTON_IsPressed(BUTTON_S3); // PRZERWANIE alarmu — dowolny stan -> IDLE if (przycisk || adcVal <= 512) { state = IDLE; zgasLEDy(); } switch (state) { case IDLE: zgasLEDy(); if (adcVal > 512) { state = MIGANIE; czas_migania = 0; } break; case MIGANIE: LED5 = !LED5; __delay32(250 * (FCY / 1000)); // 250 ms czas_migania += 250; if (czas_migania >= 5000) { state = ALARM_AKTYWNY; zapalLEDy(); } break; case ALARM_AKTYWNY: // LEDy już świecą, nic więcej tu nie robimy __delay32(50 * (FCY / 1000)); break; } } return 0; }
Standard input is empty
// CONFIG2
#pragma config POSCMOD = XT
#pragma config OSCIOFNC = ON
#pragma config FCKSM = CSDCMD
#pragma config FNOSC = PRI
#pragma config IESO = ON
// CONFIG1
#pragma config WDTPS = PS32768
#pragma config FWPSA = PR128
#pragma config WINDIS = ON
#pragma config FWDTEN = ON
#pragma config ICS = PGx2
#pragma config GWRP = OFF
#pragma config GCP = OFF
#pragma config JTAGEN = OFF
#include <xc.h>
#include <stdint.h>
#include <stdbool.h>
#include "libpic30.h"
#include "adc.h"
#include "buttons.h"
#define FCY 16000000UL
// LED3–LED6
#define LED3 LATDbits.LATD6
#define LED4 LATDbits.LATD7
#define LED5 LATDbits.LATD13
#define LED6 LATAbits.LATA7
#define LED3_TRIS TRISDbits.TRISD6
#define LED4_TRIS TRISDbits.TRISD7
#define LED5_TRIS TRISDbits.TRISD13
#define LED6_TRIS TRISAbits.TRISA7
typedef enum {
IDLE,
MIGANIE,
ALARM_AKTYWNY
} ALARM_STATE;
void init(void) {
LED3_TRIS = 0;
LED4_TRIS = 0;
LED5_TRIS = 0;
LED6_TRIS = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
ADC_SetConfiguration(ADC_CONFIGURATION_DEFAULT);
ADC_ChannelEnable(ADC_CHANNEL_5);
BUTTON_Enable(BUTTON_S3);
}
void zgasLEDy(void) {
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
}
void zapalLEDy(void) {
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
}
int main(void) {
init();
ALARM_STATE state = IDLE;
uint32_t czas_migania = 0;
while (1) {
uint16_t adcVal = ADC_Read10bit(ADC_CHANNEL_5);
bool przycisk = BUTTON_IsPressed(BUTTON_S3);
// PRZERWANIE alarmu — dowolny stan -> IDLE
if (przycisk || adcVal <= 512) {
state = IDLE;
zgasLEDy();
}
switch (state) {
case IDLE:
zgasLEDy();
if (adcVal > 512) {
state = MIGANIE;
czas_migania = 0;
}
break;
case MIGANIE:
LED5 = !LED5;
__delay32(250 * (FCY / 1000)); // 250 ms
czas_migania += 250;
if (czas_migania >= 5000) {
state = ALARM_AKTYWNY;
zapalLEDy();
}
break;
case ALARM_AKTYWNY:
// LEDy już świecą, nic więcej tu nie robimy
__delay32(50 * (FCY / 1000));
break;
}
}
return 0;
}