久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4490|回復: 4
打印 上一主題 下一主題
收起左側

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

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




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, 下載次數: 109)


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

可以分享下嘛
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区在线观看 | 四季久久免费一区二区三区四区 | 国产亚洲精品精品国产亚洲综合 | 国产乱码精品一区二区三区忘忧草 | 欧美不卡| 成人精品在线视频 | 国产传媒在线播放 | 波多野结衣在线观看一区二区三区 | 精品亚洲视频在线 | 综合久久av | 四虎成人精品永久免费av九九 | 亚洲精品一区二区三区丝袜 | 亚洲第一在线 | 天天干天天插 | 国产成人精品高清久久 | 亚洲欧美日韩精品久久亚洲区 | 成人免费激情视频 | 国产精品日韩 | 欧美v在线 | 一区二区三区亚洲 | 三级黄片毛片 | 国产精品视频久久 | 国产69精品久久久久777 | 91亚洲精品久久久电影 | 久草网免费 | 国产精品1区2区3区 欧美 中文字幕 | 精久久久 | 婷婷精品 | 日韩免费一区 | 91精品国产色综合久久 | 国产精品福利在线观看 | 成人国产毛片 | 国产精品毛片一区二区三区 | 精品久久久999 | 日韩手机在线看片 | 久久一级| www国产成人免费观看视频,深夜成人网 | 秋霞在线一区二区 | 97精品国产手机 | 天天操天天干天天爽 | 欧美精品欧美精品系列 |