/* test use for printing the status and counter value through usart */ void getEncoder(void){ detachEXTI(EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3); USART_puts(USART3, "L_state:"); USART_putd(USART3, ENCODER_L.rotate); USART_puts(USART3, " R_state:"); USART_putd(USART3, ENCODER_R.rotate); getEncoderState(&ENCODER_L); getEncoderState(&ENCODER_R); USART_puts(USART3, " L_state2:"); USART_putd(USART3, ENCODER_L.rotate); USART_puts(USART3, " R_state2:"); USART_putd(USART3, ENCODER_R.rotate); USART_puts(USART3, " le_en:"); USART_putd(USART3, ENCODER_L.count); USART_puts(USART3, " ri_en:"); USART_putd(USART3, ENCODER_R.count); USART_puts(USART3, "\r\n"); /* clear encoder counter*/ ENCODER_L.count = 0; ENCODER_R.count = 0; attachEXTI(EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3); }
/* ENCODER RIGHT phase B */ void EXTI3_IRQHandler(){ if(EXTI_GetITStatus(EXTI_Line3) != RESET){ ENCODER_R.count++; getEncoderState(&ENCODER_R); EXTI_ClearITPendingBit(EXTI_Line3); } }
void main () { // Current timer state enum stateType state = COUNTING; // Default timer value to 10 minutes int timerValue = 600; // Note that count = 4x number of seconds int count = timerValue << 2; // This is used for the blinking digit during set mode char currentDigitValue = 0; lcd_init(); initTimer(); initButtons(); initEncoder(); initLedDisplay(); displayTime(timerValue); while (1) { // display the LED string displayLEDs(0, displayString[displayStringIndex]); displayLEDs(1, displayString[displayStringIndex + 1]); displayLEDs(2, displayString[displayStringIndex + 2]); displayLEDs(3, displayString[displayStringIndex + 3]); // Get user input (buttons and encoder) enum button buttonState = getButtonState(); enum encoderChange encoderState = getEncoderState(); if (state == SITTING || state == COUNTING) { // User wants to enable set mode if (buttonState == BUTTON_S2) { count = 0; timerValue = 0; currentDigitValue = 0; state = SETTING_DIGIT0; bcd.digit0 = 0xA; bcd.digit1 = 0xA; bcd.digit2 = 0xA; bcd.digit3 = 0xA; lcd_display_digits(bcd); // User wants to reset the timer } else if (buttonState == BUTTON_S3) { count = timerValue << 2; state = SITTING; displayTime(timerValue); // User wants to start the timer } else if (state == SITTING && buttonState == BUTTON_S4) { count = timerValue << 2; state = COUNTING; displayTime(count >> 2); } } // If we're already in set mode else if (state == SETTING_DIGIT0