找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9005|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机的完整计算器汇编语言程序

[复制链接]
跳转到指定楼层
楼主
ID:206309 发表于 2017-5-31 12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机的完整计算器程序

单片机源程序如下:

  1. ;$$$$变量定义区(30H-)$$$$$

  2. OUTBIT EQU P2 ; 位控制口

  3. OUTSEG EQU P0 ; 段控制口

  4. ROW_COLUMN EQU P1 ; 读键盘行线口

  5. VARIABLE_DELAY1 EQU 30H        ;延时变量

  6. VARIABLE_DELAY2 EQU 31H

  7. VARIABLE_STORE1        EQU 32H        ;存储第一个输入数

  8. VARIABLE_STORE2 EQU 33H

  9. VARIABLE_STORE3 EQU 34H        ;存储第二个输入数

  10. VARIABLE_STORE4 EQU 35H

  11. VARIABLE_STORE5 EQU 36H        ;存储最后结果

  12. VARIABLE_STORE6 EQU 37H

  13. VARIABLE_INPUT1A EQU 38H        ;第一个输入数保存地址

  14. VARIABLE_INPUT1B EQU 39H

  15. VARIABLE_INPUT1C EQU 3AH

  16. VARIABLE_INPUT1D EQU 3BH

  17. VARIABLE_INPUT2A EQU 3CH        ;第二个输入数保存地址

  18. VARIABLE_INPUT2B EQU 3DH

  19. VARIABLE_INPUT2C EQU 3EH

  20. VARIABLE_INPUT2D EQU 3FH

  21. VARIABLE_REPLACE_POINT EQU 40H        ;结果显示位置指针

  22. ;VARIABLE_RESULTB EQU 41H

  23. ;VARIABLE_RESULTC EQU 42H

  24. ;VARIABLE_RESULTD EQU 43H

  25. VARIABLE_SIGN1 EQU 44H        ;保存第一个符号位

  26. VARIABLE_SIGN2 EQU 45H        ;保存第二个符号位

  27. VARIABLE_INPUT1_POINT EQU 46H ;第一个输入数状态指针,记录输入的位数

  28. VARIABLE_INPUT2_POINT EQU 47H ;第二个输入数状态指针,记录输入的位数

  29. VARIABLE_RESULT_POINT EQU 48H ;第二个输入数状态指针,记录输入的位数

  30. VARIABLE_PLACE1_POINT EQU 49H        ;第一个输入数位置指针

  31. VARIABLE_PLACE2_POINT EQU 4AH        ;第一个输入数位置指针

  32. VARIABLE_LEDBUF_POINT EQU 4BH        ;第一个输入数位置指针

  33. VARIABLE_LEDBUF EQU 4CH ; 显示缓冲

  34. S1 EQU 50H        ;自定义数字电路入口与出口

  35. S2 EQU 51H        ;功能1实现:将分离个位数字(S1-S5),转化为十进制,存储在S6,S7

  36. S3 EQU 52H        ;功能2实现:将十进制位数字(S6-S7),转化为个位数字,存储在(S1-S5)

  37. S4 EQU 53H        ;S1(最高位),S5(最低位)

  38. S5 EQU 54H

  39. S6 EQU 55H

  40. S7 EQU 56H

  41. KEY1 BIT P3.2

  42. KEY2 BIT P3.3

  43. KEY3 BIT P3.4

  44. KEY4 BIT P3.5

  45. ;****************************************************进入主程序*****************************************************************************

  46. ORG 0000H

  47. AJMP STABLE

  48. ORG 0100H

  49. ; *****************************************************键码定义和键值定义*******************************************************************

  50. LEDMAP: ; 八段管显示码(共阳极)

  51. DB 0C0h, 0F9h, 0A4h, 0B0h, 099h, 092h, 082h, 0F8h,080h, 090h, 088h, 083h,0C6H

  52. KEYTABLE:

  53. DB 00h, 04h, 08h

  54. DB 01h, 05h, 09h

  55. DB 02h, 06h, 0Ah

  56. DB 03h, 07h, 0Bh

  57. ;$$$$子程序区$$$

  58. $$$

  59. ;****************************************************延时程序(30H,31H)**********************************************************************

  60. DELAY:

  61. MOV VARIABLE_DELAY1,#10H

  62. DE1:

  63. MOV VARIABLE_DELAY2,#06FH

  64. DE:

  65. DJNZ VARIABLE_DELAY2,DE

  66. DJNZ VARIABLE_DELAY1 ,DE1

  67. RET

  68. ;***************************************************扫描按键程序*****************************************************************************

  69. SCANNING:

  70. JNB KEY1,FUNCTION1_SIGN1

  71. JNB KEY2,FUNCTION2_SIGN1

  72. JNB KEY3,FUNCTION3_SIGN1

  73. JNB KEY4,FUNCTION4_SIGN1

  74. RET

  75. ;****************************************************第一个符号位保存程序*****************************************************************

  76. FUNCTION1_SIGN1:

  77. MOV VARIABLE_SIGN1,#1

  78. SJMP SCANNING

  79. FUNCTION2_SIGN1:

  80. MOV VARIABLE_SIGN1,#2

  81. SJMP SCANNING

  82. FUNCTION3_SIGN1:

  83. MOV VARIABLE_SIGN1,#3

  84. SJMP SCANNING

  85. FUNCTION4_SIGN1:

  86. MOV VARIABLE_SIGN1,#4

  87. SJMP SCANNING

  88. ;****************************************************LED显示程序****************************************************************************

  89. DISPLAYLED:

  90. MOV R0, #VARIABLE_LEDBUF

  91. MOV R1, #4 ; 共4个八段管

  92. MOV R2, #11111110B ; 从左边开始显示

  93. LOOP:

  94. MOV OUTBIT, #0FFH        ; 关所有八段管

  95. MOV OUTSEG, @R0

  96. MOV OUTBIT, R2 ; 显示一位八段管

  97. ACALL DELAY        ;

  98. MOV A, R2 ; 位选选中下一位

  99. RL A        ;

  100. MOV R2, A        ;

  101. INC R0

  102. DJNZ R1, LOOP

  103. RET

  104. ;**************************************************行值局部程序*****************************************************************************

  105. GET_ROW1:

  106. MOV A,ROW_COLUMN ; 读入键状态

  107. ORL A, #0f8h ; 高5位不用,变为11111

  108. CPL A        ;11111110->00000001,11111101->00000010,11111011->00000100,        1,2,4

  109. RET

  110. ;*******************************得到行值程序,出口参数R3(行值)**********************************************************************************

  111. GET_ROW:

  112. MOV ROW_COLUMN,#07H        ;将行线置1.列线置0

  113. MOV R3,#0FFH

  114. ACALL GET_ROW1

  115. GE1:

  116. RRC A

  117. INC R3

  118. JC GE2

  119. SJMP GE1

  120. GE2:

  121. RET

  122. ;***************************得到列值程序,出口参数R4(列值),所用寄存器R1,R2********************************************        ***************

  123. GET_COLUMN:

  124. MOV ROW_COLUMN,#07H        ;将行线置1.列线置0

  125. MOV R2, #4

  126. KLoop:

  127. CJNE R2,#4,NEXT1

  128. MOV A,#01FH

  129. AJMP NEXT5

  130. NEXT1:

  131. CJNE R2,#3,NEXT2

  132. MOV A,#02FH

  133. AJMP NEXT5

  134. NEXT2:

  135. CJNE R2,#2,NEXT3

  136. MOV A,#04FH

  137. AJMP NEXT5

  138. NEXT3:

  139. CJNE R2,#1,NEXT5

  140. MOV A,#08FH

  141. NEXT5:

  142. MOV ROW_COLUMN, a

  143. ACALL GET_ROW1        ;调用得到行值时需要给出列值的状态

  144. JZ GOON1 ;当

  145. A为零时,说明本列有键按下

  146. DJNZ R2, KLoop        ;扫描四次直至将全部列扫描完毕

  147. GOON1:

  148. MOV A, #4        ;列值减1

  149. SUBB A,R2

  150. MOV R4,A

  151. RET

  152. ;************键值计算程序,入口参数,R3(行值),R4(列值),出口参数R5(键值)******************************************************************

  153. CALCULATE_KEY: ;键值 = 列 X 3 + 行

  154. MOV A,R4

  155. MOV B,#3

  156. MUL AB

  157. ADD A,R3

  158. MOV DPTR,#KEYTABLE

  159. ACALL LOOK_UP_TABLE

  160. MOV R5,A

  161. RET

  162. ;**************************************************按键抖动去除程序**********************************************************************

  163. WAIT_RELEASE:

  164. ACALL TEST_KEY

  165. JNZ WAIT_RELEASE

  166. RET

  167. ;************************************************得到键值总程序,出口参数R5(键值)********************************************************************

  168. GET_KEY:

  169. ACALL GET_ROW

  170. ACALL GET_COLUMN

  171. ACALL CALCULATE_KEY

  172. ACALL WAIT_RELEASE

  173. RET

  174. ;*****************************************************测试按键是否按下程序,出口参数A***********************************************

  175. TEST_KEY:

  176. MOV ROW_COLUMN,#07H        ;将行线置1.列线置0

  177. ACALL GET_ROW1

  178. RET

  179. ;**********************************************计算器输入第一个数程序****************************************************************

  180. CALCULATOR_INPUT1: ;USE:R0,R1,R2;出口参数R5

  181. MOV R1,VARIABLE_PLACE1_POINT ;将所得键码送入相应存储区

  182. MOV A,R5

  183. MOV @R1,A

  184. INC VARIABLE_PLACE1_POINT

  185. ACALL LOOK_UP_TABLE1        ;将所得段码送入相应缓冲区

  186. MOV R0,VARIABLE_LEDBUF_POINT

  187. MOV @R0,A

  188. INC VARIABLE_LEDBUF_POINT

  189. RET

  190. ;**********************************************计算器输入第二个数程序****************************************************************

  191. CALCULATOR_INPUT2: ;USE:R0,R1,R2;出口参数R5

  192. CLR C

  193. MOV A,R5

  194. CAL1:

  195. INC VARIABLE_INPUT2_POINT

  196. MOV R2,VARIABLE_INPUT2_POINT

  197. CJNE R2,#5,CAL4

  198. SJMP CAL5        ;输入四个数后,第五个数一定为符号位

  199. CAL4:

  200. SUBB A,#8

  201. JC CAL2        ;符号位应大等于8

  202. SJMP CAL3

  203. CAL2:

  204. ADDC A,#8

  205. MOV R1,VARIABLE_PLACE2_POINT ;将所得键码送入相应存储区

  206. MOV @R1,A

  207. INC VARIABLE_PLACE2_POINT

  208. ACALL LOOK_UP_TABLE1        ;将所得段码送入相应缓冲区

  209. MOV R0,VARIABLE_LEDBUF_POINT

  210. MOV @R0,A

  211. INC VARIABLE_LEDBUF_POINT

  212. SJMP CAL5

  213. CAL3:

  214. ADD A,#8

  215. CAL5:

  216. RET

  217. ;************************************************************整合程序1***********************************************************************

  218. INTEGRATE1:

  219. MOV R7, VARIABLE_INPUT1_POINT

  220. CJNE R7,#1,FF1

  221. MOV S5,VARIABLE_INPUT1A

  222. MOV S1,#0

  223. MOV S2,#0

  224. MOV S3,#0

  225. MOV S4,#0

  226. LCALL CALCULATOR_INTEGRATE

  227. AJMP NEXT22

  228. FF1:

  229. CJNE R

  230. 7,#2,FF2

  231. MOV S4,VARIABLE_INPUT1A

  232. MOV S5,VARIABLE_INPUT1B

  233. MOV S2,#0

  234. MOV S3,#0

  235. MOV S1,#0

  236. LCALL CALCULATOR_INTEGRATE

  237. AJMP NEXT22

  238. FF2:

  239. CJNE R7,#3,FF3

  240. MOV S3,VARIABLE_INPUT1A

  241. MOV S4,VARIABLE_INPUT1B

  242. MOV S5,VARIABLE_INPUT1C

  243. MOV S1,#0

  244. MOV S2,#0

  245. LCALL CALCULATOR_INTEGRATE

  246. AJMP NEXT22

  247. FF3:

  248. MOV S2,VARIABLE_INPUT1A

  249. MOV S3,VARIABLE_INPUT1B

  250. MOV S4,VARIABLE_INPUT1C

  251. MOV S5,VARIABLE_INPUT1D

  252. MOV S1,#0

  253. LCALL CALCULATOR_INTEGRATE

  254. NEXT22:

  255. MOV VARIABLE_STORE1,S6        ;将转化后的值存在S8和S9中

  256. MOV VARIABLE_STORE2,S7

  257. LCALL QL

  258. MOV VARIABLE_LEDBUF+0, #0FFH ;        显示管输完符号位后显示全灭

  259. MOV VARIABLE_LEDBUF+1, #0FFH

  260. MOV VARIABLE_LEDBUF+2, #0FFH

  261. MOV VARIABLE_LEDBUF+3, #0FFH

  262. MOV VARIABLE_LEDBUF_POINT,#VARIABLE_LEDBUF

  263. RET

  264. ;************************************************************整合程序2***********************************************************************

  265. INTEGRATE2:

  266. DEC VARIABLE_INPUT2_POINT

  267. MOV R7, VARIABLE_INPUT2_POINT

  268. CJNE R7,#1,FFI1

  269. MOV S5,VARIABLE_INPUT2A

  270. MOV S1,#0

  271. MOV S2,#0

  272. MOV S3,#0

  273. MOV S4,#0

  274. LCALL CALCULATOR_INTEGRATE

  275. AJMP NEXTI22

  276. FFI1:

  277. CJNE R7,#2,FFI2

  278. MOV S4,VARIABLE_INPUT2A

  279. MOV S5,VARIABLE_INPUT2B

  280. MOV S2,#0

  281. MOV S3,#0

  282. MOV S1,#0

  283. LCALL CALCULATOR_INTEGRATE

  284. AJMP NEXTI22

  285. FFI2:

  286. CJNE R7,#3,FFI3

  287. MOV S3,VARIABLE_INPUT2A

  288. MOV S4,VARIABLE_INPUT2B

  289. MOV S5,VARIABLE_INPUT2C

  290. MOV S1,#0

  291. MOV S2,#0

  292. LCALL CALCULATOR_INTEGRATE

  293. AJMP NEXTI22

  294. FFI3:

  295. MOV S2,VARIABLE_INPUT2A

  296. MOV S3,VARIABLE_INPUT2B

  297. MOV S4,VARIABLE_INPUT2C

  298. MOV S5,VARIABLE_INPUT2D

  299. MOV S1,#0

  300. LCALL CALCULATOR_INTEGRATE

  301. NEXTI22:

  302. MOV VARIABLE_STORE3,S6        ;将转化后的值存在S8和S9中

  303. MOV VARIABLE_STORE4,S7

  304. LCALL QL

  305. MOV VARIABLE_LEDBUF+0, #0FFH ;        显示管输完符号位后显示全灭

  306. MOV VARIABLE_LEDBUF+1, #0FFH

  307. MOV VARIABLE_LEDBUF+2, #0FFH

  308. MOV VARIABLE_LEDBUF+3, #0FFH

  309. MOV VARIABLE_LEDBUF_POINT,#VARIABLE_LEDBUF

  310. RET

  311. ;**********************************************计算器运算程序*****************************************************************************

  312. ;***********************************************计算器加法**********************************************************************************

  313. CALCULATOR_ADDITION:

  314. MOV R1,VARIABLE_STORE2        ;入口:R1(H),R0,R3(H),R2,出口:和R1(H),R0(L)

  315. MOV R0,VARIABLE_STORE1

  316. MOV R3,VARIABLE_STORE4

  317. MOV R2,VARIABLE_STORE3

  318. LCALL ADDITION

  319. MOV VARIABLE_STORE6,R1

  320. MOV VARIABLE_STORE5,R0

  321. MOV S7,VARIABLE_STORE6

  322. MOV S6,VARIABLE_STORE5

  323. LCALL CALCULATOR_SEPARATE

  324. RET

  325. ;*********************************************计算器减法***********************************************************************************

  326. CALCULATOR_SUBTRACTION:

  327. MOV R1,VARIABLE_STORE2

  328. MOV R0,VARIABLE_STORE1

  329. MOV R3,VARIABLE_STORE4

  330. MOV R2,VARIABLE_STORE3

  331. LCALL SUBTRACTION ;入口:减数R3(H),R2(L),被减数R1(H),R0(L),出口:差R1(H),R0(L)

  332. MOV VARIABLE_STORE6,R1

  333. MOV VARIABLE_STORE5,R0

  334. MOV S7,VARIABLE_STORE6

  335. MOV S6,VARIABLE_STORE5

  336. LCALL CALCULATOR_SEPARATE

  337. RET

  338. ;*********************************************计算器乘法***********************************************************************************

  339. CALCULATOR_MULTIPLICATION:

  340. MOV R1,VARIABLE_STORE2

  341. MOV R0,VARIABLE_STORE1

  342. MOV R3,VARIABLE_STORE4

  343. MOV R2,VARIABLE_STORE3

  344. LCALL MULTIPLICATION        ;入口:被乘数R3,R2,乘数R1,R0,结果R7,R6,R5,R4

  345. MOV VARIABLE_STORE6,R5

  346. MOV VARIABLE_STORE5,R4

  347. MOV S7,VARIABLE_STORE6

  348. MOV S6,VARIABLE_STORE5

  349. LCALL CALCULATOR_SEPARATE

  350. RET

  351. ;*********************************************计算器除法***********************************************************************************

  352. CALCULATOR_DIVISION:

  353. MOV R6,VARIABLE_STORE2        ;入口:R6(H),R7(L),被除数,R4(H),R5(L),除数,出口:商R6(H),R7(L),余R4(H),R5(L

  354. MOV R7,VARIABLE_STORE1

  355. MOV R4,VARIABLE_STORE4

  356. MOV R5,VARIABLE_STORE3

  357. LCALL DIVISION

  358. MOV VARIABLE_STORE6,R6

  359. MOV VARIABLE_STORE5,R7

  360. MOV S7,VARIABLE_STORE6

  361. MOV S6,VARIABLE_STORE5

  362. LCALL CALCULATOR_SEPARATE

  363. RET

  364. ;*********************************************设立最后计算器显示的位数和位置***********************************************************************************

  365. CALCULATOR_RESULT_DESIGN:        ;设立最后显示的位数

  366. MOV A,S1

  367. CJNE A,#0,H1

  368. MOV A,S2

  369. CJNE A,#0,H2

  370. MOV A,S3

  371. CJNE A,#0,H3

  372. MOV A,S4

  373. CJNE A,#0,H4

  374. MOV A,S5

  375. CJNE A,#0,H5

  376. RET

  377. H1:

  378. MOV VARIABLE_REPLACE_POINT,#S1        ;最后显示位置指针

  379. MOV VARIABLE_RESULT_POINT,#5

  380. RET

  381. H2:

  382. MOV VARIABLE_REPLACE_POINT,#S2

  383. MOV VARIABLE_RESULT_POINT,#4

  384. RET

  385. H3:

  386. MOV VARIABLE_REPLACE_POINT,#S3

  387. MOV VARIABLE_RESULT_POINT,#3

  388. RET

  389. H4:

  390. MOV VARIABLE_REPLACE_POINT,#S4

  391. MOV VARIABLE_RESULT_POINT,#2

  392. RET

  393. H5:

  394. MOV VARIABLE_REPLACE_POINT,#S5

  395. MOV VARIABLE_RESULT_POINT,#1

  396. RET

  397. ;***********************************************************显示结果送入缓冲区************************************************************

  398. RESULT_LEDBUF:

  399. MOV R7,#0

  400. NEXTR77:

  401. MOV A,R7

  402. CJNE A,VARIABLE_RESULT_POINT,NEXTR8        ;控制显示位数

  403. RET

  404. NEXTR8:

  405. INC R7

  406. MOV R1,VARIABLE_REPLACE_POINT        ;将显示位置的数字送给A寄存器

  407. MOV A,@R1

  408. LCALL LOOK_UP_TABLE1

  409. INC VARIABLE_REPLACE_POINT        ;显示位置后移

  410. MOV R0,VARIABLE_LEDBUF_POINT        ;将要显示段码送给缓冲区

  411. MOV @R0,A

  412. INC VARIABLE_LEDBUF_POINT

  413. SJMP NEXTR77

  414. ;;**********************************************************数字电路整合功能***************************************************************

  415. CALCULATOR_INTEGRATE:        ;出口参数S6,S7,入口参数,S1,S2,S3,S4,S5

  416. ACALL QL

  417. MOV R0,S1

  418. MOV R1,#0

  419. MOV DPTR, #10000

  420. MOV R3, DPH

  421. MOV R2, DPL

  422. ACALL MULTIPLICATION

  423. MOV S7, R5

  424. MOV S6, R4

  425. ACALL QL

  426. MOV R0,S2

  427. MOV R1,#0

  428. MOV DPTR, #1000

  429. MOV R3, DPH

  430. MOV R2,DPL

  431. ACALL MULTIPLICATION

  432. MOV A,R5

  433. MOV R1,A

  434. MOV A,R4

  435. MOV R0,A

  436. MOV R3,S7

  437. MOV R2,S6

  438. ACALL ADDITION

  439. MOV S7, R1

  440. MOV S6 ,R0

  441. ACALL QL

  442. MOV R0,S3

  443. MOV R1,#0

  444. MOV DPTR, #100

  445. MOV R3, DPH

  446. MOV R2, DPL

  447. ACALL MULTIPLICATION

  448. MOV A,R5

  449. MOV R1,A

  450. MOV A,R4

  451. MOV R0,A

  452. MOV R3,S7

  453. MOV R2,S6

  454. ACALL ADDITION

  455. MOV S7, R1

  456. MOV S6 ,R0

  457. ACALL QL

  458. MOV R0,S4

  459. MOV R1,#0

  460. MOV DPTR, #10

  461. MOV R3, DPH

  462. MOV R2, DPL

  463. ACALL MULTIPLICATION

  464. MOV A,R5

  465. MOV R1,A

  466. MOV A,R4

  467. MOV R0,A

  468. MOV R3,S7

  469. MOV R2,S6

  470. ACALL ADDITION

  471. MOV S7, R1

  472. MOV S6 ,R0

  473. ACALL QL

  474. MOV R0,S5

  475. MOV R1,#0

  476. MOV DPTR, #1

  477. MOV R3, DPH

  478. MOV R2, DPL

  479. ACALL MULTIPLICATION

  480. MOV A,R5

  481. MOV R1,A

  482. MOV A,R4

  483. MOV R0,A

  484. MOV R3,S7

  485. MOV R2,S6

  486. ACALL ADDITION

  487. MOV S7, R1

  488. MOV S6 ,R0

  489. RET

  490. ;************************************************************数字电路分离功能**************************************************************

  491. CALCULATOR_SEPARATE:        ;入口参数S6,S7,出口参数,S1,S2,S3,S4,S5

  492. ACALL QL

  493. MOV R6,S7

  494. MOV R7,S6

  495. MOV DPTR, #10000

  496. MOV R4, DPH

  497. MOV R5, DPL

  498. ACALL DIVISION

  499. MOV S1,R7

  500. MOV S7,R4

  501. MOV S6,R5

  502. ACALL QL

  503. MOV R6,S7

  504. MOV R7,S6

  505. MOV DPTR, #1000

  506. MOV R4, DPH

  507. MOV R5, DPL

  508. ACALL DIVISION

  509. MOV S2,R7

  510. MOV S7,R4

  511. MOV S6,R5

  512. ACALL QL

  513. MOV R6,S7

  514. MOV R7,S6

  515. MOV DPTR, #100

  516. MOV R4, DPH

  517. MOV R5, DPL

  518. ACALL DIVISION

  519. MOV S3,R7

  520. MOV S7,R4

  521. MOV S6,R5

  522. ACALL QL

  523. MOV R6,S7

  524. MOV R7,S6

  525. MOV DPTR, #10

  526. MOV R4, DPH

  527. MOV R5, DPL

  528. ACALL DIVISION

  529. MOV S4,R7

  530. MOV S7,R4

  531. MOV S6,R5

  532. ACALL QL

  533. MOV R6,S7

  534. MOV R7,S6

  535. MOV DPTR, #1

  536. MOV R4, DPH

  537. MOV R5, DPL

  538. ACALL DIVISION

  539. MOV S5,R7

  540. RET

  541. ;****************************************************0—-65535之内加减乘除*******************************************************************

  542. ;**********************************************************加法******************************************************************************

  543. ADDITION:        ;入口:R1(H),R0,R3(H),R2,出口:和R1(H),R0(L)

  544. MOV A,R0

  545. ADD A,R2

  546. MOV R0,A

  547. MOV A,R1

  548. ADDC A,R3

  549. MOV R1,A

  550. RET

  551. ;**********************************************************减法******************************************************************************

  552. SUBTRACTION: ;入口:减数R3(H),R2(L),被减数R1(H),R0(L),出口:差R1(H),R0(L)

  553. CLR C

  554. MOV A,R0

  555. SUBB A,R2

  556. MOV R0,A

  557. MOV A,R1

  558. SUBB A,R3

  559. MOV R1,A

  560. RET

  561. ;**********************************************************乘法******************************************************************************

  562. MULTIPLICATION:        ;入口:被乘数R3,R2,乘数R1,R0,结果R7,R6,R5,R4

  563. CLR A

  564. MOV

  565. R7, A

  566. MOV R6, A

  567. MOV R5, A

  568. MOV R4, A

  569. MOV 46H, #10H

  570. MULLOOP1:

  571. CLR C

  572. MOV A, R4

  573. RLC A

  574. MOV R4, A

  575. MOV A, R5

  576. RLC A

  577. MOV R5, A

  578. MOV A, R6

  579. RLC A

  580. MOV R6, A

  581. MOV A, R7

  582. RLC A

  583. MOV R7, A

  584. MOV A, R0

  585. RLC A

  586. MOV R0, A

  587. MOV A, R1

  588. RLC A

  589. MOV R1,A

  590. JNC MULLOOP2

  591. CLR C

  592. MOV A, R4

  593. ADDC A, R2

  594. MOV R4, A

  595. MOV A, R5

  596. ADDC A, R3

  597. MOV R5, A

  598. MOV A, R6

  599. ADDC A, #00H

  600. MOV R6, A

  601. MOV A, R7

  602. ADDC A, #00H

  603. MOV R7, A

  604. MULLOOP2: DJNZ 46H,MULLOOP1

  605. RET

  606. ;**********************************************************除法******************************************************************************

  607. DIVISION:        ;入口:R6(H),R7(L),被除数,R4(H),R5(L),除数,出口:商R6(H),R7(L),余R4(H),R5(L)

  608. UDIV:

  609. CLR C

  610. CLR A

  611. MOV R2,A

  612. MOV R3,A

  613. MOV B,#10H

  614. MOVBIT: MOV A,R7;R6、R7中数据左移一位到R2、R3中,C到R7

  615. RLC A

  616. MOV R7,A

  617. MOV A,R6

  618. RLC A

  619. MOV R6,A

  620. MOV A,R3

  621. RLC A

  622. MOV R3,A

  623. MOV A,R2

  624. RLC A

  625. MOV R2,A

  626. CLR C ;R2R3-R4R5

  627. MOV A,R3

  628. SUBB A,R5

  629. PUSH Acc

  630. MOV A,R2

  631. SUBB A,R4

  632. JBC Cy,MOVBIT0;不够减,清C继续左移

  633. MOV R2,A;够减,存回余数并置位C

  634. POP Acc

  635. MOV R3,A

  636. SETB C

  637. SJMP MOVBIT1

  638. MOVBIT0: POP Acc

  639. MOVBIT1: DJNZ B,MOVBIT

  640. MOV A,R7

  641. RLC A

  642. MOV R7,A

  643. MOV A,R6

  644. RLC A

  645. MOV R6,A

  646. MOV A,R2

  647. MOV R4,A

  648. MOV A,R3

  649. MOV R5,A

  650. RET

  651. ;**********************************************************寄存器清零******************************************************************************

  652. QL:

  653. MOV R0,#0

  654. MOV R1,#0

  655. MOV R2,#0

  656. MOV R3,#0

  657. MOV R4,#0

  658. MOV R5,#0

  659. MOV R6,#0

  660. MOV R7,#0

  661. RET

  662. ;###################################################查表源程序,入口参数A,DPTR#############################################################

  663. LOOK_UP_TABLE:

  664. MOVC A, @A+DPTR

  665. RET

  666. ;***************************************************查表程序1,入口参数A********************************************************************************

  667. LOOK_UP_TABLE1:

  668. MOV DPTR,#LEDMAP

  669. MOVC A, @A+DPTR

  670. RET

  671. ;###################################################初始化显示缓冲区程序###################################################################

  672. INIT_LEDBUF:

  673. MOV VARIABLE_LEDBUF+0,#0FFH

  674. MOV VARIABLE_LEDBUF+1,#0FFH

  675. MOV VARIABLE_LEDBUF+2,#0FFH

  676. MOV VARIABLE_LEDBUF+3,#0FFH

  677. MOV ROW_COLUMN,#07H

  678. ;###################################################变量初始化程序##########################################################################

  679. INIT_VARIABLE:

  680. MOV VARIABLE_STORE1,#0

  681. MOV VARIABLE_STORE2,#0

  682. MOV VARIABLE_STORE3,#0

  683. MOV VARIABLE_STORE4,#0

  684. MOV VARIABLE_STORE5,#0

  685. MOV VARIABLE_STORE6,#0

  686. MOV VARIABLE_INPUT1A,#0

  687. MOV VARIABLE_INPUT1B,#0

  688. MOV VARIABLE_INPUT1C,#0

  689. MOV VARIABLE_INPUT1D,#0

  690. MOV VARIABLE_INPUT2A,#0

  691. MOV VARIABLE_INPUT2B,#0

  692. MOV VARIABLE_INPUT2C,#0

  693. MOV

  694. VARIABLE_INPUT2D,#0

  695. MOV VARIABLE_REPLACE_POINT,#0

  696. ;MOV VARIABLE_RESULTB,#0

  697. ;MOV VARIABLE_RESULTC,#0

  698. ;MOV VARIABLE_RESULTD,#0

  699. MOV VARIABLE_SIGN1,#0

  700. MOV VARIABLE_SIGN2,#0

  701. MOV VARIABLE_INPUT1_POINT,#0

  702. MOV VARIABLE_INPUT2_POINT,#0

  703. MOV VARIABLE_RESULT_POINT,#0

  704. MOV VARIABLE_PLACE1_POINT,#VARIABLE_INPUT1A

  705. MOV VARIABLE_PLACE2_POINT,#VARIABLE_INPUT2A

  706. MOV VARIABLE_LEDBUF_POINT,#VARIABLE_LEDBUF

  707. MOV S1,#0

  708. MOV S2,#0

  709. MOV S3,#0

  710. MOV S4,#0

  711. MOV S5,#0

  712. MOV S6,#0

  713. MOV S7,#0

  714. SETB KEY1

  715. SETB KEY2

  716. SETB KEY3

  717. SETB KEY4

  718. RET

  719. ;***************************************************初始化程序******************************************************************************

  720. INIT:

  721. ACALL INIT_VARIABLE

  722. ACALL INIT_LEDBUF

  723. RET

  724. ;$$$$主程序区$$$$$

  725. STABLE:
  726. ……………………

  727. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51单片机的完整计算器程序.rar (4.21 KB, 下载次数: 68)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:517352 发表于 2021-6-7 20:12 | 只看该作者
请问有没有proteus仿真图呢?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表