|
本帖最后由 ddllxxrr 于 2014-3-4 18:25 编辑
近两天用STM32F429i开发板搞了个计算器。原理如下:
1、用画图函数画出计算器的操作键盘。
2、用触摸屏程序去定位。根据定位采取相应的行动。
3、用到三个变量,一个记没有按操作符前的数值,一个记按操作符后的数据。结果在result变量中存储。
由于本人开发的为简易计算器。现在把操作顺序说一下:
点数字时稍快点显示出来了马上撒。按操作符号后显示清零。再按下一个数。
本次版本的计算器。只能到9999且不含小数。若超9999无论是操作数还是结果马上清零。决不姑息。
为了方便大家,我把主程序贴出。其实这个只要覆盖,触摸按键的例程就可以马上执行
- /**
- ******************************************************************************
- * @file Touch_Panel/main.c
- * @author MCD Application Team
- * @version V1.0.1
- * @date 11-November-2013
- * @brief This example describes how to configure and use the touch panel
- * mounted on STM32F429I-DISCO boards.
- ******************************************************************************
- * @attention
- *
- * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- uint8_t Op1;
- uint8_t Op2;
- uint8_t Op3;
- uint8_t Op4;
- uint32_t middle1;
- uint32_t middle2;
- uint32_t result;
- /** @addtogroup STM32F429I_DISCOVERY_Examples
- * @{
- */
- /** @addtogroup Touch_Panel
- * @{
- */
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Private function prototypes -----------------------------------------------*/
- static void TP_Config(void);
- void display(uint32_t dd);
- void delay(uint32_t ll);
- /* Private functions ---------------------------------------------------------*/
- /**
- * @brief Main program
- * @param None
- * @retval None
- */
- int main(void)
- {
- //uint16_t linenum = 0;
- static TP_STATE* TP_State;
- /*!< At this stage the microcontroller clock setting is already configured,
- this is done through SystemInit() function which is called from startup
- file (startup_stm32f429_439xx.s) before to branch to application main.
- To reconfigure the default setting of SystemInit() function, refer to
- system_stm32f4xx.c file
- */
- /* LCD initialization */
- LCD_Init();
- /* LCD Layer initialization */
- LCD_LayerInit();
- /* Enable the LTDC */
- LTDC_Cmd(ENABLE);
- /* Set LCD foreground layer */
- LCD_SetLayer(LCD_FOREGROUND_LAYER);
- /* Touch Panel configuration */
- TP_Config();
- while (1)
- {
- TP_State = IOE_TP_GetState();
- if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 5) && (TP_State->X <= 55))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1*=10;
- middle1+=0;
- display(middle1);
- }
- else
- {
- middle2*=10;
- middle2+=0;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 60) && (TP_State->X <= 110))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1*=10;
- middle1 += 1;
- display(middle1);
- }
- else
- {
- middle2*=10;
- middle2 += 1;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 115) && (TP_State->X <= 165))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1*=10;
- middle1 += 2;
- display(middle1);
- }
- else
- {
- middle2*=10;
- middle2 += 2;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 170) && (TP_State->X <= 220))
- {
- middle1 = 0;
- middle2 = 0;
- Op1 = 0;
- Op2 = 0;
- Op3 = 0;
- Op4 = 0;
- if((Op1||Op2||Op3||Op4) == 0)
- display(0);
- else
- display(0);
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 5) && (TP_State->X <= 55))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 3;
- display(middle1);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 60) && (TP_State->X <= 110))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 4;
- display(middle1);
- }
- else
- {
- middle2 *=10;
- middle2 += 4;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 115) && (TP_State->X <= 165))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 5;
- display(middle1);
- }
- else
- {
- middle2 *=10;
- middle2 += 7;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 170) && (TP_State->X <= 220))
- {
- Op1 = 1;
- display(0);
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 5) && (TP_State->X <= 55))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 6;
- display(middle1);
- }
- else
- {
- middle2 *=10;
- middle2 += 7;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 60) && (TP_State->X <= 110))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 7;
- display(middle1);
- }
- else
- {
- middle2 *=10;
- middle2 += 7;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 115) && (TP_State->X <= 165))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 8;
- display(middle1);
- }
- else
- {
- middle2 *=10;
- middle2 += 8;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 170) && (TP_State->X <= 220))
- {
- Op2 = 1;
- display(0);
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 5) && (TP_State->X <= 55))
- {
- if((Op1||Op2||Op3||Op4) == 0)
- {
- middle1 *=10;
- middle1 += 9;
- display(middle1);
- }
- else
- {
- middle2 *=10;
- middle2 += 9;
- display(middle2);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 60) && (TP_State->X <= 110))
- {
- if(Op1== 1)
- {
- result = middle1 + middle2;
- display(result);
- }
- else if(Op2== 1)
- {
- result = middle1 - middle2;
- display(result);
- }
- else if(Op3== 1)
- {
- result = middle1 * middle2;
- display(result);
- }
- else if(Op4== 1)
- {
- result = middle1 + middle2;
- display(result);
- }
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 115) && (TP_State->X <= 165))
- {
- Op3 = 1;
- display(0);
- }
- else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 170) && (TP_State->X <= 220))
- {
- Op4 = 1;
- display(0);
- }
- if(middle1 >9999)
- middle1 = 0;
- if(middle2 >9999)
- middle2 = 0;
- if(result >9999)
- result = 0;
- delay(8000);
- }
- }
- /**
- * @brief Configure the IO Expander and the Touch Panel.
- * @param None
- * @retval None
- */
- static void TP_Config(void)
- {
- /* Clear the LCD */
- LCD_Clear(LCD_COLOR_WHITE);
- /* Configure the IO Expander */
- if (IOE_Config() == IOE_OK)
- {
- LCD_SetFont(&Font16x24);
- LCD_SetTextColor(LCD_COLOR_BLUE2);
- LCD_DrawRect(5, 50, 50, 50);
- LCD_DisplayChar(LCD_LINE_3, 30, '0');
- LCD_DrawRect(60, 50, 50, 50);
- LCD_DisplayChar(LCD_LINE_3, 85, '1');
- LCD_DrawRect(115, 50, 50, 50);
- LCD_DisplayChar(LCD_LINE_3, 140, '2');
- LCD_DrawRect(170, 50, 50, 50);
- LCD_DisplayChar(LCD_LINE_3, 195, 'c');
- LCD_DrawRect(5, 105, 50, 50);
- LCD_DisplayChar(LCD_LINE_5, 30, '3');
- LCD_DrawRect(60, 105, 50, 50);
- LCD_DisplayChar(LCD_LINE_5, 85, '4');
- LCD_DrawRect(115, 105, 50, 50);
- LCD_DisplayChar(LCD_LINE_5, 140, '5');
- LCD_DrawRect(170, 105, 50, 50);
- LCD_DisplayChar(LCD_LINE_5, 195, '+');
- LCD_DrawRect(5, 160, 50, 50);
- LCD_DisplayChar(LCD_LINE_7, 30, '6');
- LCD_DrawRect(60, 160, 50, 50);
- LCD_DisplayChar(LCD_LINE_7, 85, '7');
- LCD_DrawRect(115, 160, 50, 50);
- LCD_DisplayChar(LCD_LINE_7, 140, '8');
- LCD_DrawRect(170, 160, 50, 50);
- LCD_DisplayChar(LCD_LINE_7, 195, '-');
- LCD_DrawRect(5, 215, 50, 50);
- LCD_DisplayChar(LCD_LINE_10, 30, '9');
- LCD_DrawRect(60, 215, 50, 50);
- LCD_DisplayChar(LCD_LINE_10, 85, '=');
- LCD_DrawRect(115, 215, 50, 50);
- LCD_DisplayChar(LCD_LINE_10, 140, '*');
- LCD_DrawRect(170, 215, 50, 50);
- LCD_DisplayChar(LCD_LINE_10, 195, '/');
- LCD_SetTextColor(LCD_COLOR_BLACK);
- LCD_DrawRect(2, 2, 47, 235);//先y后x
- }
- else
- {
- LCD_Clear(LCD_COLOR_RED);
- LCD_SetTextColor(LCD_COLOR_BLACK);
- LCD_DisplayStringLine(LCD_LINE_6,(uint8_t*)" IOE NOT OK ");
- LCD_DisplayStringLine(LCD_LINE_7,(uint8_t*)"Reset the board ");
- LCD_DisplayStringLine(LCD_LINE_8,(uint8_t*)"and try again ");
- }
- }
- void display(uint32_t dd)
- {
- LCD_DisplayChar(LCD_LINE_1, 30, 0x30+ dd/1000);
- LCD_DisplayChar(LCD_LINE_1, 46, 0x30+(dd%1000)/100);
- LCD_DisplayChar(LCD_LINE_1, 62, 0x30+((dd%1000)%100)/10);
- LCD_DisplayChar(LCD_LINE_1, 78, 0x30+(((dd%1000)%100)%10));
- }
- void delay(uint32_t ll)
- {
- uint32_t i,j;
- for(i=0;i<ll;i++)
- {
- for(j=1000;j>0;j--)
- ;
- }
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* Infinite loop */
- while (1)
- {
- }
- }
- #endif
- /**
- * @}
- */
- /**
- * @}
- */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
希望后来的人少走弯路。再重申一下这是个初版,有些等修改,每次运算完必须按C清一下。
以下是视频
|
赞赏
-
1
查看全部赞赏
-
|