找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4599|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于8086的計算器匯編程序與Proteus仿真圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




8086匯編語言源程序如下:
  1.         DATA  SEGMENT
  2.            X  DB        ?,?,?,?     ;存放數(shù)據(jù)的每一位
  3.           X1  DW        ?           ;存放第一個數(shù)據(jù)值
  4.           X2  DW        ?           ;存放第二個數(shù)據(jù)值
  5.            Y  DW        ?           ;存放運(yùn)算結(jié)果
  6.            S  DB        ?           ;存放運(yùn)算符號值
  7.            E  DB        ?           ;按下等號鍵標(biāo)記
  8.           CC  DB        ?           ;存放運(yùn)算數(shù)據(jù)位數(shù)
  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      ;設(shè)置為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中存放當(dāng)前按鍵的行列號
  23.          KEY  PROC
  24.       CHECK:  CALL      DISP        ;等待按鍵按下的同時進(jìn)行顯示
  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      ;當(dāng)前行狀態(tài)下沒有任何列有鍵按下,則轉(zhuǎn)為對下一行的測試
  46.               JZ        NEXTL
  47.               INC       H           ;每判斷一列,列號加1
  48.               JMP       NEXTH       ;再對下一列進(jìn)行判斷
  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    ;調(diào)計算鍵值子程序
  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        ;按下的是數(shù)字鍵
  76.               JNG       NUM_CALL
  77.               CMP       DL,14
  78.               JL        CONT_CALL   ;按下的是運(yùn)算鍵
  79.               CMP       DL,14
  80.               JZ        OUTP_CALL   ;按下的是等于鍵
  81.               CMP       DL,15
  82.               JZ        CLR_CALL    ;按下的是清除鍵

  83.    NUM_CALL:  CALL      NUMBER      ;調(diào)數(shù)字鍵處理子程序
  84.               JMP       EXIT1
  85.   CONT_CALL:  MOV       S,DL        ;存放運(yùn)算鍵的鍵值
  86.               MOV       E,0
  87.               CALL      COUNT       ;調(diào)運(yùn)算鍵處理子程序,計算第一個加數(shù)
  88.               JMP       EXIT1
  89.   OUTP_CALL:  CALL      OUTP        ;調(diào)等號鍵處理子程序
  90.               JMP       EXIT1
  91.    CLR_CALL:  CALL      CLEAR       ;調(diào)清除鍵處理子程序
  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. ;以下為等號鍵處理子程序,該子程序負(fù)責(zé)將第二個運(yùn)算數(shù)據(jù)的數(shù)值計算出來存入X2變量
  104. ;并根據(jù)運(yùn)算符號,調(diào)用相應(yīng)的運(yùn)算子程序
  105.         OUTP  PROC
  106.               PUSH      AX
  107.               PUSH      DX
  108.               PUSH      BX
  109.               INC       E
  110.               CALL      COUNT       ;調(diào)運(yùn)算鍵處理子程序,計算第二個運(yùn)算數(shù)據(jù)
  111.               CMP       S,10
  112.               JZ        ADD_CALL    ;運(yùn)算符為加號,則調(diào)用加法子程序
  113.               CMP       S,11
  114.               JZ        SUB_CALL    ;運(yùn)算符為減號,則調(diào)用減法子程序
  115.               CMP       S,12
  116.               JZ        MUL_CALL    ;運(yùn)算符為乘號,則調(diào)用乘法子程序
  117.               CMP       S,13
  118.               CALL      DIVP        ;運(yùn)算符為除號,則調(diào)用除法子程序
  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        ;以下程序?qū)⒏鬟\(yùn)算子程序返回的運(yùn)算結(jié)果,按位分解,送入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. ;以下為運(yùn)算鍵處理子程序,該程序?qū)⒌谝粋運(yùn)算數(shù)據(jù)的數(shù)值計算出來并存入X1變量
  146. ;或者將第二個運(yùn)算數(shù)據(jù)的數(shù)值計算出來并存入X2變量
  147. ;將運(yùn)算符的值存入S變量
  148.        COUNT  PROC
  149.               PUSH      AX
  150.               PUSH      BX
  151.               PUSH      DX
  152.               MOV       DX,0
  153.               CALL      BITP        ;測試X中的數(shù)據(jù)是多少位
  154.               CMP       CC,4        ;輸入的數(shù)據(jù)是4位數(shù) ?
  155.               JZ        C4
  156.               CMP       CC,3        ;輸入的數(shù)據(jù)是3位數(shù) ?
  157.               JZ        C3
  158.               CMP       CC,2        ;輸入的數(shù)據(jù)是2位數(shù) ?
  159.               JZ        C2
  160.               JMP       C1          ;輸入的數(shù)據(jù)是1位數(shù) ?

  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       ;按下的是等號,則將第二個運(yùn)算數(shù)據(jù)的值存入X2變量
  180.               JMP       EXIT3
  181.        X1_S:  MOV       X1,DX       ;按下的是運(yùn)算符號,則將第一個運(yùn)算數(shù)據(jù)的值存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. ;以下為數(shù)字鍵處理子程序
  192. ;該程序,將輸入的數(shù)據(jù)按位存放在X變量中,并由CC記錄數(shù)據(jù)的位數(shù)
  193.       NUMBER  PROC
  194.               CMP       E,1
  195.               JNZ       CONTINUE
  196.               MOV       E,0
  197.               CALL      CLEAR
  198.    CONTINUE:  CMP       CC,0        ;目前數(shù)據(jù)為0位,即沒有數(shù)據(jù),則轉(zhuǎn)到SSS
  199.               JZ        SSS
  200. ;若已有數(shù)據(jù),以下程序?qū)左移8位。
  201. ;例如:先輸入“1”,當(dāng)再輸入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     ;將當(dāng)前鍵入的數(shù)據(jù)存放到X的最低位
  220.               INC       CC          ;數(shù)據(jù)位數(shù)加1
  221.               CMP       CC,4        ;判斷數(shù)據(jù)位數(shù)
  222.               JNG       EXIT2
  223.               MOV       CC,0        ;如果數(shù)據(jù)超過4位,重新從最低位開始存放
  224.               MOV       X[2],0
  225.               MOV       X[1],0
  226.               MOV       X[0],0
  227.       EXIT2:  CALL      DISP        ;調(diào)顯示子程序,顯示輸入的數(shù)據(jù)
  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中的數(shù)值按位顯示出來
  276.         DISP  PROC
  277.               PUSH      BX
  278.               PUSH      AX
  279.               MOV       BH,0
  280.               LEA       SI,DISCODE
  281.               CALL      BITP        ;測試X位數(shù)
  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黑下載附件…………
復(fù)制代碼
代碼與Proteus仿真下載:
計算器8086.7z (45.45 KB, 下載次數(shù): 109)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1054685 發(fā)表于 2022-12-20 16:08 來自手機(jī) | 只看該作者
沒代碼
回復(fù)

使用道具 舉報

板凳
ID:1054685 發(fā)表于 2022-12-20 16:49 來自手機(jī) | 只看該作者
誤會了,我傻了
回復(fù)

使用道具 舉報

地板
ID:1073250 發(fā)表于 2023-5-27 18:03 | 只看該作者
這個計算器還是不錯的,我下載下來學(xué)習(xí)了
回復(fù)

使用道具 舉報

5#
ID:1101994 發(fā)表于 2023-12-1 11:06 | 只看該作者
鬼鬼YYDS 發(fā)表于 2023-5-27 18:03
這個計算器還是不錯的,我下載下來學(xué)習(xí)了

可以分享下嘛
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表