?? 硬件例題.txt
字號:
例1: 編程實現:從非編碼鍵盤上按鍵,將該鍵的編號顯示到CRT屏幕上.按下'F'鍵時退出程序.
PORT_H EQU 208H
PORT_V EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
EXIT_KEY EQU 0FH
DATA SEGMENT
DISP_BUF DB ?
H_NUMBER DB ?
EXIT_FLAG DB ?
ASCII_TABLE DB '0123456789ABCDEF'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,10001001B ; INIT 8255 A,B=OUT C=IN
MOV DX,PORT_CW
OUT DX,AL
MOV EXIT_FLAG,FALSE
NEXT: CALL KEY_INPUT
CALL DISP
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
DISP:
LEA BX,ASCII_TABLE
MOV AL,DISP_BUF
AND AL,0FH
XLAT
MOV DL,AL
MOV AH,2
INT 21H
RET
DELAY:
PUSH BX
PUSH CX
MOV BX,150
DELAY_LP2: MOV CX,0FFFFH
DELAY_LP1: DEC CX
JNZ DELAY_LP1
DEC BX
JNZ DELAY_LP2
POP CX
POP BX
RET
KEY_INPUT:
MOV H_NUMBER,0
KEY_WAIT: CALL OUT_HV
CMP AL,0FH
JZ KEY_WAIT
CALL DELAY
MOV H_NUMBER,0F7H
MOV BL,0
KEY_LP2: CALL OUT_HV
CMP AL,0FH
JNZ KEY_FIND
ADD BL,4
ROR H_NUMBER,1
JNC KEY_RET
JMP KEY_LP2
KEY_FIND: SHR AL,1
JNC KEY_LP3
INC BL
JMP KEY_FIND
KEY_LP3: MOV H_NUMBER,0
CALL OUT_HV
CMP AL,0FH
JNZ KEY_LP3
CALL DELAY
CMP BL,EXIT_KEY
JNZ KEY_RET
MOV EXIT_FLAG,TRUE
KEY_RET: MOV DISP_BUF,BL
RET
; INPUT: H_NUMBER
; OUTPUT: AL
OUT_HV:
MOV DX,PORT_H
MOV AL,H_NUMBER
OUT DX,AL
MOV DX,PORT_V
IN AL,DX
AND AL,0FH
RET
CODE ENDS
END START
例2 用動態掃描方式控制6個七段數碼管,使它能同時顯示不同信息.再從標準鍵盤上輸入0-9,將新輸入的數據顯示到LED最右1位,并將原LED顯示信息左移1位.當按下回車鍵時退出程序.
PORT_BIT EQU 208H
PORT_7SEG EQU 209H
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
EXIT_KEY EQU 0DH
DATA SEGMENT
SEG_7_CODE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH
DISP_BUF DB 1,2,3,4,5,6
DISP_BIT DB ?
EXIT_FLAG DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,10000000B ; INIT 8255 A,B,C=OUT
MOV DX,PORT_CW
OUT DX,AL
MOV EXIT_FLAG,FALSE
NEXT: CALL DISP
CALL KEY_INPUT
CMP EXIT_FLAG,TRUE
JNZ NEXT
CALL LED_OFF
MOV AH,4CH
INT 21H
DISP:
MOV DISP_BIT,00100000B
LEA BX,SEG_7_CODE
LEA SI,DISP_BUF
DISP_NEXT:
CALL LED_OFF
MOV AL,[SI]
INC SI
XLAT
MOV DX,PORT_7SEG
OUT DX,AL
MOV DX,PORT_BIT
MOV AL,DISP_BIT
OUT DX,AL
CALL DELAY
SHR DISP_BIT,1
JNC DISP_NEXT
RET
LED_OFF:
MOV DX,PORT_BIT
MOV AL,0
OUT DX,AL
RET
DELAY:
PUSH BX
PUSH CX
MOV BX,20
DELAY_LP2: MOV CX,0FFFFH
DELAY_LP1: DEC CX
JNZ DELAY_LP1
DEC BX
JNZ DELAY_LP2
POP CX
POP BX
RET
KEY_INPUT:
MOV AH,0BH
INT 21H
CMP AL,0
JZ KEY_IN_RET
CALL DISP_BUF_SHL
MOV AH,1
INT 21H
CMP AL,EXIT_KEY
JNZ KEY_INPUT_LP1
MOV EXIT_FLAG,TRUE
KEY_INPUT_LP1: AND AL,0FH
MOV [DISP_BUF+5],AL
KEY_IN_RET: RET
DISP_BUF_SHL:
LEA SI,DISP_BUF
MOV CX,5
DISP_BUF_SHL_NEXT:
MOV AL,[SI+1]
MOV [SI],AL
INC SI
LOOP DISP_BUF_SHL_NEXT
RET
CODE ENDS
END START
例3 編程實現流水燈控制.當開關K7合上時左轉,斷開時右轉,若開關K8合上則程序退出
; ---------- DEFINE ----------
PORT_DISP EQU 209H
PORT_KEY EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
EXIT_KEY EQU 10000000B
ROL_KEY EQU 01000000B
; ---------- DEFINE ----------
DATA SEGMENT
DISP_BUF DB 00000001B
EXIT_FLAG DB ?
ROL_FLAG DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,10001001B ; INIT 8255 B=OUT C=IN
MOV DX,PORT_CW
OUT DX,AL
MOV EXIT_FLAG,FALSE
MOV ROL_FLAG,FALSE
NEXT: CALL DISP
CALL DELAY
CALL TEST_KEY
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
DISP:
CMP ROL_FLAG,TRUE
JE DISP_LP1
ROR DISP_BUF,1
JMP DISP_LP2
DISP_LP1: ROL DISP_BUF,1
DISP_LP2: MOV DX,PORT_DISP
MOV AL,DISP_BUF
OUT DX,AL
RET
DELAY:
PUSH BX
PUSH CX
MOV BX,2000
DELAY_LP2: MOV CX,0FFFFH
DELAY_LP1: DEC CX
JNZ DELAY_LP1
DEC BX
JNZ DELAY_LP2
POP CX
POP BX
RET
TEST_KEY:
MOV DX,PORT_KEY
IN AL,DX
TEST AL,EXIT_KEY
JZ TEST_KEY_LP1
MOV EXIT_FLAG,TRUE
TEST_KEY_LP1: MOV ROL_FLAG,FALSE
TEST AL,ROL_KEY
JZ TEST_KEY_RET
MOV ROL_FLAG,TRUE
TEST_KEY_RET: RET
CODE ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -