找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3818|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

制作的單片機(jī)+8255電子計算器匯編語言程序,帶Proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:656224 發(fā)表于 2019-12-11 19:55 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
可實現(xiàn)加減乘除,除法可顯示小數(shù)點后一位,實現(xiàn)連加減運算


單片機(jī)源程序如下:

DATA  SEGMENT
           X  DB        ?,?,?,?     ;存放數(shù)據(jù)的每一位
          X1  DW        ?           ;存放第一個數(shù)據(jù)值
          X2  DW        ?           ;存放第二個數(shù)據(jù)值
           Y  DW        ?           ;存放運算結(jié)果
           S  DB        ?           ;存放運算符號值
           E  DB        ?           ;按下等號鍵標(biāo)記
          CC  DB        ?           ;存放運算數(shù)據(jù)位數(shù)
           H  DB        0           ;存放按鍵行號
           L  DB        0           ;存放按鍵列號
     DISCODE  DB        3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H         ;段碼表
        DATA  ENDS

        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA

      START:  MOV       AX,DATA
              MOV       DS,AX

              MOV       AL,90H      ;設(shè)置為A口輸入,B口輸出,C口輸出
              OUT       46H,AL
              MOV       DI,OFFSET X+3           ;DI指向X的高位
        KKK:  CALL      KEY         ;掃描按鍵
              JMP       KKK

;以下為按鍵掃描子程序,程序返回后,在變量H和L中存放當(dāng)前按鍵的行列號
         KEY  PROC
      CHECK:  CALL      DISP        ;等待按鍵按下的同時進(jìn)行顯示
              MOV       AL,0F0H     ;所有行輸出低電平
              OUT       44H,AL
              IN        AL,40H
              CMP       AL,0FFH     ;讀列值
              JZ        CHECK       ;若都為高電平則無鍵按下,等待
              MOV       CX,50
              LOOP      $           ;延時消抖
              IN        AL,DX       ;重讀列值
              CMP       AL,0FFH
              JZ        CHECK       ;無鍵按下一直等待

              MOV       H,0         ;有鍵按下,先把行列號變量清0
              MOV       L,0
              MOV       BL,01H
              MOV       BH,0FEH     ;掃描法讀鍵值:從第一行開始測試,即PC0輸出低電平
       NEXT:  MOV       AL,BH
              OUT       44H,AL
      NEXTH:  IN        AL,40H      ;讀列值,判斷是第幾列有鍵按下
              TEST      AL,BL       ;從第一列開始判斷
              JZ        WAIT0
              ROL       BL,1
              CMP       BL,10H      ;當(dāng)前行狀態(tài)下沒有任何列有鍵按下,則轉(zhuǎn)為對下一行的測試
              JZ        NEXTL
              INC       H           ;每判斷一列,列號加1
              JMP       NEXTH       ;再對下一列進(jìn)行判斷
      NEXTL:  MOV       H,0
              MOV       BL,01H
              ROL       BH,1        ;對下一行測試,讓下一個PC口輸出低電平
              CMP       BH,0EFH
              JZ        EXIT
              INC       L
              JMP       NEXT

      WAIT0:  IN        AL,40H      ;若有鍵按下,則等該按鍵松開后再計算鍵值
              CMP       AL,0FFH
              JNZ       WAIT0
              MOV       CX,50
              LOOP      $           ;延時消抖
              IN        AL,40H
              CMP       AL,0FFH
              JNZ       WAIT0
              CALL      KEYVALUE    ;調(diào)計算鍵值子程序
       EXIT:  RET
         KEY  ENDP


   ;以下為計算鍵值子程序,通過行列號計算鍵值(鍵值=列號*4+行號)
   ;鍵值存放在DL寄存器中
    KEYVALUE  PROC
              MOV       DL,L
              MOV       DH,H
              SHL       DL,1
              SHL       DL,1        ;列號乘4
              ADD       DL,DH
              CMP       DL,9        ;按下的是數(shù)字鍵
              JNG       NUM_CALL
              CMP       DL,14
              JL        CONT_CALL   ;按下的是運算鍵
              CMP       DL,14
              JZ        OUTP_CALL   ;按下的是等于鍵
              CMP       DL,15
              JZ        CLR_CALL    ;按下的是清除鍵

   NUM_CALL:  CALL      NUMBER      ;調(diào)數(shù)字鍵處理子程序
              JMP       EXIT1
  CONT_CALL:  MOV       S,DL        ;存放運算鍵的鍵值
              MOV       E,0
              CALL      COUNT       ;調(diào)運算鍵處理子程序,計算第一個加數(shù)
              JMP       EXIT1
  OUTP_CALL:  CALL      OUTP        ;調(diào)等號鍵處理子程序
              JMP       EXIT1
   CLR_CALL:  CALL      CLEAR       ;調(diào)清除鍵處理子程序
      EXIT1:  RET
    KEYVALUE  ENDP


