3423|3

1万

帖子

16

TA的资源

版主

楼主
 

【晒设计方案】简易计算器V1.00 [复制链接]

本帖最后由 ddllxxrr 于 2014-3-4 18:25 编辑

近两天用STM32F429i开发板搞了个计算器。原理如下:

1、用画图函数画出计算器的操作键盘。

2、用触摸屏程序去定位。根据定位采取相应的行动。

3、用到三个变量,一个记没有按操作符前的数值,一个记按操作符后的数据。结果在result变量中存储。


由于本人开发的为简易计算器。现在把操作顺序说一下:

点数字时稍快点显示出来了马上撒。按操作符号后显示清零。再按下一个数。

本次版本的计算器。只能到9999且不含小数。若超9999无论是操作数还是结果马上清零。决不姑息。




为了方便大家,我把主程序贴出。其实这个只要覆盖,触摸按键的例程就可以马上执行
  1. /**
  2. ******************************************************************************
  3. * @file Touch_Panel/main.c
  4. * @author MCD Application Team
  5. * @version V1.0.1
  6. * @date 11-November-2013
  7. * @brief This example describes how to configure and use the touch panel
  8. * mounted on STM32F429I-DISCO boards.
  9. ******************************************************************************
  10. * @attention
  11. *
  12. * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
  13. *
  14. * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  15. * You may not use this file except in compliance with the License.
  16. * You may obtain a copy of the License at:
  17. *
  18. * http://www.st.com/software_license_agreement_liberty_v2
  19. *
  20. * Unless required by applicable law or agreed to in writing, software
  21. * distributed under the License is distributed on an "AS IS" BASIS,
  22. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23. * See the License for the specific language governing permissions and
  24. * limitations under the License.
  25. *
  26. ******************************************************************************
  27. */

  28. /* Includes ------------------------------------------------------------------*/
  29. #include "main.h"
  30. uint8_t Op1;
  31. uint8_t Op2;
  32. uint8_t Op3;
  33. uint8_t Op4;
  34. uint32_t middle1;
  35. uint32_t middle2;
  36. uint32_t result;

  37. /** @addtogroup STM32F429I_DISCOVERY_Examples
  38. * @{
  39. */

  40. /** @addtogroup Touch_Panel
  41. * @{
  42. */

  43. /* Private typedef -----------------------------------------------------------*/
  44. /* Private define ------------------------------------------------------------*/
  45. /* Private macro -------------------------------------------------------------*/
  46. /* Private variables ---------------------------------------------------------*/
  47. /* Private function prototypes -----------------------------------------------*/
  48. static void TP_Config(void);
  49. void display(uint32_t dd);
  50. void delay(uint32_t ll);
  51. /* Private functions ---------------------------------------------------------*/

  52. /**
  53. * @brief Main program
  54. * @param None
  55. * @retval None
  56. */
  57. int main(void)
  58. {

  59. //uint16_t linenum = 0;
  60. static TP_STATE* TP_State;

  61. /*!< At this stage the microcontroller clock setting is already configured,
  62. this is done through SystemInit() function which is called from startup
  63. file (startup_stm32f429_439xx.s) before to branch to application main.
  64. To reconfigure the default setting of SystemInit() function, refer to
  65. system_stm32f4xx.c file
  66. */

  67. /* LCD initialization */
  68. LCD_Init();

  69. /* LCD Layer initialization */
  70. LCD_LayerInit();

  71. /* Enable the LTDC */
  72. LTDC_Cmd(ENABLE);

  73. /* Set LCD foreground layer */
  74. LCD_SetLayer(LCD_FOREGROUND_LAYER);

  75. /* Touch Panel configuration */
  76. TP_Config();

  77. while (1)
  78. {


  79. TP_State = IOE_TP_GetState();


  80. if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 5) && (TP_State->X <= 55))
  81. {
  82. if((Op1||Op2||Op3||Op4) == 0)
  83. {
  84. middle1*=10;
  85. middle1+=0;
  86. display(middle1);
  87. }
  88. else
  89. {
  90. middle2*=10;
  91. middle2+=0;
  92. display(middle2);
  93. }
  94. }
  95. else if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 60) && (TP_State->X <= 110))
  96. {
  97. if((Op1||Op2||Op3||Op4) == 0)
  98. {
  99. middle1*=10;
  100. middle1 += 1;
  101. display(middle1);
  102. }
  103. else
  104. {
  105. middle2*=10;
  106. middle2 += 1;
  107. display(middle2);
  108. }
  109. }
  110. else if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 115) && (TP_State->X <= 165))
  111. {
  112. if((Op1||Op2||Op3||Op4) == 0)
  113. {
  114. middle1*=10;
  115. middle1 += 2;
  116. display(middle1);
  117. }
  118. else
  119. {
  120. middle2*=10;
  121. middle2 += 2;
  122. display(middle2);
  123. }

  124. }
  125. else if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 170) && (TP_State->X <= 220))
  126. {
  127. middle1 = 0;
  128. middle2 = 0;
  129. Op1 = 0;
  130. Op2 = 0;
  131. Op3 = 0;
  132. Op4 = 0;
  133. if((Op1||Op2||Op3||Op4) == 0)
  134. display(0);
  135. else
  136. display(0);
  137. }

  138. else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 5) && (TP_State->X <= 55))
  139. {
  140. if((Op1||Op2||Op3||Op4) == 0)
  141. {
  142. middle1 *=10;
  143. middle1 += 3;
  144. display(middle1);
  145. }
  146. }
  147. else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 60) && (TP_State->X <= 110))
  148. {
  149. if((Op1||Op2||Op3||Op4) == 0)
  150. {
  151. middle1 *=10;
  152. middle1 += 4;
  153. display(middle1);
  154. }
  155. else
  156. {
  157. middle2 *=10;
  158. middle2 += 4;
  159. display(middle2);
  160. }
  161. }
  162. else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 115) && (TP_State->X <= 165))
  163. {
  164. if((Op1||Op2||Op3||Op4) == 0)
  165. {
  166. middle1 *=10;
  167. middle1 += 5;
  168. display(middle1);
  169. }
  170. else
  171. {
  172. middle2 *=10;
  173. middle2 += 7;
  174. display(middle2);
  175. }
  176. }
  177. else if ((TP_State->TouchDetected) && (TP_State->Y <= 155) && (TP_State->Y >= 105) && (TP_State->X >= 170) && (TP_State->X <= 220))
  178. {
  179. Op1 = 1;
  180. display(0);
  181. }

  182. else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 5) && (TP_State->X <= 55))
  183. {
  184. if((Op1||Op2||Op3||Op4) == 0)
  185. {
  186. middle1 *=10;
  187. middle1 += 6;
  188. display(middle1);
  189. }
  190. else
  191. {
  192. middle2 *=10;
  193. middle2 += 7;
  194. display(middle2);
  195. }

  196. }
  197. else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 60) && (TP_State->X <= 110))
  198. {
  199. if((Op1||Op2||Op3||Op4) == 0)
  200. {
  201. middle1 *=10;
  202. middle1 += 7;
  203. display(middle1);
  204. }
  205. else
  206. {
  207. middle2 *=10;
  208. middle2 += 7;
  209. display(middle2);
  210. }
  211. }
  212. else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 115) && (TP_State->X <= 165))
  213. {
  214. if((Op1||Op2||Op3||Op4) == 0)
  215. {
  216. middle1 *=10;
  217. middle1 += 8;
  218. display(middle1);
  219. }
  220. else
  221. {
  222. middle2 *=10;
  223. middle2 += 8;
  224. display(middle2);
  225. }
  226. }
  227. else if ((TP_State->TouchDetected) && (TP_State->Y <= 210) && (TP_State->Y >= 160) && (TP_State->X >= 170) && (TP_State->X <= 220))
  228. {
  229. Op2 = 1;
  230. display(0);
  231. }

  232. else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 5) && (TP_State->X <= 55))
  233. {
  234. if((Op1||Op2||Op3||Op4) == 0)
  235. {
  236. middle1 *=10;
  237. middle1 += 9;
  238. display(middle1);
  239. }
  240. else
  241. {
  242. middle2 *=10;
  243. middle2 += 9;
  244. display(middle2);
  245. }
  246. }
  247. else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 60) && (TP_State->X <= 110))
  248. {
  249. if(Op1== 1)
  250. {
  251. result = middle1 + middle2;
  252. display(result);
  253. }
  254. else if(Op2== 1)
  255. {
  256. result = middle1 - middle2;
  257. display(result);
  258. }
  259. else if(Op3== 1)
  260. {
  261. result = middle1 * middle2;
  262. display(result);
  263. }
  264. else if(Op4== 1)
  265. {
  266. result = middle1 + middle2;
  267. display(result);
  268. }
  269. }
  270. else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 115) && (TP_State->X <= 165))
  271. {
  272. Op3 = 1;
  273. display(0);
  274. }
  275. else if ((TP_State->TouchDetected) && (TP_State->Y <= 265) && (TP_State->Y >= 215) && (TP_State->X >= 170) && (TP_State->X <= 220))
  276. {
  277. Op4 = 1;
  278. display(0);
  279. }
  280. if(middle1 >9999)
  281. middle1 = 0;
  282. if(middle2 >9999)
  283. middle2 = 0;
  284. if(result >9999)
  285. result = 0;
  286. delay(8000);

  287. }
  288. }

  289. /**
  290. * @brief Configure the IO Expander and the Touch Panel.
  291. * @param None
  292. * @retval None
  293. */
  294. static void TP_Config(void)
  295. {
  296. /* Clear the LCD */
  297. LCD_Clear(LCD_COLOR_WHITE);

  298. /* Configure the IO Expander */
  299. if (IOE_Config() == IOE_OK)
  300. {

  301. LCD_SetFont(&Font16x24);
  302. LCD_SetTextColor(LCD_COLOR_BLUE2);
  303. LCD_DrawRect(5, 50, 50, 50);
  304. LCD_DisplayChar(LCD_LINE_3, 30, '0');
  305. LCD_DrawRect(60, 50, 50, 50);
  306. LCD_DisplayChar(LCD_LINE_3, 85, '1');
  307. LCD_DrawRect(115, 50, 50, 50);
  308. LCD_DisplayChar(LCD_LINE_3, 140, '2');
  309. LCD_DrawRect(170, 50, 50, 50);
  310. LCD_DisplayChar(LCD_LINE_3, 195, 'c');

  311. LCD_DrawRect(5, 105, 50, 50);
  312. LCD_DisplayChar(LCD_LINE_5, 30, '3');
  313. LCD_DrawRect(60, 105, 50, 50);
  314. LCD_DisplayChar(LCD_LINE_5, 85, '4');
  315. LCD_DrawRect(115, 105, 50, 50);
  316. LCD_DisplayChar(LCD_LINE_5, 140, '5');
  317. LCD_DrawRect(170, 105, 50, 50);
  318. LCD_DisplayChar(LCD_LINE_5, 195, '+');

  319. LCD_DrawRect(5, 160, 50, 50);
  320. LCD_DisplayChar(LCD_LINE_7, 30, '6');
  321. LCD_DrawRect(60, 160, 50, 50);
  322. LCD_DisplayChar(LCD_LINE_7, 85, '7');
  323. LCD_DrawRect(115, 160, 50, 50);
  324. LCD_DisplayChar(LCD_LINE_7, 140, '8');
  325. LCD_DrawRect(170, 160, 50, 50);
  326. LCD_DisplayChar(LCD_LINE_7, 195, '-');

  327. LCD_DrawRect(5, 215, 50, 50);
  328. LCD_DisplayChar(LCD_LINE_10, 30, '9');
  329. LCD_DrawRect(60, 215, 50, 50);
  330. LCD_DisplayChar(LCD_LINE_10, 85, '=');
  331. LCD_DrawRect(115, 215, 50, 50);
  332. LCD_DisplayChar(LCD_LINE_10, 140, '*');
  333. LCD_DrawRect(170, 215, 50, 50);
  334. LCD_DisplayChar(LCD_LINE_10, 195, '/');

  335. LCD_SetTextColor(LCD_COLOR_BLACK);
  336. LCD_DrawRect(2, 2, 47, 235);//先y后x


  337. }
  338. else
  339. {
  340. LCD_Clear(LCD_COLOR_RED);
  341. LCD_SetTextColor(LCD_COLOR_BLACK);
  342. LCD_DisplayStringLine(LCD_LINE_6,(uint8_t*)" IOE NOT OK ");
  343. LCD_DisplayStringLine(LCD_LINE_7,(uint8_t*)"Reset the board ");
  344. LCD_DisplayStringLine(LCD_LINE_8,(uint8_t*)"and try again ");
  345. }
  346. }

  347. void display(uint32_t dd)
  348. {
  349. LCD_DisplayChar(LCD_LINE_1, 30, 0x30+ dd/1000);
  350. LCD_DisplayChar(LCD_LINE_1, 46, 0x30+(dd%1000)/100);
  351. LCD_DisplayChar(LCD_LINE_1, 62, 0x30+((dd%1000)%100)/10);
  352. LCD_DisplayChar(LCD_LINE_1, 78, 0x30+(((dd%1000)%100)%10));

  353. }

  354. void delay(uint32_t ll)
  355. {
  356. uint32_t i,j;
  357. for(i=0;i<ll;i++)
  358. {
  359. for(j=1000;j>0;j--)
  360. ;
  361. }

  362. }

  363. #ifdef USE_FULL_ASSERT

  364. /**
  365. * @brief Reports the name of the source file and the source line number
  366. * where the assert_param error has occurred.
  367. * @param file: pointer to the source file name
  368. * @param line: assert_param error line source number
  369. * @retval None
  370. */
  371. void assert_failed(uint8_t* file, uint32_t line)
  372. {
  373. /* User can add his own implementation to report the file name and line number,
  374. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  375. /* Infinite loop */
  376. while (1)
  377. {
  378. }
  379. }
  380. #endif

  381. /**
  382. * @}
  383. */

  384. /**
  385. * @}
  386. */

  387. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码

希望后来的人少走弯路。再重申一下这是个初版,有些等修改,每次运算完必须按C清一下。

以下是视频








此帖出自stm32/stm8论坛

最新回复

楼主搞得非常好!力挺! 不过楼主大量使用触屏的位置判断,如: if ((TP_State->TouchDetected) && (TP_State->Y Y >= 50) && (TP_State->X >= 170) && (TP_State->X   详情 回复 发表于 2014-3-10 13:56

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

6040

帖子

202

TA的资源

版主

沙发
 
一下发了四个……
此帖出自stm32/stm8论坛
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 
本帖最后由 ddllxxrr 于 2014-3-5 06:16 编辑

我这边提示内部问题,您发的贴子显示不出,所以就一个劲地按。。。。。
此帖出自stm32/stm8论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 

回复

1万

帖子

28

TA的资源

裸片初长成(高级)

4
 
楼主搞得非常好!力挺!


不过楼主大量使用触屏的位置判断,如:

if ((TP_State->TouchDetected) && (TP_State->Y <= 100) && (TP_State->Y >= 50) && (TP_State->X >= 170) && (TP_State->X <= 220))

能不能将它使用运算的办法统一处理按键问题,得出123后就好办了
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表