找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3072|回复: 4
收起左侧

基于8086的计算器汇编程序与Proteus仿真图

[复制链接]
ID:567008 发表于 2022-4-30 11:23 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
cbb0ad71ca1bff8c430defb6e0d27adf.png
3972e8a38d3f157711400b13be0ba473.png

8086汇编语言源程序如下:
  1.         DATA  SEGMENT
  2.            X  DB        ?,?,?,?     ;存放数据的每一位
  3.           X1  DW        ?           ;存放第一个数据值
  4.           X2  DW        ?           ;存放第二个数据值
  5.            Y  DW        ?           ;存放运算结果
  6.            S  DB        ?           ;存放运算符号值
  7.            E  DB        ?           ;按下等号键标记
  8.           CC  DB        ?           ;存放运算数据位数
  9.            H  DB        0           ;存放按键行号
  10.            L  DB        0           ;存放按键列号
  11.      DISCODE  DB        3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H         ;段码表
  12.         DATA  ENDS

  13.         CODE  SEGMENT
  14.               ASSUME    CS:CODE,DS:DATA

  15.       START:  MOV       AX,DATA
  16.               MOV       DS,AX

  17.               MOV       AL,90H      ;设置为A口输入,B口输出,C口输出
  18.               OUT       46H,AL
  19.               MOV       DI,OFFSET X+3           ;DI指向X的高位
  20.         KKK:  CALL      KEY         ;扫描按键
  21.               JMP       KKK

  22. ;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
  23.          KEY  PROC
  24.       CHECK:  CALL      DISP        ;等待按键按下的同时进行显示
  25.               MOV       AL,0F0H     ;所有行输出低电平
  26.               OUT       44H,AL
  27.               IN        AL,40H
  28.               CMP       AL,0FFH     ;读列值
  29.               JZ        CHECK       ;若都为高电平则无键按下,等待
  30.               MOV       CX,50
  31.               LOOP      $           ;延时消抖
  32.               IN        AL,DX       ;重读列值
  33.               CMP       AL,0FFH
  34.               JZ        CHECK       ;无键按下一直等待

  35.               MOV       H,0         ;有键按下,先把行列号变量清0
  36.               MOV       L,0
  37.               MOV       BL,01H
  38.               MOV       BH,0FEH     ;扫描法读键值:从第一行开始测试,即PC0输出低电平
  39.        NEXT:  MOV       AL,BH
  40.               OUT       44H,AL
  41.       NEXTH:  IN        AL,40H      ;读列值,判断是第几列有键按下
  42.               TEST      AL,BL       ;从第一列开始判断
  43.               JZ        WAIT0
  44.               ROL       BL,1
  45.               CMP       BL,10H      ;当前行状态下没有任何列有键按下,则转为对下一行的测试
  46.               JZ        NEXTL
  47.               INC       H           ;每判断一列,列号加1
  48.               JMP       NEXTH       ;再对下一列进行判断
  49.       NEXTL:  MOV       H,0
  50.               MOV       BL,01H
  51.               ROL       BH,1        ;对下一行测试,让下一个PC口输出低电平
  52.               CMP       BH,0EFH
  53.               JZ        EXIT
  54.               INC       L
  55.               JMP       NEXT

  56.       WAIT0:  IN        AL,40H      ;若有键按下,则等该按键松开后再计算键值
  57.               CMP       AL,0FFH
  58.               JNZ       WAIT0
  59.               MOV       CX,50
  60.               LOOP      $           ;延时消抖
  61.               IN        AL,40H
  62.               CMP       AL,0FFH
  63.               JNZ       WAIT0
  64.               CALL      KEYVALUE    ;调计算键值子程序
  65.        EXIT:  RET
  66.          KEY  ENDP


  67.    ;以下为计算键值子程序,通过行列号计算键值(键值=列号*4+行号)
  68.    ;键值存放在DL寄存器中
  69.     KEYVALUE  PROC
  70.               MOV       DL,L
  71.               MOV       DH,H
  72.               SHL       DL,1
  73.               SHL       DL,1        ;列号乘4
  74.               ADD       DL,DH
  75.               CMP       DL,9        ;按下的是数字键
  76.               JNG       NUM_CALL
  77.               CMP       DL,14
  78.               JL        CONT_CALL   ;按下的是运算键
  79.               CMP       DL,14
  80.               JZ        OUTP_CALL   ;按下的是等于键
  81.               CMP       DL,15
  82.               JZ        CLR_CALL    ;按下的是清除键

  83.    NUM_CALL:  CALL      NUMBER      ;调数字键处理子程序
  84.               JMP       EXIT1
  85.   CONT_CALL:  MOV       S,DL        ;存放运算键的键值
  86.               MOV       E,0
  87.               CALL      COUNT       ;调运算键处理子程序,计算第一个加数
  88.               JMP       EXIT1
  89.   OUTP_CALL:  CALL      OUTP        ;调等号键处理子程序
  90.               JMP       EXIT1
  91.    CLR_CALL:  CALL      CLEAR       ;调清除键处理子程序
  92.       EXIT1:  RET
  93.     KEYVALUE  ENDP


  94. ;以下为清除键处理子程序,按下清除键后,X变量全部清0
  95.        CLEAR  PROC
  96.               MOV       X[3],0
  97.               MOV       X[2],0
  98.               MOV       X[1],0
  99.               MOV       X[0],0
  100.               CALL      BITP
  101.               RET
  102.        CLEAR  ENDP


  103. ;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量
  104. ;并根据运算符号,调用相应的运算子程序
  105.         OUTP  PROC
  106.               PUSH      AX
  107.               PUSH      DX
  108.               PUSH      BX
  109.               INC       E
  110.               CALL      COUNT       ;调运算键处理子程序,计算第二个运算数据
  111.               CMP       S,10
  112.               JZ        ADD_CALL    ;运算符为加号,则调用加法子程序
  113.               CMP       S,11
  114.               JZ        SUB_CALL    ;运算符为减号,则调用减法子程序
  115.               CMP       S,12
  116.               JZ        MUL_CALL    ;运算符为乘号,则调用乘法子程序
  117.               CMP       S,13
  118.               CALL      DIVP        ;运算符为除号,则调用除法子程序
  119.               JMP       STORE1
  120.    ADD_CALL:  CALL      ADDP
  121.               JMP       STORE1
  122.    SUB_CALL:  CALL      SUBP
  123.               JMP       STORE1
  124.    MUL_CALL:  CALL      MULP

  125.      STORE1:  MOV       AX,Y        ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量
  126.               MOV       DX,0
  127.               MOV       BX,1000
  128.               DIV       BX
  129.               MOV       X[0], AL
  130.               MOV       AX,DX
  131.               MOV       BL,100
  132.               DIV       BL
  133.               MOV       X[1],AL
  134.               MOV       AL,AH
  135.               MOV       AH,0
  136.               MOV       BL,10
  137.               DIV       BL
  138.               MOV       X[2],AL
  139.               MOV       X[3],AH
  140.               POP       BX
  141.               POP       DX
  142.               POP       AX
  143.               RET
  144.         OUTP  ENDP

  145. ;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量
  146. ;或者将第二个运算数据的数值计算出来并存入X2变量
  147. ;将运算符的值存入S变量
  148.        COUNT  PROC
  149.               PUSH      AX
  150.               PUSH      BX
  151.               PUSH      DX
  152.               MOV       DX,0
  153.               CALL      BITP        ;测试X中的数据是多少位
  154.               CMP       CC,4        ;输入的数据是4位数 ?
  155.               JZ        C4
  156.               CMP       CC,3        ;输入的数据是3位数 ?
  157.               JZ        C3
  158.               CMP       CC,2        ;输入的数据是2位数 ?
  159.               JZ        C2
  160.               JMP       C1          ;输入的数据是1位数 ?

  161.          C4:  MOV       AX,0
  162.               MOV       AL,X[0]
  163.               MOV       BX,1000
  164.               MUL       BX
  165.               MOV       DX,AX

  166.          C3:  MOV       AL,X[1]
  167.               MOV       BL,100
  168.               MUL       BL
  169.               ADD       DX,AX

  170.          C2:  MOV       AL,X[2]
  171.               MOV       BL,10
  172.               MUL       BL
  173.               ADD       DX,AX

  174.          C1:  MOV       AL,X[3]
  175.               MOV       AH,0
  176.               ADD       DX,AX
  177.               CMP       E,1
  178.               JNZ       X1_S
  179.               MOV       X2,DX       ;按下的是等号,则将第二个运算数据的值存入X2变量
  180.               JMP       EXIT3
  181.        X1_S:  MOV       X1,DX       ;按下的是运算符号,则将第一个运算数据的值存X1变量
  182.               MOV       X[3],0      ;清空X变量
  183.               MOV       X[2],0
  184.               MOV       X[1],0
  185.               MOV       X[0],0
  186.       EXIT3:  POP       DX
  187.               POP       BX
  188.               POP       AX
  189.               RET
  190.        COUNT  ENDP


  191. ;以下为数字键处理子程序
  192. ;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数
  193.       NUMBER  PROC
  194.               CMP       E,1
  195.               JNZ       CONTINUE
  196.               MOV       E,0
  197.               CALL      CLEAR
  198.    CONTINUE:  CMP       CC,0        ;目前数据为0位,即没有数据,则转到SSS
  199.               JZ        SSS
  200. ;若已有数据,以下程序将X左移8位。
  201. ;例如:先输入“1”,当再输入2时,
  202. ;先要将“1”从个位移到十位,然后再将“2”存放到个位
  203.               PUSH      AX
  204.               PUSH      DX
  205.               MOV       AL,X[3]
  206.               MOV       AH,X[2]
  207.               MOV       DL,X[1]
  208.               MOV       DH,X[0]
  209.               MOV       CX,8
  210.          LL:  SHL       AX, 1
  211.               RCL       DX,1
  212.               LOOP      LL
  213.               MOV       X[3],AL
  214.               MOV       X[2],AH
  215.               MOV       X[1],DL
  216.               MOV       X[0],DH
  217.               POP       DX
  218.               POP       AX
  219.         SSS:  MOV       [DI],DL     ;将当前键入的数据存放到X的最低位
  220.               INC       CC          ;数据位数加1
  221.               CMP       CC,4        ;判断数据位数
  222.               JNG       EXIT2
  223.               MOV       CC,0        ;如果数据超过4位,重新从最低位开始存放
  224.               MOV       X[2],0
  225.               MOV       X[1],0
  226.               MOV       X[0],0
  227.       EXIT2:  CALL      DISP        ;调显示子程序,显示输入的数据
  228.               RET
  229.       NUMBER  ENDP

  230. ;加法子程序
  231.         ADDP  PROC
  232.               PUSH      AX
  233.               MOV       AX,X1
  234.               ADD       AX,X2
  235.               MOV       Y,AX
  236.               POP       AX
  237.               RET
  238.         ADDP  ENDP
  239. ;减法子程序
  240.         SUBP  PROC
  241.               PUSH      AX
  242.               MOV       AX,X1
  243.               SUB       AX,X2
  244.               MOV       Y,AX
  245.               POP       AX
  246.               RET
  247.         SUBP  ENDP
  248. ;乘法子程序
  249.         MULP  PROC
  250.               PUSH      AX
  251.               PUSH      DX
  252.               MOV       AX,X1
  253.               MOV       DX,X2
  254.               MUL       DX
  255.               MOV       Y,AX
  256.               POP       DX
  257.               POP       AX
  258.               RET
  259.         MULP  ENDP
  260. ;除法子程序
  261.         DIVP  PROC
  262.               PUSH      AX
  263.               PUSH      BX
  264.               PUSH      DX
  265.               MOV       DX,0
  266.               MOV       AX,X1
  267.               MOV       BX,X2
  268.               DIV       BX
  269.               MOV       Y,AX
  270.               POP       DX
  271.               POP       BX
  272.               POP       AX
  273.               RET
  274.         DIVP  ENDP

  275. ;显示子程序 ,将X中的数值按位显示出来
  276.         DISP  PROC
  277.               PUSH      BX
  278.               PUSH      AX
  279.               MOV       BH,0
  280.               LEA       SI,DISCODE
  281.               CALL      BITP        ;测试X位数
  282.               CMP       CC,4
  283.               JZ        QIAN
  284.               CMP       CC,3
  285.               JZ        BAI
  286.               CMP       CC,2
  287.               JZ        SHI
  288.               CMP       CC,1
  289.               JMP       G
  290.               JMP       NONE

  291.        QIAN:  MOV       AH,11100000B            ;从第4位开始显示
  292.               MOV       AL,AH
  293.               OUT       44H,AL
  294.               MOV       BL,X[0]
  295.               MOV       AL,[SI+BX]
  296.               OUT       42H,AL
  297.               CALL      DELY
  298.               MOV       AL,0
  299.               OUT       42H,AL

  300.         BAI:  MOV       AH,11010000B            ;从第3位开始显示
  301.               MOV       AL,AH
  302.               OUT       44H,AL
  303.               MOV       BL,X[1]
  304.               MOV       AL,[SI+BX]
  305.               OUT       42H,AL
  306.               CALL      DELY
  307.               MOV       AL,0
  308.               OUT       42H,AL

  309.         SHI:  MOV       AH,10110000B            ;从第2位开始显示
  310.               MOV       AL,AH
  311.               OUT       44H,AL
  312.               MOV       BL,X[2]
  313.               MOV       AL,[SI+BX]
  314.               OUT       42H,AL
  315.               CALL      DELY
  316.               MOV       AL,0
  317.               OUT       42H,AL

  318.           G:  MOV       AH,01110000B            ;从第1位开始显示
  319.               MOV       AL,AH
  320.               OUT       44H,AL
  321.               MOV       BL,X[3]
  322.               MOV       AL,[SI+BX]
  323.               OUT       42H,AL
  324.               CALL      DELY
  325.               JMP       EXIT4
  326. ……………………

  327. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
代码与Proteus仿真下载:
计算器8086.7z (45.45 KB, 下载次数: 97)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1054685 发表于 2022-12-20 16:08 来自手机 | 显示全部楼层
没代码
回复

使用道具 举报

ID:1054685 发表于 2022-12-20 16:49 来自手机 | 显示全部楼层
误会了,我傻了
回复

使用道具 举报

ID:1073250 发表于 2023-5-27 18:03 | 显示全部楼层
这个计算器还是不错的,我下载下来学习了
回复

使用道具 举报

ID:1101994 发表于 2023-12-1 11:06 | 显示全部楼层
鬼鬼YYDS 发表于 2023-5-27 18:03
这个计算器还是不错的,我下载下来学习了

可以分享下嘛
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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