// 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; }