当前位置:   article > 正文

STM32计算器(仿真文件+源代码)_基于stm32的计算器

基于stm32的计算器

STM32实现简单的计算器,有基本的加减乘除,需要的小伙伴请点赞拿走

原理图

源程序代码

main.c

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "stdio.h"
  4. #include "LCD1602.h"
  5. #include "keyscan.h"
  6. #include "tsensor.h"
  7. #include "usart.h"
  8. #include "rtc.h"
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. uchar table[]= {" "};
  12. unsigned char w_tab[]={"20200401044"};
  13. long int data_a=0;
  14. long int data_b=0;
  15. long int data_c=0;
  16. int flag_x=0;
  17. uchar dispaly[10];
  18. uchar i,j;
  19. uchar k=0;
  20. uint key=0xff;
  21. uchar a=0;
  22. uchar b=5;
  23. uchar c=0;
  24. uchar d=5;
  25. uchar x=0;
  26. void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
  27. {
  28. if(y==0) //
  29. {
  30. LCD_write_cmd(0x80 + x); //
  31. }
  32. else //
  33. {
  34. LCD_write_cmd(0xc0 + x); //
  35. }
  36. LCD_write_data(Data); //
  37. }
  38. void display_a() //
  39. {
  40. dispaly[4]=data_a%100000/10000; //
  41. dispaly[3]=data_a%10000/1000; //
  42. dispaly[2]=data_a%1000/100; //
  43. dispaly[1]=data_a%100/10; //
  44. dispaly[0]=data_a%10; //
  45. LCD_write_cmd(0x80+0); //
  46. if(data_a>9999)
  47. {
  48. LCD_write_data('0'+dispaly[4]); //
  49. }
  50. if(data_a>999)
  51. {
  52. LCD_write_data('0'+dispaly[3]); //
  53. }
  54. if(data_a>99)
  55. {
  56. LCD_write_data('0'+dispaly[2]); //
  57. }
  58. if(data_a>9)
  59. {
  60. LCD_write_data('0'+dispaly[1]); //
  61. }
  62. LCD_write_data('0'+dispaly[0]); //
  63. }
  64. void display_b() //
  65. {
  66. LCD_write_cmd(0x80+8); //
  67. dispaly[4]=data_b%100000/10000; //
  68. dispaly[3]=data_b%10000/1000; //
  69. dispaly[2]=data_b%1000/100;
  70. dispaly[1]=data_b%100/10; //
  71. dispaly[0]=data_b%10; //
  72. if(data_b>9999)
  73. {
  74. LCD_write_data('0'+dispaly[4]); //
  75. }
  76. if(data_b>999)
  77. {
  78. LCD_write_data('0'+dispaly[3]); //
  79. }
  80. if(data_b>99)
  81. {
  82. LCD_write_data('0'+dispaly[2]); //
  83. }
  84. if(data_b>9)
  85. {
  86. LCD_write_data('0'+dispaly[1]); //
  87. }
  88. LCD_write_data('0'+dispaly[0]); //
  89. }
  90. void display_c(x)
  91. {
  92. if(data_c<100000000&&data_c>-1) //
  93. {
  94. dispaly[8]=data_c%1000000000/100000000; //
  95. dispaly[7]=data_c%100000000/10000000; //
  96. dispaly[6]=data_c%10000000/1000000; //
  97. dispaly[5]=data_c%1000000/100000; //
  98. dispaly[4]=data_c%100000/10000; //
  99. dispaly[3]=data_c%10000/1000; //
  100. dispaly[2]=data_c%1000/100; //
  101. dispaly[1]=data_c%100/10; //
  102. dispaly[0]=data_c%10; //
  103. LCD_write_cmd(0x80+0x40+7); //
  104. }
  105. else
  106. {
  107. if(data_c>99999999)
  108. {
  109. LCD_write_data('0'+dispaly[8]); //
  110. }
  111. if(data_c>9999999)
  112. {
  113. LCD_write_data('0'+dispaly[7]); //
  114. }
  115. if(data_c>999999)
  116. {
  117. LCD_write_data('0'+dispaly[6]); //
  118. }
  119. if(data_c>99999)
  120. {
  121. LCD_write_data('0'+dispaly[5]); //
  122. }
  123. if(data_c>9999)
  124. {
  125. LCD_write_data('0'+dispaly[4]); //
  126. }
  127. if(data_c>999)
  128. {
  129. LCD_write_data('0'+dispaly[3]); //
  130. }
  131. if(data_c>99)
  132. {
  133. LCD_write_data('0'+dispaly[2]); //
  134. }
  135. if(data_c>9)
  136. {
  137. LCD_write_data('0'+dispaly[1]); //
  138. }
  139. LCD_write_data('0'+dispaly[0]); //
  140. }
  141. }
  142. else //
  143. {
  144. LCD_write_cmd(0x80+0x40+11); //
  145. LCD_write_data('E'); //
  146. LCD_write_data('r'); //
  147. LCD_write_data('r'); //
  148. LCD_write_data('o'); //
  149. LCD_write_data('r'); //
  150. }
  151. }
  152. void eql(uchar yunsuan) //
  153. {
  154. switch(yunsuan) //
  155. {
  156. case 1: data_c=data_a+data_b; //
  157. break; //
  158. case 2: if(data_a>=data_b) //
  159. {
  160. data_c=data_a-data_b; //
  161. }
  162. else //
  163. {
  164. data_c=data_b-data_a; //
  165. W_lcd(5,1,'-'); //
  166. }
  167. break; //
  168. case 3: data_c=(data_a*data_b); //
  169. break; //
  170. case 4: if(data_b==0) //
  171. {
  172. LCD_write_string(1,1,"Error");//
  173. }
  174. else
  175. {
  176. data_c=data_a/data_b;//
  177. }
  178. break; //
  179. case 0: break; //
  180. }
  181. }
  182. void main(void)
  183. {
  184. int flag=1;
  185. LCD_init(); //
  186. LCD_write_cmd(0x01); //
  187. display_a(); //
  188. delay_init();
  189. while(1)
  190. {
  191. if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))
  192. {
  193. while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0));
  194. flag_x=1;
  195. LCD_write_string(0,0,table);
  196. display_a();
  197. }
  198. if(flag_x==1)
  199. {
  200. //GPIO_ResetBits(GPIOA,GPIO_Pin_12);
  201. //display_a();
  202. key=keyscan(); //
  203. //delay_ms(500);
  204. if(key!=0xff) //
  205. {
  206. if(key<10&&flag==1)
  207. {
  208. if(a<5) //n<5
  209. {
  210. data_a=data_a*10+key; //
  211. b=5; //m=5
  212. display_a(); //
  213. }
  214. a++; //n+1
  215. if(b<5) //m<5
  216. {
  217. data_b=data_b*10+key; //
  218. a=6; //n=6
  219. display_b(); //
  220. }
  221. b++; //m+1
  222. }
  223. if(key<10&&flag!=1)
  224. {
  225. if(c<5)
  226. {
  227. LCD_write_cmd(0x01); //
  228. data_a=data_c;
  229. data_b=0; //
  230. display_a(); //
  231. display_b();
  232. b=5; //m=5 //
  233. c=6;
  234. }
  235. if(b<5) //m<5
  236. {
  237. data_b=data_b*10+key; //
  238. c=6;
  239. display_b(); //
  240. }
  241. b++; //m+1
  242. }
  243. else
  244. {
  245. switch(key) //
  246. {
  247. case 10:a=5;b=0;x=1;c=5;
  248. W_lcd(6,0,'+'); //
  249. break;
  250. case 11:a=5;b=0;x=2;c=5;
  251. W_lcd(6,0,'-'); //
  252. break; //
  253. case 12:a=5;b=0;x=3;c=5;
  254. W_lcd(6,0,'*'); //
  255. break; //
  256. case 13:a=5;b=0;x=4;c=5;
  257. W_lcd(6,0,'/'); //
  258. break; //
  259. case 14:a=5;b=5;c=0;
  260. eql(x); //
  261. W_lcd(0,1,'='); //
  262. display_c(x); //
  263. flag++;
  264. break; //
  265. case 15:a=0;x=0;b=0;c=0;flag=1;
  266. data_a=0; //aÊý¾ÝÇå0
  267. data_b=0; //bÊý¾ÝÇå0
  268. data_c=0; //cÊý¾ÝÇå0
  269. LCD_write_string(0,0,table);
  270. LCD_write_string(0,1,table);
  271. W_lcd(0,0,'0'); //
  272. break; //
  273. }
  274. }
  275. do{key=keyscan();}
  276. while(key!=0xff); //
  277. /*
  278. while(key!=0xff)
  279. {
  280. key=keyscan();
  281. }*/
  282. }//(0xff!=key)
  283. }
  284. else
  285. {
  286. LCD_write_string(0,0,w_tab);
  287. }
  288. }//while
  289. }//main

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/441030
推荐阅读
相关标签
  

闽ICP备14008679号