找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于C51的简易计算器

[复制链接]
跳转到指定楼层
楼主
ID:404579 发表于 2018-10-1 09:54 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
  1. YJ        EQU     50H                 ;结果存放
  2. YJ1       EQU     51H                 ;中间结果存放
  3. GONG      EQU     52H                  ;功能键存放
  4.            ORG    00H
  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                  
  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                ;输入溢出
  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.       CLR P2.3
  162.       CALL D1MS
  163.       SETB P2.3
  164.       DEC R0
  165.       SJMP DIR1
  166. DIR2: CJNE R0,#33H,DIR3
  167.       CLR P2.2
  168.       CALL D1MS
  169.       CLR P2.2
  170.       DEC R0
  171.       SJMPDIR1
  172. DIR3: CALL D1MS
  173.       RET
  174. D1MS:   MOV    R7,#02H
  175. DMS:    MOV    R6,#0F0H
  176.         DJNZ   R6,$
  177.            DJNZ    R7,DMS      
  178.            RET
  179. SEGTAB: DB  3FH,   06H,   5BH,   4FH
  180.         DB 66H,   6DH,   7DH,  07H
  181.         DB 7FH,   6FH,   77H,  7CH   
  182.         DB 39H,   5EH,   79H,   71H
  183. TESTKEY:  ACALL  DISP   
  184.            MOV    P1,#0FH              ;读入键状态
  185.            MOV    A,P1                 
  186.            CPL    A
  187.            ANL    A,#0FH            ;高四位不用
  188.            RET
  189. KEYTABLE:                       
  190.            DB     0EEH,0EDH,0DDH,0BDH  ;键码定义
  191.            DB     0EBH,0DBH,0BBH,0E7H
  192.            DB     0D7H,0B7H,0DEH,0BEH
  193.            DB     07EH,07DH,07BH,077H
  194. GETKEY:   MOV     R6,#10            ;读键子程序
  195.            ACALL  DELAY
  196.            MOV    P1,#0FH
  197.            MOV    A,P1
  198.            CJNE   A,#0FH,K12
  199.            LJMP   MLOOP
  200. K12:      MOV     B,A
  201.            MOV    P1,#0EFH
  202.            MOV    A,P1
  203.            CJNE   A,#0EFH,K13
  204.            MOV    P1,#0DFH
  205.            MOV    A,P1
  206.            CJNE   A,#0DFH,K13
  207.            MOV    P1,#0BFH
  208.            MOV    A,P1
  209.            CJNE   A,#0BFH,K13
  210.            MOV    P1,#07FH
  211.            MOV    A,P1
  212.            CJNE   A,#07FH,K13
  213.            LJMP   MLOOP
  214. K13:      ANL     A,#0F0H
  215.            ORL    A,B
  216.            MOV    B,A
  217.            MOV    R1,#16
  218.            MOV    R2,#0
  219.            MOV    DPTR,#KEYTABLE
  220. K14:      MOV     A,R2
  221.            MOVC   A,@A+DPTR
  222.            CJNE   A,B,K16
  223.            MOV    P1,#0FH
  224. K15:      MOV     A,P1
  225.            CJNE   A,#0FH,K15
  226.            MOV    R6,#10
  227.            ACALL  DELAY
  228.            MOV    A,R2
  229.            RET
  230. K16:      INC     R2
  231.            DJNZ   R1,K14
  232.            AJMP   MLOOP
  233. DELAY:    MOV     R7,#10            ;10ms延时子程序
  234. TS1:    MOV    R6,#0FFH           
  235. TS2:      NOP
  236.            NOP
  237.           DJNZ    R6,TS2
  238.            DJNZ   R7,TS1
  239.            RET
  240.        END
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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