;以下為清除鍵處理子程序,按下清除鍵后,X變量全部清0
       CLEAR  PROC
              MOV       X[3],0
              MOV       X[2],0
              MOV       X[1],0
              MOV       X[0],0
              CALL      BITP
              RET
       CLEAR  ENDP


;以下為等號鍵處理子程序,該子程序負(fù)責(zé)將第二個運算數(shù)據(jù)的數(shù)值計算出來存入X2變量
;并根據(jù)運算符號,調(diào)用相應(yīng)的運算子程序
        OUTP  PROC
              PUSH      AX
              PUSH      DX
              PUSH      BX
              INC       E
              CALL      COUNT       ;調(diào)運算鍵處理子程序,計算第二個運算數(shù)據(jù)
              CMP       S,10
              JZ        ADD_CALL    ;運算符為加號,則調(diào)用加法子程序
              CMP       S,11
              JZ        SUB_CALL    ;運算符為減號,則調(diào)用減法子程序
              CMP       S,12
              JZ        MUL_CALL    ;運算符為乘號,則調(diào)用乘法子程序
              CMP       S,13
              CALL      DIVP        ;運算符為除號,則調(diào)用除法子程序
              JMP       STORE1
   ADD_CALL:  CALL      ADDP
              JMP       STORE1
   SUB_CALL:  CALL      SUBP
              JMP       STORE1
   MUL_CALL:  CALL      MULP

     STORE1:  MOV       AX,Y        ;以下程序?qū)⒏鬟\算子程序返回的運算結(jié)果,按位分解,送入X變量
              MOV       DX,0
              MOV       BX,1000
              DIV       BX
              MOV       X[0], AL
              MOV       AX,DX
              MOV       BL,100
              DIV       BL
              MOV       X[1],AL
              MOV       AL,AH
              MOV       AH,0
              MOV       BL,10
              DIV       BL
              MOV       X[2],AL
              MOV       X[3],AH
              POP       BX
              POP       DX
              POP       AX
              RET
        OUTP  ENDP

;以下為運算鍵處理子程序,該程序?qū)⒌谝粋€運算數(shù)據(jù)的數(shù)值計算出來并存入X1變量
;或者將第二個運算數(shù)據(jù)的數(shù)值計算出來并存入X2變量
;將運算符的值存入S變量
       COUNT  PROC
              PUSH      AX
              PUSH      BX
              PUSH      DX
              MOV       DX,0
              CALL      BITP        ;測試X中的數(shù)據(jù)是多少位
              CMP       CC,4        ;輸入的數(shù)據(jù)是4位數(shù) ?
              JZ        C4
              CMP       CC,3        ;輸入的數(shù)據(jù)是3位數(shù) ?
              JZ        C3
              CMP       CC,2        ;輸入的數(shù)據(jù)是2位數(shù) ?
              JZ        C2
              JMP       C1          ;輸入的數(shù)據(jù)是1位數(shù) ?

         C4:  MOV       AX,0
              MOV       AL,X[0]
              MOV       BX,1000
              MUL       BX
              MOV       DX,AX

         C3:  MOV       AL,X[1]
              MOV       BL,100
              MUL       BL
              ADD       DX,AX

         C2:  MOV       AL,X[2]
              MOV       BL,10
              MUL       BL
              ADD       DX,AX

         C1:  MOV       AL,X[3]
              MOV       AH,0
              ADD       DX,AX
              CMP       E,1
              JNZ       X1_S
              MOV       X2,DX       ;按下的是等號,則將第二個運算數(shù)據(jù)的值存入X2變量
              JMP       EXIT3
       X1_S:  MOV       X1,DX       ;按下的是運算符號,則將第一個運算數(shù)據(jù)的值存X1變量
              MOV       X[3],0      ;清空X變量
              MOV       X[2],0
              MOV       X[1],0
              MOV       X[0],0
      EXIT3:  POP       DX
              POP       BX
              POP       AX
              RET
       COUNT  ENDP


;以下為數(shù)字鍵處理子程序
;該程序,將輸入的數(shù)據(jù)按位存放在X變量中,并由CC記錄數(shù)據(jù)的位數(shù)
      NUMBER  PROC
              CMP       E,1
              JNZ       CONTINUE
              MOV       E,0
              CALL      CLEAR
   CONTINUE:  CMP       CC,0        ;目前數(shù)據(jù)為0位,即沒有數(shù)據(jù),則轉(zhuǎn)到SSS
              JZ        SSS
