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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
可實現加減乘除,除法可顯示小數點后一位,實現連加減運算


單片機源程序如下:

DATA  SEGMENT
           X  DB        ?,?,?,?     ;存放數據的每一位
          X1  DW        ?           ;存放第一個數據值
          X2  DW        ?           ;存放第二個數據值
           Y  DW        ?           ;存放運算結果
           S  DB        ?           ;存放運算符號值
           E  DB        ?           ;按下等號鍵標記
          CC  DB        ?           ;存放運算數據位數
           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      ;設置為A口輸入,B口輸出,C口輸出
              OUT       46H,AL
              MOV       DI,OFFSET X+3           ;DI指向X的高位
        KKK:  CALL      KEY         ;掃描按鍵
              JMP       KKK

;以下為按鍵掃描子程序,程序返回后,在變量H和L中存放當前按鍵的行列號
         KEY  PROC
      CHECK:  CALL      DISP        ;等待按鍵按下的同時進行顯示
              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      ;當前行狀態下沒有任何列有鍵按下,則轉為對下一行的測試
              JZ        NEXTL
              INC       H           ;每判斷一列,列號加1
              JMP       NEXTH       ;再對下一列進行判斷
      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    ;調計算鍵值子程序
       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        ;按下的是數字鍵
              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      ;調數字鍵處理子程序
              JMP       EXIT1
  CONT_CALL:  MOV       S,DL        ;存放運算鍵的鍵值
              MOV       E,0
              CALL      COUNT       ;調運算鍵處理子程序,計算第一個加數
              JMP       EXIT1
  OUTP_CALL:  CALL      OUTP        ;調等號鍵處理子程序
              JMP       EXIT1
   CLR_CALL:  CALL      CLEAR       ;調清除鍵處理子程序
      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


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

     STORE1:  MOV       AX,Y        ;以下程序將各運算子程序返回的運算結果,按位分解,送入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

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

         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       ;按下的是等號,則將第二個運算數據的值存入X2變量
              JMP       EXIT3
       X1_S:  MOV       X1,DX       ;按下的是運算符號,則將第一個運算數據的值存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


;以下為數字鍵處理子程序
;該程序,將輸入的數據按位存放在X變量中,并由CC記錄數據的位數
      NUMBER  PROC
              CMP       E,1
              JNZ       CONTINUE
              MOV       E,0
              CALL      CLEAR
   CONTINUE:  CMP       CC,0        ;目前數據為0位,即沒有數據,則轉到SSS
              JZ        SSS
;若已有數據,以下程序將X左移8位。
;例如:先輸入“1”,當再輸入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     ;將當前鍵入的數據存放到X的最低位
              INC       CC          ;數據位數加1
              CMP       CC,4        ;判斷數據位數
              JNG       EXIT2
              MOV       CC,0        ;如果數據超過4位,重新從最低位開始存放
              MOV       X[2],0
              MOV       X[1],0
              MOV       X[0],0
      EXIT2:  CALL      DISP        ;調顯示子程序,顯示輸入的數據
              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中的數值按位顯示出來
        DISP  PROC
              PUSH      BX
              PUSH      AX
              MOV       BH,0
              LEA       SI,DISCODE
              CALL      BITP        ;測試X位數
              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中沒有數據,不顯示
              OUT       42H,AL
      EXIT4:  POP       AX
              POP       BX
              RET
        DISP  ENDP

;分析數據位數子程序
        BITP  PROC
              CMP       X[0],0      ;如果X[0]不為0,則數據為4位數
              JNZ       FOURBIT
              CMP       X[1],0      ;如果X[1]不為0,則數據為3位數
              JNZ       THREEBIT
              CMP       X[2],0      ;如果X[2]不為0,則數據為2位數
              JNZ       TOWBIT
              CMP       X[3],0      ;如果X[3]不為0,則數據為1位數
              JNZ       ONEBIT
              JMP       ZER0BIT     ;否則,沒有數據
    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, 下載次數: 74)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区电影 | 久久国产精品一区二区三区 | 一区二区精品在线 | 毛片韩国 | 欧美亚洲视频 | 草比网站 | 一级欧美一级日韩片免费观看 | 久久成人精品视频 | 国产美女精品视频 | 在线观看国产视频 | 在线黄| 黄a免费网络 | 国产亚洲精品区 | 欧美高清hd | 国产精品免费一区二区三区四区 | 成人在线视频免费观看 | 天天舔天天 | 久久1区 | 日韩国产中文字幕 | 久久精品国产一区 | 日朝毛片 | 在线免费观看a级片 | 日韩a| 国产区第一页 | 国内自拍视频在线观看 | 天天色天天射天天干 | 亚洲福利 | 日本精品在线播放 | 国产精品久久一区二区三区 | 欧美激情a∨在线视频播放 成人免费共享视频 | 国产视频黄色 | 亚洲欧美在线一区 | 一级毛片视频在线 | 日本午夜在线视频 | 亚洲精品中文在线观看 | 天天夜碰日日摸日日澡 | 国产99久久久久 | 91国产视频在线 | 日韩a在线 | 欧美另类视频在线 | 亚洲精品在线看 |