找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2878|回复: 1
收起左侧

用单片机汇编写的简易计算器程序+Proteus仿真

[复制链接]
ID:565184 发表于 2019-8-8 14:36 | 显示全部楼层 |阅读模式
  1. YJ        EQU     50H                 ;结果存放
  2. YJ1       EQU     51H                 ;中间结果存放
  3. GONG      EQU     52H                  ;功能键存放
  4.           ORG     0000H
  5. START:    MOV     R3,#0                ;初始化显示为空
  6.           MOV     GONG,#0      
  7.           MOV     32H,#00H
  8.           MOV     33H,#00H
  9.           MOV     34H,#00H
  10. MLOOP:    CALL    DISP                 ;调显示子程序
  11. WAIT:     CALL    TESTKEY              ;判断有无按键
  12.           JZ      WAIT                 ;判断累加器是否为0
  13.           CALL    GETKEY              ;读键
  14.           INC     R3                  ;按键个数
  15.           CJNE    A,#0,NEXT1                 ;判断是否数字键
  16.           LJMP    E1                  ;转数字键处理
  17. NEXT1:    CJNE    A,#1,NEXT2
  18.           LJMP    E1
  19. NEXT2:    CJNE    A,#2,NEXT3
  20.           LJMP    E1
  21. NEXT3:    CJNE    A,#3,NEXT4
  22.           LJMP    E1
  23. NEXT4:    CJNE    A,#4,NEXT5
  24.           LJMP    E1
  25. NEXT5:    CJNE    A,#5,NEXT6
  26.           LJMP    E1
  27. NEXT6:    CJNE    A,#6,NEXT7
  28.           LJMP    E1
  29. NEXT7:    CJNE    A,#7,NEXT8
  30.           LJMP    E1
  31. NEXT8:    CJNE    A,#8,NEXT9
  32.           LJMP    E1
  33. NEXT9:    CJNE    A,#9,NEXT10
  34.           LJMP    E1
  35. NEXT10:   CJNE    A,#10,NEXT11        ;判断是否功能键
  36.           LJMP    E2                  ;转功能键处理
  37. NEXT11:   CJNE    A,#11,NEXT12
  38.           LJMP    E2
  39. NEXT12:   CJNE    A,#12, NEXT13
  40.           LJMP    E2
  41. NEXT13:   CJNE    A,#13,NEXT14
  42.           LJMP    E2
  43. NEXT14:   CJNE    A,#14,NEXT15
  44.           LJMP    E2
  45. NEXT15:   LJMP    E3                   ;判断是否清除键
  46. E1:       CJNE    R3,#1,N1             ;判断第几次按键
  47.           LJMP    E11                  ;为第一个数字
  48. N1:       CJNE    R3,#2,N2
  49.           LJMP    E12                  ;为第二个数字
  50. N2:       CJNE    R3,#3,N3
  51.           LJMP    E13                  ;为第三个数字
  52. N3:       LJMP    E3                   ;第四个数字转溢出
  53. E11:      MOV     R4,A                 ;输入值暂存R4
  54.           MOV     34H,A                ;输入值送显示缓存
  55.           MOV     33H,#00H
  56.           MOV     32H,#00H
  57.           LJMP    MLOOP                ;等待再次输入
  58. E12:      MOV     R7,A                 ;个位数暂存R7
  59.           MOV     B,#10
  60.           MOV     A,R4
  61.           MUL     AB                    ;十位数
  62.           ADD     A,R7
  63.           MOV     R4,A                  ;输入值存R4
  64.           MOV     32H,#00H              ;输入值送显示缓存
  65.           MOV     33H,34H
  66.           MOV     34H,R7
  67.           LJMP    MLOOP                                        ;等待再次输入
  68. E13:      MOV     R7,A
  69.           MOV     B,#10
  70.           MOV     A,R4
  71.           MUL     AB
  72.           JB      OV,E3                ;输入溢出,如果OV等于1则转E3
  73.           ADD     A,R7
  74.           JB      CY,E3                ;输入溢出
  75.           MOV     R4,A
  76.           MOV     32H,33H              ;输入值送显示缓存
  77.           MOV     33H,34H
  78.           MOV     34H,R7
  79.           LJMP    MLOOP
  80. E3:       MOV    R3,#0                 ;按键次数清零
  81.           MOV    R4,#0                 ;输入值清零
  82.           MOV    YJ,#0                        ;计算结果清零
  83.           MOV    GONG,#0                      ;功能键设为零      
  84.           MOV    32H,#00H              ;显示清空
  85.           MOV    33H,#00H
  86.           MOV    34H,#00H
  87.           LJMP   MLOOP
  88. E2:        MOV    34H,#00H
  89.            MOV    33H,#00H
  90.            MOV    32H,#00H
  91.            MOV    R0,GONG              ;与上次功能键交换
  92.            MOV    GONG,A
  93.            MOV    A,R0
  94.            CJNE       A,#10,N21            ;判断功能键
  95.            LJMP       JIA                  ;"+"
  96. N21:       CJNE    A,#11,N22
  97.            LJMP       JIAN                  ;"-"
  98. N22:       CJNE     A,#12,N23
  99.            LJMP       CHENG                 ;"*"
  100. N23:       CJNE    A,#13,N24
  101.            LJMP       CHU                   ;"/"
  102. N24:       CJNE    A,#0,N25
  103.            LJMP       FIRST                ;首次按功能键
  104. N25:       LJMP    DEN                     ;"="
  105. N4:        LJMP       E3
  106. FIRST:     MOV     YJ,R4            ;输入值送结果
  107.            MOV     R3,#0             ;按键次数清零
  108.            LJMP       DISP1             ;结果处理
  109. JIA:       MOV     A,YJ              ;上次结果送累加器
  110.            ADD     A,R4              ;上次结果加输入值
  111.            JB      CY,N4             ;溢出
  112.            MOV    YJ,A              ;存本次结果
  113.            MOV    R3,#0             ;按键次数清零
  114.            LJMP       DISP1
  115. JIAN:      MOV     A,YJ
  116.            SUBB       A,R4              ;上次结果减输入值
  117.            JB         CY,N4             ;负数溢出
  118.            MOV    YJ,A
  119.            MOV    R3,#0
  120.            LJMP       DISP1
  121. CHENG:     MOV    A,YJ
  122.            MOV    B,A
  123.            MOV    A,R4
  124.            MUL    AB                ;上次结果乘输入值
  125.            JB     OV,N4             ;溢出
  126.            MOV    YJ,A                 
  127.            LJMP   DISP1
  128. CHU:       MOV    A,R4
  129.            MOV    B,A
  130.            MOV    A,YJ
  131.            DIV    AB                ;上次结果除输入值
  132.            MOV    YJ,A
  133.            MOV    R3,#0
  134.            LJMP   DISP1
  135. DEN:       MOV     R3,#0
  136.            LJMP       DISP1
  137. DISP1:     MOV    B,#10
  138.            MOV    A,YJ              ;结果送累加器
  139.            DIV    AB                ;结果除10
  140.            MOV    YJ1,A             ;暂存"商"
  141.            MOV    A,B               ;取个位数
  142.            MOV    34H,A             ;个位数送显示缓存
  143.            MOV    A,YJ1
  144.            JZ     DISP11            ;结果是否为一位数
  145.            MOV    B,#10
  146.            MOV    A,YJ1
  147.            DIV    AB
  148.            MOV    YJ1,A
  149.            MOV    A,B
  150.            MOV    33H,A             ;十位送显示缓存
  151.            MOV    A,YJ1
  152.            JZ     DISP11            ;结果是否为二位数
  153.            MOV    32H,A             ;百位数送显示缓存
  154. DISP11:    LJMP    MLOOP


  155. DISP:            MOV R0,#34H                                ;动态显示
  156. DIR1:            MOV DPTR,#SEGTAB
  157.                  MOV A,@R0
  158.                  MOVC A,@A+DPTR
  159.                 MOV P0,A
  160.                  CJNE R0,#34H,DIR2
  161.                    SETB        P2.0
  162.                  CALL D1MS
  163.                 CLR        P2.0
  164.                  DEC R0
  165.                  SJMP DIR1
  166. DIR2: CJNE R0,#33H,DIR3
  167.       SETB P2.1
  168.       CALL D1MS
  169.       CLR P2.1
  170.       DEC R0
  171.       SJMP        DIR1
  172. DIR3:         SETB        P2.2
  173.                 CALL D1MS
  174.                 CLR        P2.2
  175.       RET
  176. D1MS:   MOV    R7,#02H
  177. DMS:    MOV    R6,#0F0H
  178.         DJNZ   R6,$
  179.            DJNZ    R7,DMS      
  180.            RET



  181. SEGTAB: DB 0C0H,   0F9H,   0A4H,   0B0H
  182.         DB 099H,   092H,   082H,   0F8H                                          
  183.         DB 080H,   090H,   088H,   083H   
  184.         DB 0C6H,   0A1H,   086H,   08EH
  185. TESTKEY:  ACALL  DISP   
  186.            MOV    P1,#0FH              ;读入键状态
  187.            MOV    A,P1                 
  188.            CPL    A
  189.            ANL    A,#0FH            ;高四位不用
  190.            RET
  191. KEYTABLE:                       
  192.            DB      0EEH,0EDH,0DDH,0BDH  ;键码定义
  193.            DB      0EBH,0DBH,0BBH,0E7H
  194.            DB      0D7H,0B7H,0DEH,0BEH
  195.            DB      07EH,07DH,07BH,077H
  196. GETKEY:   MOV     R6,#10            ;读键子程序
  197.            ACALL  DELAY
  198.            MOV    P1,#0FH
  199.            MOV    A,P1
  200.            CJNE   A,#0FH,K12
  201.            LJMP   MLOOP
  202. K12:      MOV     B,A
  203.            MOV    P1,#0EFH
  204.            MOV    A,P1
  205.            CJNE   A,#0EFH,K13
  206.            MOV    P1,#0DFH
  207.            MOV    A,P1
  208.            CJNE   A,#0DFH,K13
  209.            MOV    P1,#0BFH
  210.            MOV    A,P1
  211.            CJNE   A,#0BFH,K13
  212.            MOV    P1,#07FH
  213.            MOV    A,P1
  214.            CJNE   A,#07FH,K13
  215.            LJMP   MLOOP
  216. K13:      ANL     A,#0F0H
  217.            ORL    A,B
  218.            MOV    B,A
  219.            MOV    R1,#16
  220.            MOV    R2,#0
  221.            MOV    DPTR,#KEYTABLE
  222. K14:      MOV     A,R2
  223.            MOVC   A,@A+DPTR
  224.            CJNE   A,B,K16
  225.            MOV    P1,#0FH
  226. K15:      MOV     A,P1
  227.            CJNE   A,#0FH,K15
  228.            MOV    R6,#10
  229.            ACALL  DELAY
  230.            MOV    A,R2
  231.            RET
  232. K16:      INC     R2
  233.            DJNZ   R1,K14
  234.            AJMP   MLOOP
  235. DELAY:    MOV     R7,#10            ;10ms延时子程序
  236. TS1:    MOV    R6,#0FFH           
  237. TS2:      NOP
  238.            NOP
  239.           DJNZ    R6,TS2
  240.            DJNZ   R7,TS1
  241.            RET
  242.        END
复制代码


TIM截图20190808143218.png

简易计算器1.zip

70.63 KB, 下载次数: 80, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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