|
單片機步進電機課程設計
可實現調速以及正反轉等功能
- IOY0 EQU 3000H ;片選IOY0 對應的端口始地址
- MY8255_A EQU IOY0+00H*4 ;8255 的 A 口地址,輸出,鍵盤列選
- MY8255_B EQU IOY0+01H*4 ;8255 的 B 口地址,輸出,數碼管編碼
- MY8255_C EQU IOY0+02H*4 ;8255 的 C 口地址,低四位,讀鍵盤行號,高四位輸出,控制步進電機
- MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
- STACK1 SEGMENT STACK ;定義一個棧區
- DW 256 DUP(?) ;開辟出256個字單元空間
- STACK1 ENDS
- DATA SEGMENT
- DTABLE1 DB 6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80H ;這十個分別表示的數碼管顯示是 5,E,P,A,C,1,2,3,4,.
- DTABLE3 DB 10H,30H,20H,60H,40H,0C0H,80H,90H ;歩進電機正向轉速表
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE,DS:DATA
- START: MOV AX,DATA
- MOV DS,AX
- MOV SI,3000H;建立緩沖區,存放要顯示的鍵值
- ;[SI][SI+2][SI+4][SI+6]中分別存放四個數碼管應顯示的編碼在DTABLE1中對應的位置
- MOV BYTE PTR [SI],00H;內容s
- MOV BYTE PTR [SI+2],09H;內容.
- MOV BYTE PTR [SI+4],04H;內容c
- MOV BYTE PTR [SI+6],05H;內容1
- MOV BYTE PTR [SI+8],01H;內容E
- MOV DX,MY8255_MODE;初始化8255工作方式
- MOV AL,81H;方式0,A輸出(數碼管片選)、B口輸出(數碼管)、C口低四位輸入(按鍵),高四位輸出(步進電機)
- OUT DX,AL
- KAISHI:
- MOV SI,3000H
- MOV DH,[SI+8]
- CMP DH,08H
- JA ZHI1;高于跳轉
- CMP DH,01H
- JB ZHI8;不高于跳轉
- JMP JIXU
- ZHI1: MOV BYTE PTR[SI+8],01H
- JMP JIXU
- ZHI8: MOV BYTE PTR[SI+8],08H
- JIXU: CALL KEYSCAN
- MOV AH ,1;判斷是否有按鍵按下
- INT 16H ;鍵盤服務
- JZ SFRUN;等于0,讀入字符,則跳轉
-
- QUIT: MOV AX,4C00H
- INT 21H
-
- SFRUN:
- MOV SI,3000H
- MOV DH,[SI]
- CMP DH,01H
- JNZ JIXU;為0則跳轉
- MOV DH,[SI+4]
- CMP DH,04H
- JNZ ZIJIAN;不為4則跳轉
- INC BYTE PTR[SI+8] ;地址si+8處的字節變量加1
- JMP RUN
- KAISHI1: JMP KAISHI
- ZIJIAN :
- DEC BYTE PTR[SI+8]
- RUN:
- MOV AL,[SI+8]
- MOV BX,OFFSET DTABLE3
- AND AX,00FFH
- ADD BX,AX
- DEC BX
- MOV AL,[BX]
- MOV DX,MY8255_C
- OUT DX,AL
- DANG1: MOV DH,[SI+6]
- CMP DH,05H ;1
- JNZ DANG2
- PUSH CX;cx的值壓入堆棧保存
- MOV CX,10H;循環10次
- DA1: CALL DALLY1 ;1檔速度
- CALL DALLY
- CALL DALLY1
- CALL DALLY1
- CALL DALLY1
- CALL KEYSCAN
- JMP KAISHI
-
- DANG2: CMP DH,06H;2
- JNZ DANG3
- DA2: CALL DALLY1 ;2檔速度
- CALL DALLY1
- CALL DALLY1
- JMP KAISHI
- DANG3: CMP DH,07H;3
- JNZ DANG4
-
-
- DA3: CALL DALLY1 ;3檔速度
- CALL DALLY1
- JMP KAISHI
- DANG4: CMP DH,08H;4
- JNZ KAISHI1
- DA4: CALL DALLY1 ;4檔速度
- CALL KEYSCAN
- JMP KAISHI
-
- DALLY1 PROC NEAR ;軟件延遲子程序
- PUSH CX
- PUSH AX
- MOV CX,00AFH
- D11:MOV AX,1000H
- D22: DEC AX
- JNZ D22
- PUSH CX;進棧
- PUSH AX;進棧
- CALL KEYSCAN
- POP AX;出棧
- POP CX;出棧
- LOOP D11
- POP AX;出棧
- POP CX;出棧
- RET;返回
- DALLY1 ENDP
- KEYSCAN PROC NEAR;鍵盤掃描子程序
- BEGIN:
- CALL DIS;刷新
- CALL CLEAR;清屏
- CALL CCSCAN;掃描按鍵
- JNZ GETKEY1;有鍵按下則跳置 GETKEY1
- JMP GOBACK1
- GETKEY1: CALL DIS;顯示刷新
- CALL DALLY
- CALL DALLY
- CALL CLEAR;清屏
- CALL CCSCAN;再次掃描按鍵
- JNZ GETKEY2;有鍵按下則跳置 GETKEY2
- JMP BEGIN;否則跳回開始繼續循環
-
- GETKEY2: MOV CH,0FEH;設置當前檢測的是第幾列
- MOV CL,00H
-
-
- COLUM: MOV AL,CH;選取一列,將x1~x4中一個置0
- MOV DX,MY8255_A
- OUT DX,AL
- MOV DX,MY8255_C;讀y1~y4,用于判斷是哪一行按鍵閉合
- IN AL,DX
- L1: TEST AL,01H;是否為第 1 行
- JNZ L2;不是則繼續判斷
- MOV AL,00H;設置第 1 行第 1 列的對應的鍵值
- JMP KCODE
- BEGIN1: JMP BEGIN
- L2: TEST AL,02H;是否為第 2 行
- JNZ L3;不是則繼續判斷
- MOV AL,04H;設置第 2 行第 1 列的對應的鍵值
- JMP KCODE
-
- L3: TEST AL,04H;是否為第 3 行
- JNZ L4;不是則繼續判斷
- MOV AL,08H;設置第 3 行第 1 列的對應的鍵值
- JMP KCODE
-
- L4: TEST AL,08H;是否為第 4 行
- JNZ NEXT;不是則繼續判斷
- MOV AL,0CH;設置第 4 行第 1 列的對應的鍵值
-
- KCODE: ADD AL,CL;將第一列的值加上當前列數,等于按鍵值
- CALL PUTBUF;保存按鍵值
- PUSH AX
-
- KON:;顯示刷新
- CALL DIS;等待按鍵彈起
- CALL CLEAR;清屏
- CALL CCSCAN;掃描按鍵,判斷按鍵是否彈起
- JNZ KON;未彈起則繼續循環等待彈起
- POP AX
- NEXT:
- INC CL;當前檢測的列數遞增
- MOV AL,CH
- TEST AL,08H;檢測是否掃描到第 4 列
- JZ BEGIN1;是則跳回到開始處
- ROL AL,1;沒檢測到第 4 列則準備檢測下一列
- MOV CH,AL
- JMP COLUM
- GOBACK1: RET
- KEYSCAN ENDP
-
- CCSCAN PROC NEAR;掃描是否有按鍵閉合子程序
- MOV AL,00H
- MOV DX,MY8255_A;將 4 列全選通,X1~X4 置 0
- OUT DX,AL
- MOV DX,MY8255_C
- IN AL,DX;讀 Y1~Y4
- NOT AL
- AND AL,0FH;取出 Y1~Y4 的反值
- RET
- CCSCAN ENDP
- CLEAR PROC NEAR ;清除數碼管顯示子程序
- MOV DX,MY8255_B ;段位置0即可清除數碼管顯示
- MOV AL,00H
- OUT DX,AL
- RET
- CLEAR ENDP
- DIS PROC NEAR ;顯示鍵值子程序
- PUSH AX ;AX入棧
- PUSH SI ;SI入棧,堆棧里保存了AX的0700,SI的3000
- MOV SI,3006H ;此處為3006H是先顯示的第四個管,下面SI DEC兩次即顯示第三個數碼管
- MOV DL,0F7H
- MOV AL,DL ;AL 0F7H
- AGAIN:
- PUSH DX ;DX入棧,堆棧里第一次是保存了DX的C4F7
- MOV DX,MY8255_A
- OUT DX,AL ;0F7H輸出到A口,設置x1~x4,選通一個數碼管
- MOV AL,[SI] ;SI指向一個緩沖區,取出緩沖區中存放鍵值在DTABLE1中的偏移量(05H)
- MOV BX,OFFSET DTABLE1 ;DTABLE1的偏移地址移入BX
- AND AX,00FFH ;AX與00FFH"按位與",和0相與清除,和1相與保留,保留了后8位
- ADD BX,AX ;DTABLE1的偏移地址加上鍵值的偏移量,即要輸出的數的地址
- MOV AL,[BX]
- MOV DX,MY8255_B
- OUT DX,AL ;寫入數碼管A~Dp
- CALL DALLY ;過程嵌套,調用DALLY1過程
- DEC SI
- DEC SI ;取下一個鍵值
- POP DX ;DX出棧
- MOV AL,DL ;DL中存放是否顯示完的標志
- TEST AL,01H ;判斷是否顯示完?
- JZ OUT1 ;顯示完,返回
- ROR AL,1 ;AL循環右移一位
- MOV DL,AL ;存放DL,相當于DL循環右移一位
- JMP AGAIN ;未顯示完,調回繼續
- OUT1: POP SI ;SI出棧
- POP AX ;AX出棧
- RET
- DIS ENDP
- PUTBUF PROC NEAR ;保存子鍵子程序
- MOV SI,3000H
- CMP AL,00H
- JNZ MODE
- DIR:
- CMP BYTE PTR[SI+4],03H
- JZ DIR1
- MOV BYTE PTR[SI+4],03H
- JMP LAST
- DIR1:
- MOV BYTE PTR[SI+4],04H
- JMP LAST
- MODE:
- CMP AL,01H
- JNZ STOP
- CMP BYTE PTR[SI],01H
- JZ MODE1
- MOV BYTE PTR[SI],01H
- JMP LAST
- MODE1:
- MOV BYTE PTR[SI],02H
- JMP LAST
- STOP:
- CMP AL,02H
- JNZ GRD1
- MOV BYTE PTR[SI],00H
- MOV BYTE PTR[SI+4],04H
- MOV BYTE PTR[SI+6],05H
- GRD1:
- CMP AL,04H
- JNZ GRD2
- MOV BYTE PTR[SI+6],05H
- GRD2:
- CMP AL,05H
- JNZ GRD3
- MOV BYTE PTR[SI+6],06H
- GRD3:
- CMP AL,06H
- JNZ GRD4
- MOV BYTE PTR[SI+6],07H
- GRD4:
- CMP AL,07H
- JNZ LAST
- MOV BYTE PTR[SI+6],08H
- LAST:
- CALL DIS
- CALL CLEAR
- CALL CCSCAN
- GOBACK:
- RET
- PUTBUF ENDP
- DALLY PROC NEAR ;軟件延遲子程序
- PUSH CX
- MOV CX,00FFH
- D1:
- MOV AX,00FFH
- D2:
- DEC AX
- JNZ D2
- LOOP D1
- POP CX
- RET
- DALLY ENDP
- CODE ENDS
- END START
復制代碼
|
|