;若已有數(shù)據(jù),以下程序?qū)左移8位。
;例如:先輸入“1”,當(dāng)再輸入2時,
;先要將“1”從個位移到十位,然后再將“2”存放到個位
              PUSH      AX
              PUSH      DX
              MOV       AL,X[3]
              MOV       AH,X[2]
              MOV       DL,X[1]
              MOV       DH,X[0]
              MOV       CX,8
         LL:  SHL       AX, 1
              RCL       DX,1
              LOOP      LL
              MOV       X[3],AL
              MOV       X[2],AH
              MOV       X[1],DL
              MOV       X[0],DH
              POP       DX
              POP       AX
        SSS:  MOV       [DI],DL     ;將當(dāng)前鍵入的數(shù)據(jù)存放到X的最低位
              INC       CC          ;數(shù)據(jù)位數(shù)加1
              CMP       CC,4        ;判斷數(shù)據(jù)位數(shù)
              JNG       EXIT2
              MOV       CC,0        ;如果數(shù)據(jù)超過4位,重新從最低位開始存放
              MOV       X[2],0
              MOV       X[1],0
              MOV       X[0],0
      EXIT2:  CALL      DISP        ;調(diào)顯示子程序,顯示輸入的數(shù)據(jù)
              RET
      NUMBER  ENDP

;加法子程序
        ADDP  PROC
              PUSH      AX
              MOV       AX,X1
              ADD       AX,X2
              MOV       Y,AX
              POP       AX
              RET
        ADDP  ENDP
;減法子程序
        SUBP  PROC
              PUSH      AX
              MOV       AX,X1
              SUB       AX,X2
              MOV       Y,AX
              POP       AX
              RET
        SUBP  ENDP
;乘法子程序
        MULP  PROC
              PUSH      AX
              PUSH      DX
              MOV       AX,X1
              MOV       DX,X2
              MUL       DX
              MOV       Y,AX
              POP       DX
              POP       AX
              RET
        MULP  ENDP
;除法子程序
        DIVP  PROC
              PUSH      AX
              PUSH      BX
              PUSH      DX
              MOV       DX,0
              MOV       AX,X1
              MOV       BX,X2
              DIV       BX
              MOV       Y,AX
              POP       DX
              POP       BX
              POP       AX
              RET
        DIVP  ENDP

;顯示子程序 ,將X中的數(shù)值按位顯示出來
        DISP  PROC
              PUSH      BX
              PUSH      AX
              MOV       BH,0
              LEA       SI,DISCODE
              CALL      BITP        ;測試X位數(shù)
              CMP       CC,4
              JZ        QIAN
              CMP       CC,3
              JZ        BAI
              CMP       CC,2
              JZ        SHI
              CMP       CC,1
              JMP       G
              JMP       NONE

       QIAN:  MOV       AH,11100000B            ;從第4位開始顯示
              MOV       AL,AH
              OUT       44H,AL
              MOV       BL,X[0]
              MOV       AL,[SI+BX]
              OUT       42H,AL
              CALL      DELY
              MOV       AL,0
              OUT       42H,AL

        BAI:  MOV       AH,11010000B            ;從第3位開始顯示
              MOV       AL,AH
              OUT       44H,AL
              MOV       BL,X[1]
              MOV       AL,[SI+BX]
              OUT       42H,AL
              CALL      DELY
              MOV       AL,0
              OUT       42H,AL

        SHI:  MOV       AH,10110000B            ;從第2位開始顯示
              MOV       AL,AH
              OUT       44H,AL
              MOV       BL,X[2]
              MOV       AL,[SI+BX]
              OUT       42H,AL
              CALL      DELY
              MOV       AL,0
              OUT       42H,AL

          G:  MOV       AH,01110000B            ;從第1位開始顯示
              MOV       AL,AH
              OUT       44H,AL
              MOV       BL,X[3]
              MOV       AL,[SI+BX]
              OUT       42H,AL
              CALL      DELY
              JMP       EXIT4

       NONE:  MOV       AL,0        ;X中沒有數(shù)據(jù),不顯示
              OUT       42H,AL
      EXIT4:  POP       AX
              POP       BX
              RET
        DISP  ENDP

;分析數(shù)據(jù)位數(shù)子程序
        BITP  PROC
              CMP       X[0],0      ;如果X[0]不為0,則數(shù)據(jù)為4位數(shù)
              JNZ       FOURBIT
              CMP       X[1],0      ;如果X[1]不為0,則數(shù)據(jù)為3位數(shù)
              JNZ       THREEBIT
              CMP       X[2],0      ;如果X[2]不為0,則數(shù)據(jù)為2位數(shù)
              JNZ       TOWBIT
              CMP       X[3],0      ;如果X[3]不為0,則數(shù)據(jù)為1位數(shù)
              JNZ       ONEBIT
              JMP       ZER0BIT     ;否則,沒有數(shù)據(jù)
    FOURBIT:  MOV       CC,4
              JMP       EXIT5
   THREEBIT:  MOV       CC,3
              JMP       EXIT5
     TOWBIT:  MOV       CC,2
              JMP       EXIT5
     ONEBIT:  MOV       CC,1
              JMP       EXIT5
    ZER0BIT:  MOV       CC,0
      EXIT5:  RET
        BITP  ENDP

;延時子程序
        DELY  PROC
              PUSH      CX
              MOV       CX,100
              LOOP      $
              POP       CX
              RET
        DELY  ENDP

        CODE  ENDS
              END       START

全部資料51hei下載地址:
計算器.rar (24.5 KB, 下載次數(shù): 74)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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