/** * @brief Donne au parametre les valeurs filtrées (moyenne) issues de la conversion analogique numérique issue du LCD et retourne si un appuie a ete detecte * @param *ts_adc * @retval bool_e: pointeur vers une structure qui contient les valeurs issues de la conversion analogique numérique issue du LCD */ bool_e TS_Get_Filtered_Touch(TS_ADC * ts_adc) { TS_STATE *pstate = NULL; pstate = IOE_TS_GetState(); ts_adc->touch_detected = pstate->TouchDetected; if(ts_adc->touch_detected) { ts_adc->x = pstate->X; ts_adc->y = pstate->Y; } else { ts_adc->x = 0; ts_adc->y = 0; } return ts_adc->touch_detected; }
/** * read from touch screen * * dataX - output x * dataY - output y */ static void screenTouched(int *dataX, int *dataY) { int temp; u8 notReady = 1; u8 pressed = 0; TS_STATE *ts_state; while(notReady) { xSemaphoreTake(lcdLock, portMAX_DELAY); //delay required, alternative was to have the displaySting below //without delay the system will hang! vTaskDelay(10 / portTICK_RATE_MS); //GLCD_displayStringLn(Line9, "semaphore taken"); ts_state = IOE_TS_GetState(); if (pressed) { //wait until no touch if (!ts_state->TouchDetected) { notReady = 0; } xSemaphoreGive(lcdLock); } else if(ts_state->TouchDetected) { temp = ts_state->X; *dataX = temp; temp = ts_state->Y; xSemaphoreGive(lcdLock); *dataY = temp; //check to see valid numbers entered //number 0,0 not concidered as valid //(a few times the response has been 0,0) if (dataX > 0 && dataY > 0 )pressed = 1; } else { xSemaphoreGive(lcdLock); //no touch yet, wait 0.1 s before checking again vTaskDelay(100 / portTICK_RATE_MS); } } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Initialize LEDs and push-buttons mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Initialize the LCD */ #ifdef USE_STM3210C_EVAL STM3210C_LCD_Init(); #elif defined (USE_STM32100E_EVAL) STM32100E_LCD_Init(); #endif /* USE_STM3210C_EVAL */ /* Clear the LCD */ LCD_Clear(White); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); /* Set the LCD Text Color */ LCD_SetTextColor(White); /* Display messages on the LCD */ LCD_DisplayStringLine(Line0, MESSAGE1); LCD_DisplayStringLine(Line1, MESSAGE2); LCD_DisplayStringLine(Line2, MESSAGE3); /* Configure the IO Expander */ if (IOE_Config() == IOE_OK) { /* Display "IO Expander OK" on the LCD */ LCD_DisplayStringLine(Line4, " IO Expander OK "); } else { LCD_DisplayStringLine(Line4, "IO Expander FAILED "); LCD_DisplayStringLine(Line5, " Please Reset the "); LCD_DisplayStringLine(Line6, " board and start "); LCD_DisplayStringLine(Line7, " again "); while(1); } /* Draw a rectangle with the specifies parameters and Blue Color */ LCD_SetTextColor(Blue); LCD_DrawRect(180, 310, 40, 60); /* Draw a rectangle with the specifies parameters and Red Color */ LCD_SetTextColor(Red); LCD_DrawRect(180, 230, 40, 60); /* Draw a rectangle with the specifies parameters and Yellow Color */ LCD_SetTextColor(Yellow); LCD_DrawRect(180, 150, 40, 60); /* Draw a rectangle with the specifies parameters and Black Color */ LCD_SetTextColor(Black); LCD_DrawRect(180, 70, 40, 60); #ifdef IOE_INTERRUPT_MODE #ifdef USE_STM32100E_EVAL /* Enable the Touch Screen interrupts */ IOE_ITConfig(IOE_ITSRC_TSC); #else /* Enable the Touch Screen and Joystick interrupts */ IOE_ITConfig(IOE_ITSRC_JOYSTICK | IOE_ITSRC_TSC); #endif /* USE_STM32100E_EVAL */ #endif /* IOE_INTERRUPT_MODE */ /* Loop infinitely */ while(1) { #ifdef IOE_POLLING_MODE static TS_STATE* TS_State; #ifdef USE_STM3210C_EVAL static JOY_State_TypeDef JoyState = JOY_NONE; /* Get the Joytick State */ JoyState = IOE_JoyStickGetState(); switch (JoyState) { /* None Joystick has been selected */ case JOY_NONE: LCD_DisplayStringLine(Line5, "JOY: ---- "); break; case JOY_UP: LCD_DisplayStringLine(Line5, "JOY: UP "); break; case JOY_DOWN: LCD_DisplayStringLine(Line5, "JOY: DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(Line5, "JOY: LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(Line5, "JOY: RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(Line5, "JOY: CENTER "); break; default: LCD_DisplayStringLine(Line5, "JOY: ERROR "); break; } #endif /* USE_STM3210C_EVAL */ /* Update the structure with the current position of the Touch screen */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 220) && (TS_State->Y > 180)) { if ((TS_State->X > 10) && (TS_State->X < 70)) { /* Display LD4 on the LCD and turn on LED4 */ LCD_DisplayStringLine(Line6, " LD4 "); STM_EVAL_LEDOn(LED4); } else if ((TS_State->X > 90) && (TS_State->X < 150)) { /* Display LD3 on the LCD and turn on LED3 */ LCD_DisplayStringLine(Line6, " LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 170) && (TS_State->X < 230)) { /* Display LD2 on the LCD and turn on LED2 */ LCD_DisplayStringLine(Line6, " LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 250) && (TS_State->X < 310)) { /* Display LD1 on the LCD and turn on LED1 */ LCD_DisplayStringLine(Line6, " LD1 "); STM_EVAL_LEDOn(LED1); } } else { /* Turn off LED1..4 */ STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* IOE_POLLING_MODE */ } }
/** * @brief This function handles External lines 15 to 10 interrupt request. * @param None * @retval None */ void EXTI15_10_IRQHandler(void) { /* Checks whether the IOE EXTI line is asserted or not */ if(EXTI_GetITStatus(IOE_IT_EXTI_LINE) != RESET) { #ifdef IOE_INTERRUPT_MODE /* Check if the interrupt source is the Touch Screen */ if (IOE_GetGITStatus(IOE_1_ADDR, IOE_TS_IT) & IOE_TS_IT) { static TS_STATE* TS_State; /* Update the structure with the current position */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 220) && (TS_State->Y > 180)) { if ((TS_State->X > 10) && (TS_State->X < 70)) { LCD_DisplayStringLine(Line6, " LD4 "); STM_EVAL_LEDOn(LED4); } else if ((TS_State->X > 90) && (TS_State->X < 150)) { LCD_DisplayStringLine(Line6, " LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 170) && (TS_State->X < 230)) { LCD_DisplayStringLine(Line6, " LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 250) && (TS_State->X < 310)) { LCD_DisplayStringLine(Line6, " LD1 "); STM_EVAL_LEDOn(LED1); } } else { STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE_1_ADDR, IOE_TS_IT); } #ifdef USE_STM3210C_EVAL else if (IOE_GetGITStatus(IOE_2_ADDR, IOE_GIT_GPIO)) { static JOY_State_TypeDef JoyState = JOY_NONE; /* Get the Joytick State */ JoyState = IOE_JoyStickGetState(); switch (JoyState) { case JOY_NONE: LCD_DisplayStringLine(Line5, "JOY: IT ---- "); break; case JOY_UP: LCD_DisplayStringLine(Line5, "JOY: IT UP "); break; case JOY_DOWN: LCD_DisplayStringLine(Line5, "JOY: IT DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(Line5, "JOY: IT LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(Line5, "JOY: IT RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(Line5, "JOY: IT CENTER "); break; default: LCD_DisplayStringLine(Line5, "JOY: IT ERROR "); break; } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE_2_ADDR, IOE_GIT_GPIO); IOE_ClearIOITPending(IOE_2_ADDR, IOE_JOY_IT); } /* CLear all pending interrupt */ IOE_ClearGITPending(IOE_2_ADDR, ALL_IT); IOE_ClearIOITPending(IOE_2_ADDR, IOE_JOY_IT); #endif /* USE_STM3210C_EVAL */ /* CLear all pending interrupt */ IOE_ClearGITPending(IOE_1_ADDR, ALL_IT); #endif /* IOE_INTERRUPT_MODE */ EXTI_ClearITPendingBit(IOE_IT_EXTI_LINE); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Initialize LEDs mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Select the Button test mode (polling or interrupt) BUTTON_MODE in main.h */ STM_EVAL_PBInit(BUTTON_WAKEUP, BUTTON_MODE); STM_EVAL_PBInit(BUTTON_TAMPER, BUTTON_MODE); /* Initialize the LCD */ LCD_Init(); /* Initialize the LCD Layers */ LCD_LayerInit(); /* Enable LCD display */ LCD_DisplayOn(); /* Set foreground layer */ LCD_SetLayer(LCD_FOREGROUND_LAYER); /* Clear the LCD */ LCD_Clear(White); /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); LCD_DisplayStringLine(LCD_LINE_0, (uint8_t *)" STM324x9I-EVAL "); LCD_DisplayStringLine(LCD_LINE_1, (uint8_t *)" Example on how to "); LCD_DisplayStringLine(LCD_LINE_2, (uint8_t *)" use the IO Expander "); /* Configure the IO Expander */ if (IOE_Config() == IOE_OK && IOE16_Config() == IOE16_OK) { LCD_DisplayStringLine(LCD_LINE_3, (uint8_t *)" IO Expander OK "); } else { LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"IO Expander FAILED "); LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" Please Reset the "); LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)" board and start "); LCD_DisplayStringLine(LCD_LINE_7, (uint8_t *)" again "); while(1); } /* LEDs Control blocks */ LCD_SetTextColor(Blue); LCD_DrawRect(310, 180, 40, 60); LCD_SetTextColor(Red); LCD_DrawRect(230, 180, 40, 60); LCD_SetTextColor(Yellow); LCD_DrawRect(150, 180, 40, 60); LCD_SetTextColor(Green); LCD_DrawRect(70, 180, 40, 60); #ifdef IOE_INTERRUPT_MODE /* Configure motherboard interrupt source IO_EXP4 */ IOE16_IOPinConfig(IOE16_TS_IT,Direction_IN); IOE16_ITConfig(IOE16_TS_IT); /* Enable joystick interrupt */ IOE16_ITConfig(JOY_IO16_PINS); /* Enable the Touch Screen interrupt */ IOE_TSITConfig(); /* Read IOs state to let IO interrupt occur */ IOE16_I2C_ReadDeviceRegister(IOE16_REG_GPMR_LSB); IOE16_I2C_ReadDeviceRegister(IOE16_REG_GPMR_MSB); #endif /* IOE_INTERRUPT_MODE */ while(1) { #ifdef IOE_POLLING_MODE static JOY_State_TypeDef JoyState = JOY_NONE; static TS_STATE* TS_State; /* Get the Joystick State */ JoyState = IOE16_JoyStickGetState(); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); switch (JoyState) { case JOY_NONE: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: ---- "); break; case JOY_UP: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: UP "); break; case JOY_DOWN: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: CENTER "); break; default: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: ERROR "); break; } /* Update the structure with the current position */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 92) && (TS_State->Y > 52)) { if ((TS_State->X > 60) && (TS_State->X < 120)) { LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD1 "); STM_EVAL_LEDOn(LED1); } else if ((TS_State->X > 140) && (TS_State->X < 200)) { LCD_SetTextColor(LCD_COLOR_YELLOW); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 220) && (TS_State->X < 280)) { LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 300) && (TS_State->X < 360)) { LCD_SetTextColor(LCD_COLOR_BLUE); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD4 "); STM_EVAL_LEDOn(LED4); } } else { STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* IOE_POLLING_MODE */ #ifdef BUTTON_POLLING_MODE /* Insert 10 ms delay */ Delay(1); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); if (STM_EVAL_PBGetState(BUTTON_TAMPER) == 0) { /* Toggle LD2 */ STM_EVAL_LEDToggle(LED2); LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"Pol: TAMPER/KEY Pressed "); } if (STM_EVAL_PBGetState(BUTTON_WAKEUP) != 0) { /* Toggle LD3 */ STM_EVAL_LEDToggle(LED3); LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"Pol: WAKEUP Pressed "); } #endif } }
/** * @brief This function handles External lines 9 to 5 interrupt request. * @param None * @retval None */ void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(IOE16_IT_EXTI_LINE) != RESET) { #ifdef IOE_INTERRUPT_MODE __IO uint16_t tmpsr = 0; static JOY_State_TypeDef JoyState = JOY_NONE; static TS_STATE* TS_State; /* Get the interrupt status register */ tmpsr = IOE16_GetITStatus(); /* Check Touch screen interrupt event occurred */ if((tmpsr & IOE16_TS_IT) != 0) { /* Update the structure with the current position */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 92) && (TS_State->Y > 52)) { if ((TS_State->X > 60) && (TS_State->X < 120)) { LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LED1 "); STM_EVAL_LEDOn(LED1); } else if ((TS_State->X > 140) && (TS_State->X < 200)) { LCD_SetTextColor(LCD_COLOR_YELLOW); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LED2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 220) && (TS_State->X < 280)) { LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LED3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 300) && (TS_State->X < 360)) { LCD_SetTextColor(LCD_COLOR_BLUE); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LED4"); STM_EVAL_LEDOn(LED4); } } else { STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE16_TS_IT); } /* Check joystick interrupt event occurred */ if((tmpsr & IOE16_JOY_IT) != 0 ) { /* Get the joystick State */ JoyState = IOE16_JoyStickGetState(); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); switch (JoyState) { case JOY_NONE: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: ---- "); break; case JOY_UP: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: UP "); break; case JOY_DOWN: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: CENTER "); break; default: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" JOY: ERROR "); break; } } #endif /* IOE_INTERRUPT_MODE */ /* Clear all pending bits */ EXTI_ClearITPendingBit(IOE16_IT_EXTI_LINE); IOE_ClearGITPending(ALL_GIT); IOE16_GetITStatus(); } }
/** * @brief This function handles External lines 15 to 10 interrupt request. * @param None * @retval None */ void EXTI15_10_IRQHandler(void) { #ifdef USE_STM32100E_EVAL if(EXTI_GetITStatus(RIGHT_BUTTON_EXTI_LINE) != RESET) { if (ReadKey == 1) { PressedKey = RIGHT; } else { if (GetMutex == 1) { ShowMutex = 0; } else { ReqOperation = SHOW_TEMPERATURE_OP ; } } /* Clear EXTI interrupts pending bits */ EXTI_ClearITPendingBit(RIGHT_BUTTON_EXTI_LINE); } if(EXTI_GetITStatus(LEFT_BUTTON_EXTI_LINE) != RESET) { if (ReadKey == 1) { PressedKey = LEFT; } else { if (GetMutex == 1) { ShowMutex = 0; } else { ReqOperation = SHOW_TIME_OP; } } /* Clear EXTI interrupts pending bits */ EXTI_ClearITPendingBit(LEFT_BUTTON_EXTI_LINE); } if(EXTI_GetITStatus(UP_BUTTON_EXTI_LINE) != RESET) { if (ReadKey == 1) { PressedKey = UP; } else { if (GetMutex == 0) { ReqOperation = GET_REPORT_OP; } } /* Clear EXTI interrupts pending bits */ EXTI_ClearITPendingBit(UP_BUTTON_EXTI_LINE); } if(EXTI_GetITStatus(DOWN_BUTTON_EXTI_LINE) != RESET) { if (ReadKey == 1) { PressedKey = DOWN; } else { if (GetMutex == 0) { ReqOperation = ERASE_EEPROM_OP; } } /* Clear EXTI interrupts pending bits */ EXTI_ClearITPendingBit(DOWN_BUTTON_EXTI_LINE); } #endif /* USE_STM32100E_EVAL */ if(EXTI_GetITStatus(IOE_IT_EXTI_LINE) != RESET) { #ifdef USE_STM3210C_EVAL static JOY_State_TypeDef JoyState = JOY_NONE; #endif /* USE_STM3210C_EVAL */ static TS_STATE* TS_State; /* Check if the interrupt source is the Touch Screen */ if (IOE_GetGITStatus(IOE_1_ADDR, IOE_TS_IT) & IOE_TS_IT) { /* Update the structure with the current position */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 230) && (TS_State->Y > 200)) { if ((TS_State->X > 10) && (TS_State->X < 70)) { LCD_DisplayStringLine(Line7, (uint8_t*)" TS1 "); } else if ((TS_State->X > 90) && (TS_State->X < 150)) { LCD_DisplayStringLine(Line7, (uint8_t*)" TS2 "); } else if ((TS_State->X > 170) && (TS_State->X < 230)) { LCD_DisplayStringLine(Line7, (uint8_t*)" TS3 "); } else if ((TS_State->X > 250) && (TS_State->X < 310)) { LCD_DisplayStringLine(Line7, (uint8_t*)" TS4 "); } } else { STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE_1_ADDR, IOE_TS_IT); } #ifdef USE_STM3210C_EVAL else if (IOE_GetGITStatus(IOE_2_ADDR, IOE_GIT_GPIO)) { /* Get the Joystick State */ JoyState = IOE_JoyStickGetState(); switch (JoyState) { case JOY_NONE: break; case JOY_UP: if (ReadKey == 1) { PressedKey = UP; } else { if (GetMutex == 0) { ReqOperation = GET_REPORT_OP; } } break; case JOY_DOWN: if (ReadKey == 1) { PressedKey = DOWN; } else { if (GetMutex == 0) { ReqOperation = ERASE_EEPROM_OP; } } break; case JOY_RIGHT : if (ReadKey == 1) { PressedKey = RIGHT; } else { if (GetMutex == 1) { ShowMutex = 0; } else { ReqOperation = SHOW_TEMPERATURE_OP ; } } break; case JOY_LEFT: if (ReadKey == 1) { PressedKey = LEFT; } else { if (GetMutex == 1) { ShowMutex = 0; } else { ReqOperation = SHOW_TIME_OP; } } break; case JOY_CENTER: if (ReadKey == 1) { PressedKey = SEL; } else { if (GetMutex == 1) { NextRep = 1; ExitMutex = 1; } } break; default: LCD_DisplayStringLine(Line9, (uint8_t*)" JOY ERROR "); break; } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE_2_ADDR, IOE_GIT_GPIO); IOE_ClearIOITPending(IOE_2_ADDR, IOE_JOY_IT); } #endif /* USE_STM3210C_EVAL */ else { /* Clear the interrupt pending bits */ #ifdef USE_STM3210C_EVAL IOE_ClearGITPending(IOE_1_ADDR, ALL_IT); IOE_ClearGITPending(IOE_2_ADDR, ALL_IT); #else IOE_ClearGITPending(IOE_1_ADDR, ALL_IT); #endif /* USE_STM3210C_EVAL */ } } /* Clear EXTI interrupts pending bits */ EXTI_ClearITPendingBit(IOE_IT_EXTI_LINE); }
/** * @brief Lcd_Touch Calibration test * @param None * @retval None */ void Lcd_Touch_Calibration(void) { #define CURSOR_LEN (10) uint8_t k,i; float ratio1,ratio2; Point_Struct left_upper_point,right_upper_point,left_down_point,right_down_point,tst_point; int tpx_sum = 0,tpy_sum = 0; /*Indicates whether Calibration is OK*/ uint8_t adjust_OK_Falg = 0; TS_STATE *pstate = NULL; /* Clear the LCD */ LCD_Clear(White); LCD_SetTextColor(Red); delay(100); while (!adjust_OK_Falg) { tpx_sum = 0; tpy_sum = 0; /*wait for Calibration */ for (k = 0;k < 4;k++) { LCD_DrawUniLine( point_Base[k].x - CURSOR_LEN, point_Base[k].y, point_Base[k].x + CURSOR_LEN, point_Base[k].y); LCD_DrawUniLine( point_Base[k].x, point_Base[k].y - CURSOR_LEN, point_Base[k].x, point_Base[k].y + CURSOR_LEN); do { pstate = IOE_TS_GetState(); } while(!pstate->TouchDetected); delay(10); /*Read AD convert result*/ for(i = 0; i < 16; i++) { tpx_sum += IOE_TS_Read_X(); tpy_sum += IOE_TS_Read_Y(); delay(2); } tpx_sum >>= 4; tpy_sum >>= 4; switch (k) { case 0: left_upper_point.x = tpx_sum; left_upper_point.y = tpy_sum; break; case 1: right_upper_point.x = tpx_sum; right_upper_point.y = tpy_sum; break; case 2: left_down_point.x = tpx_sum; left_down_point.y = tpy_sum; break; case 3: right_down_point.x = tpx_sum; right_down_point.y = tpy_sum; break; default: break; } delay(200); } ratio1 = (float)((point_Base[1].x - point_Base[0].x) + (point_Base[3].x - point_Base[2].x)) / 2.0; ratio2 = (float)((right_upper_point.x - left_upper_point.x) + (right_down_point.x - left_down_point.x)) / 2.0; adjust_Para.xScale = ratio1 / ratio2; ratio1 = (float)((point_Base[2].y - point_Base[0].y) + (point_Base[3].y - point_Base[1].y)) / 2.0; ratio2 = (float)((left_down_point.y - left_upper_point.y) + (right_down_point.y - right_upper_point.y)) / 2.0; adjust_Para.yScale = ratio1 / ratio2; ratio1 = (((float)right_upper_point.x * adjust_Para.xScale - (float)point_Base[1].x) + ((float)left_upper_point.x * adjust_Para.xScale - (float)point_Base[0].x)) / 2.0; adjust_Para.xOffset = (int)ratio1; ratio1 = (((float)right_upper_point.y * adjust_Para.yScale - (float)point_Base[1].y) + ((float)left_upper_point.y * adjust_Para.yScale - (float)point_Base[0].y)) / 2.0; adjust_Para.yOffset = (int)ratio1; /*Draw cross sign for calibration points*/ LCD_DrawUniLine(point_Base[4].x - CURSOR_LEN, point_Base[4].y, point_Base[4].x + CURSOR_LEN, point_Base[4].y); LCD_DrawUniLine(point_Base[4].x, point_Base[4].y - CURSOR_LEN, point_Base[4].x, point_Base[4].y + CURSOR_LEN); do { pstate = IOE_TS_GetState(); } while(!pstate->TouchDetected); delay(10); tpx_sum = 0; tpy_sum = 0; /*Read AD convert result*/ for(i = 0; i < 16; i++) { tpx_sum += IOE_TS_Read_X(); tpy_sum += IOE_TS_Read_Y(); delay(2); } tpx_sum >>= 4; tpy_sum >>= 4; tst_point.x = tpx_sum; tst_point.y = tpy_sum; tst_point.x = (int)(tst_point.x * adjust_Para.xScale - adjust_Para.xOffset); tst_point.y = (int)(tst_point.y * adjust_Para.yScale - adjust_Para.yOffset); if (tst_point.x > (point_Base[4].x + CALIBRATION_RANGE) || tst_point.x < (point_Base[4].x - CALIBRATION_RANGE) || tst_point.y > (point_Base[4].y + CALIBRATION_RANGE) || tst_point.y < (point_Base[4].y - CALIBRATION_RANGE)) { adjust_OK_Falg = 0; LCD_DisplayStringLine(LINE(8)," Calibration Fail! "); delay(200); LCD_Clear(White); delay(300); } else { adjust_OK_Falg = 1; } } LCD_DisplayStringLine(LINE(8)," Calibration OK! "); delay(200); }
/** * @brief Display the value of calibration point * @param None * @retval None */ void Calibration_Test_Dispose(void) { TS_STATE *pstate = NULL; uint8_t text[50]; uint8_t b_flag = 1; /*Init Variables*/ point_new.x = 0; point_new.y = 0; point_old.x = 0; point_old.y = 0; /*Display backgroup of LCD*/ LCD_Clear(White); LCD_SetTextColor(Red); LCD_DisplayStringLine(LINE(9)," please touch the screen "); while (1) { do { pstate = IOE_TS_GetState(); delay(10); } while(!pstate->TouchDetected); point_new.x = pstate->X; point_new.y = pstate->Y; /* If AD result is abnormal, then LCD show nothing */ if ((point_new.x > TOUCH_AD_VALUE_MAX) || (point_new.x < TOUCH_AD_VALUE_MIN) || (point_new.y > TOUCH_AD_VALUE_MAX) || (point_new.y < TOUCH_AD_VALUE_MIN)) { continue; } if (b_flag) { b_flag = 0; LCD_Clear(White); } LCD_SetTextColor(Blue); sprintf((char*)text," X_AD = %d ",point_new.x); LCD_DisplayStringLine(LINE(4),text); sprintf((char*)text," y_AD = %d ",point_new.y); LCD_DisplayStringLine(LINE(5),text); /*Calculate coordinates*/ point_new.x = ((int)(point_new.x * adjust_Para.xScale - adjust_Para.xOffset)); point_new.y = ((int)(point_new.y * adjust_Para.yScale - adjust_Para.yOffset)); if (point_new.x >= LCD_PIXEL_WIDTH) { point_new.x = LCD_PIXEL_WIDTH -1; } if (point_new.y >= LCD_PIXEL_HEIGHT) { point_new.y = LCD_PIXEL_HEIGHT -1; } sprintf((char*)text," X_POS = %d ", point_new.x); LCD_DisplayStringLine(LINE(7),text); sprintf((char*)text," y_POS = %d ", point_new.y); LCD_DisplayStringLine(LINE(8),text); LCD_SetTextColor(Red); /*Judge whether the inut point is the 1st point*/ if ((point_old.x == 0) && (point_old.y == 0)) { point_old.x = point_new.x; point_old.y = point_new.y; } else { LCD_DrawUniLine(point_old.x, point_old.y, point_new.x, point_new.y); point_old.x = point_new.x; point_old.y = point_new.y; } } }