Example #1
0
/**
 *  @brief  读取按键值    
 *  @param  None
 *  @return enum KEY
 */
enum KEY key_read(void)
{
    enum KEY key_value = NO_KEY;
    
    key_value = key_press_down();
    
    if (key_value != NO_KEY)
    {
        delay_n_ms(100);
        while (key_press_down() != NO_KEY)
        {
            delay_n_ms(50);
        }
    }
    
    return key_value;
}
void PIN_MANAGER_IOC(void)
{    
    if((IOCBP5 == 1) && (IOCBF5 == 1))
    {
        
        delay_n_ms(2);
        if (BLUE_BTN == 0) {
            IOCBF5 = 0;
            return;
        }
        
        selected_spell = BLUE_SPELL;
        armButtonEnabled = true;
        
        //@TODO Add handling code for IOC on pin RA4
        // BLUE Button
        YELLOW_LED = 0;
        YELLOW_LED2 = PORTCbits.RC6;
        WHITE_LED = 0;
        ARM_LED = armButtonEnabled;
        BLUE_LED = 1;
        RED_LED = 0;
        
        // clear interrupt-on-change flag
        IOCBF5 = 0;
    }
    else if((IOCBP4 == 1) && (IOCBF4 == 1))
    {
        //@TODO Add handling code for IOC on pin RA3
        // RED Button
        
        delay_n_ms(2);
        if (RED_BTN == 0) {
            IOCBF4 = 0;
            return;
        }
        
        selected_spell = RED_SPELL;
        armButtonEnabled = true;
        
        YELLOW_LED = 0;
        YELLOW_LED2 = PORTCbits.RC6;
        WHITE_LED = 0;
        ARM_LED = armButtonEnabled;
        BLUE_LED = 0;
        RED_LED = 1;
        
        // clear interrupt-on-change flag
        IOCBF4 = 0;        
    }
    else if((IOCBP6 == 1) && (IOCBF6 == 1))
    {
        //@TODO Add handling code for IOC on pin RB6
        // ARM Button

        arm_held_for_3_seconds = false;
        
        if (!armButtonEnabled) {
            IOCBF6 = 0;
            return;
        }
        
        delay_n_ms(2);
        if (ARM_BTN == 0 || !armButtonEnabled) {
            IOCBF6 = 0;
            arm_button_pressed_start_time = 0;
            return;
        }

        if (armedMode == STATE_DISARMED) {
            
            while (ARM_BTN == 1) {
                __delay_ms (1);
                arm_button_pressed_start_time++;
            
                if (arm_button_pressed_start_time >= 3000) {
                    arm_held_for_3_seconds = true;
                    ARM_LED = 0;
                    delay_n_ms(2);
                    ARM_LED = 1;
                    delay_n_ms(2);
                    ARM_LED = 0;
                    delay_n_ms(2);
                    ARM_LED = 1;
                    delay_n_ms(2);
                    ARM_LED = 0;
                    delay_n_ms(2);
                    ARM_LED = 1;
                    break;
                }
            }
            
            if (arm_held_for_3_seconds) {

                switch (selected_spell) {
                    case YELLOW_SPELL:
                        printf("I\n%c\n", 0x10);
                        break;
                    case WHITE_SPELL:
                        printf("I\n%c\n", 0x11);
                        break;
                    case BLUE_SPELL:
                        printf("I\n%c\n", 0x12);
                        break;
                    case RED_SPELL:
                        printf("I\n%c\n", 0x13);
                        break;
                }
                                
                armedMode = STATE_MANUAL_MODE;

            } else {

                switch (selected_spell) {
                    case YELLOW_SPELL:
                        printf("I\n%c\n", 0x20);
                        break;
                    case WHITE_SPELL:
                        printf("I\n%c\n", 0x21);
                        break;
                    case BLUE_SPELL:
                        printf("I\n%c\n", 0x22);
                        break;
                    case RED_SPELL:
                        printf("I\n%c\n", 0x23);
                        break;
                }
                
                armedMode = STATE_AUTOMATIC_MODE;
                armButtonEnabled = false;
            }
        } else if (armedMode == STATE_MANUAL_MODE) {
            printf("I\n%c\n", 0x00);
            armedMode = STATE_DISARMED;
            arm_held_for_3_seconds = false;
        }
        
        YELLOW_LED = selected_spell == YELLOW_SPELL;
        YELLOW_LED2 = PORTCbits.RC6;
        WHITE_LED = selected_spell == WHITE_SPELL;
        ARM_LED = armButtonEnabled || STATE_MANUAL_MODE;
        BLUE_LED = selected_spell == BLUE_SPELL;
        RED_LED = selected_spell == RED_SPELL; 
        
        arm_button_pressed_start_time = 0;
        // clear interrupt-on-change flag
        IOCBF6 = 0;        
    }
    else if((IOCCP0 == 1) && (IOCCF0 == 1))
    {
        //@TODO Add handling code for IOC on pin RB5
        // WHITE Button
        
        delay_n_ms(2);
        if (WHITE_BTN == 0) {
            IOCCF0 = 0;
            return;
        }
        
        if (armedMode == STATE_DISARMED) {
            selected_spell = WHITE_SPELL;
            armButtonEnabled = true;            
        }
        
        reset_btn_held = 0;
        
        while (WHITE_BTN == 1) {
            __delay_ms (1);
            reset_btn_held++;
            
            if (reset_btn_held >= 3000) {
                RESET();
            } else if (reset_btn_held % 500 == 0) {
                WHITE_LED = 1;
                delay_n_ms(2);
                WHITE_LED = 0;
                delay_n_ms(2);
                WHITE_LED = selected_spell == WHITE_SPELL;
            }
        }
        
        YELLOW_LED = 0;
        YELLOW_LED2 = 0;
        WHITE_LED = 1;
        ARM_LED = armButtonEnabled;
        BLUE_LED = 0;
        RED_LED = 0;
        
        // clear interrupt-on-change flag
        IOCCF0 = 0;        
    }
    else if((IOCBP7 == 1) && (IOCBF7 == 1))
    {
        //@TODO Add handling code for IOC on pin RB7
        // YELLOW Button
        
        delay_n_ms(2);
        if (YELLOW_BTN == 0) {
            IOCBF7 = 0;
            return;
        }
        
        selected_spell = YELLOW_SPELL;
        armButtonEnabled = true;
        
        YELLOW_LED = 1;
        YELLOW_LED2 = PORTCbits.RC6;
        WHITE_LED = 0;
        ARM_LED = armButtonEnabled;
        BLUE_LED = 0;
        RED_LED = 0;
        
        // clear interrupt-on-change flag
        IOCBF7 = 0;
    }
}