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

標題: 基于8086的計算器匯編程序與Proteus仿真圖 [打印本頁]

作者: anan111    時間: 2022-4-30 11:23
標題: 基于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)



作者: zxc13643542777    時間: 2022-12-20 16:08
沒代碼
作者: zxc13643542777    時間: 2022-12-20 16:49
誤會了,我傻了
作者: 鬼鬼YYDS    時間: 2023-5-27 18:03
這個計算器還是不錯的,我下載下來學習了
作者: KK27    時間: 2023-12-1 11:06
鬼鬼YYDS 發表于 2023-5-27 18:03
這個計算器還是不錯的,我下載下來學習了

可以分享下嘛




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品成人国产乱一区 | 99久久影院 | 日本电影一区二区 | 91极品尤物在线播放国产 | 婷婷久久网 | av永久 | 亚洲播放 | 日韩成人国产 | 中文字幕一区二区三区在线观看 | 免费视频一区二区 | av日韩在线播放 | 国产高清免费视频 | 国产精品成人久久久久 | 狠狠操网站 | 日韩精品久久久久久 | 久热爱 | 国产精品视频网 | 国产福利91精品 | 国产精品久久国产精品久久 | 婷婷久久久久 | 亚洲精品视频在线观看免费 | 久久久久久久久久久丰满 | 日韩a v在线免费观看 | 亚洲色视频 | 日韩欧美在线一区 | 福利视频三区 | 成人亚洲 | 成人在线观看免费 | 久久久久久国产精品 | 一本色道精品久久一区二区三区 | 特黄色一级毛片 | 久久中文一区二区 | www久久久| 久久久精品高清 | 一级黄色录像片子 | 成人免费区一区二区三区 | 午夜精品一区二区三区在线视频 | 欧美成人精品欧美一级 | www.一区二区三区 | 久久一区 | 久久日韩粉嫩一区二区三区 |