📄 硬件例题.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 + -