?? 硬件上機(jī).txt
字號(hào):
1. 編制一個(gè)程序,使其能對(duì)標(biāo)準(zhǔn)鍵盤(pán)上的按鍵次數(shù)進(jìn)行計(jì)數(shù),并將計(jì)數(shù)結(jié)果顯示在LED1上。要求按鍵之前,在CRT屏幕上顯示有關(guān)提示信息。當(dāng)開(kāi)關(guān)K8為“1”時(shí),結(jié)束程序。設(shè)8255 A的A口作八段LED顯示器的段選口,B口作位選口,C口接開(kāi)關(guān)。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
MESG DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$' ; 回車,換行,結(jié)束符
SEG7CODE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H ; 顯示碼 0 - 9,
DB 88H,83H,0C6H,0A1H,86H,8EH ; A - F
DISP_BUF DB 0
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H ; A,B口輸出,C口輸入
OUT DX,AL
LEA DX,MESG ; 顯示提示信息
MOV AH,9
INT 21H
NEXT: CALL KEYINPUT
CALL DISP
CALL TEST_EXIT
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;無(wú)鍵輸入立即返回,有鍵輸入則DISP_BUF加1
KEYINPUT:
MOV AH,0BH ; 檢查鍵盤(pán)有無(wú)輸入
INT 21H
CMP AL,0FFH ; AL=0FFH 有鍵輸入
JNZ KEYINPUT_RET
MOV AH,1 ; 讀取鍵盤(pán)緩沖區(qū)內(nèi)數(shù)據(jù)(清空鍵盤(pán)緩沖區(qū))
INT 21H
2.編寫(xiě)一個(gè)程序:把從標(biāo)準(zhǔn)鍵盤(pán)上輸入的一組大寫(xiě)字母(10個(gè))轉(zhuǎn)換成與之對(duì)應(yīng)的小寫(xiě)字母,并從CRT屏幕的最左端開(kāi)始輸出,當(dāng)按下操作面板4×4鍵盤(pán)的‘E’鍵時(shí),八個(gè)發(fā)光二極管中L1、L3、L5、L7點(diǎn)亮,L2、L4、L6、L8熄滅,程序結(jié)束運(yùn)行。設(shè)8255A的 C口作鍵盤(pán)的行信號(hào),A口作鍵盤(pán)的列信號(hào),B口接發(fā)光二極管。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
DATA SEGMENT
MESG DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$'
KEY_BUF DB 11,?, 10 DUP(20H),’$’ ; 20H為空格的ASCII碼,并預(yù)先放置顯示結(jié)束符
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H ; A,B口作輸出,C口作輸入
OUT DX,AL
LEA DX,MESG
MOV AH,9
INT 21H ; 顯示提示信息
LEA DX,KEY_BUF
MOV AH,0AH
INT 21H ; 等待鍵盤(pán)連續(xù)輸入10個(gè)大寫(xiě)字母
MOV AH,2
MOV DL,0DH
INT 21H ; 回車
MOV AH,2
MOV DL,0AH
INT 21H ; 換行
CALL CHG ; 大小寫(xiě)轉(zhuǎn)換
LEA DX,KEY_BUF
ADD DX,2 ; 調(diào)整顯示緩沖區(qū)地址指針到第一個(gè)字母位置
MOV AH,09H ; 顯示轉(zhuǎn)換結(jié)果
INT 21H
CALL TEST_EXIT ; 若不滿足退出條件,子程序不返回
CALL DISP ; 按要求顯示發(fā)光二極管
MOV AH,4CH
INT 21H
; 按要求顯示發(fā)光二極管,1=亮,0=滅
DISP:
MOV DX,PORT_A
MOV AL,01010101B
OUT DX,AL
RET
; 將輸入的十個(gè)大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)
CHG:
LEA SI,KEY_BUF
ADD SI,2 ; 調(diào)整地址指針指到第一個(gè)字母位置
MOV CX,10 ; 轉(zhuǎn)換十個(gè)ASCII碼
CHG_NEXT: MOV AL,[SI]
OR AL,20H ; 大寫(xiě)轉(zhuǎn)小寫(xiě)( AND AL,11011111B 即可將小寫(xiě)轉(zhuǎn)大寫(xiě))
MOV [SI],AL
INC SI
LOOP CHG_NEXT
RET
; 等待從非編碼鍵盤(pán)上輸入E鍵,是E鍵時(shí)返回
TEST_EXIT:
MOV DX,PORT_A
MOV AL,11111110B ; 輸出行號(hào),即 C-F行
OUT DX,AL
MOV DX,PORT_C
IN AL,DX
TEST AL,00000100B ; 檢查列號(hào),即E鍵
JNZ TEST_EXIT ; 不是E鍵,繼續(xù)等待
RET
CODE ENDS
END START
3. 編制一個(gè)程序:統(tǒng)計(jì)K1~K8中扳向前的開(kāi)關(guān)數(shù)N和扳向后的開(kāi)關(guān)數(shù)M,并將N顯示在八段LED顯示器LED6~LED4上,M顯示在LED3~LED1上,兩組交替顯示(交替時(shí)間的延時(shí)由軟件實(shí)現(xiàn))。當(dāng)八個(gè)開(kāi)關(guān)都扳向前時(shí),結(jié)束程序。設(shè)8255A的 C口作八段LED顯示器的段選口,B口作位選口,A口接開(kāi)關(guān)。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
SEG7CODE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H ; 0 - 9
DB 88H,83H,0C6H,0A1H,86H,8EH ; A - F
DISP_BIT DB 0
N DB ?
M DB ?
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H
OUT DX,AL
NEXT: CALL KEYINPUT
MOV AL,N ; 顯示N
MOV DISP_BIT, 00111000B ; LED6-LED4 亮
CALL DISP
CALL DELAY
MOV AL,M ;顯示M
MOV DISP_BIT, 00000111B ; LED3-LED1 亮
CALL DISP
CALL DELAY
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;計(jì)數(shù)開(kāi)關(guān)中為1和為0的個(gè)數(shù),當(dāng)全為1時(shí)退出旗標(biāo)有效
;出口參數(shù):N= 為1的個(gè)數(shù), M= 為0的個(gè)數(shù), EXIT_FLAG
KEYINPUT: MOV DX,PORT_C
IN AL,DX
MOV N,0
MOV CX,8
KEYINPUT_NEXT: SHL AL,1 ;計(jì)數(shù)AL中有多少個(gè)1
ADC N,0
LOOP KEYINPUT_NEXT
MOV AL,8
SUB AL,N
MOV M,AL ; M = 8 - N
CMP AL,0
JNZ KEYINPUT_EXIT ; M=0,即8個(gè)開(kāi)關(guān)全為1
MOV EXIT_FLAG,TRUE
KEYINPUT_EXIT: RET
; 將AL中的數(shù)顯示到DISP_BIT位置上
; INPUT: AL=BCD, DISP_BIT
DISP: LEA BX,SEG7CODE
AND AL,0FH
XLAT
MOV DX,PORT_B
OUT DX,AL
MOV AL,DISP_BIT
MOV DX,PORT_A
OUT DX,AL
RET
; 延時(shí)約0.4s
DELAY: PUSH BX
PUSH CX
MOV BX,5000
NEXT2: MOV CX,0FFFFH
NEXT1: DEC CX
JNZ NEXT1
DEC BX
JNZ NEXT2
POP CX
POP BX
RET
CODE ENDS
END START
4.編制一個(gè)程序:根據(jù)操作面板上開(kāi)關(guān)的狀態(tài)決定是否將標(biāo)準(zhǔn)鍵盤(pán)上鍵入的字母(A~J中任意一個(gè))的ASCII碼顯示在八個(gè)發(fā)光二極管L1~L8以及CRT屏幕上。當(dāng)K1~K7全扳向后時(shí),不顯示;當(dāng)開(kāi)關(guān)K1~K7中的任意一個(gè)扳向前時(shí),則顯示;當(dāng)K8扳向前時(shí),結(jié)束程序。設(shè)8255A的 B口接發(fā)光二極管,A口接八個(gè)開(kāi)關(guān)。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
DISP_BUF DB 0
DISP_FLAG DB 0
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H
OUT DX,AL
NEXT: CALL KEY_INPUT
CALL KEY_TEST
CALL DISP
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;開(kāi)關(guān)狀態(tài)檢查并設(shè)置相應(yīng)的旗標(biāo)
;出口參數(shù):若K7-K1全為0,DISP_FLAG=FALSE,否則DISP_FLAG = TRUE
; 若 K8=1,則EXIT_FLAG=TRUE
KEY_TEST:
MOV AL,0
MOV DX,PORT_A
OUT DX,AL
MOV DISP_FLAG,FALSE
MOV DX,PORT_C
IN AL,DX
TEST AL,7FH ;檢查K7-K1
JZ KEY_TEST_LP1
MOV DISP_FLAG,TRUE ;至少有一個(gè)為1,置顯示旗標(biāo)為真
KEY_TEST_LP1: TEST AL,80H ; 檢查K8
JZ KEY_TEST_EXIT
MOV EXIT_FLAG,TRUE
KEY_TEST_EXIT: RET
KEY_INPUT:
MOV AH,7 ;等待鍵盤(pán)輸入,但CRT上不顯示
INT 21H
CMP AL,’A’
JB KEY_INPUT_RET ; < A
CMP AL,’J’
JA KEY_INPUT_RET ; > J
MOV DISP_BUF,AL
KEY_INPUT_RET: RET
DISP:
CMP DISP_FLAG,TRUE
JNZ DISP_RET ; 顯示旗標(biāo)為假則不顯示
MOV AH,2 ; 輸出到CRT
MOV DL,DISP_BUF
INT 21H
MOV AL,DISP_BUF ; 輸出到發(fā)光二極管
MOV DX,PORT_A
OUT DX,AL
DISP_RET: RET
CODE ENDS
END START
4.編制一個(gè)程序:根據(jù)操作面板上開(kāi)關(guān)的狀態(tài)決定是否將標(biāo)準(zhǔn)鍵盤(pán)上鍵入的字母(A~J中任意一個(gè))的ASCII碼顯示在八個(gè)發(fā)光二極管L1~L8以及CRT屏幕上。當(dāng)K1~K7全扳向后時(shí),不顯示;當(dāng)開(kāi)關(guān)K1~K7中的任意一個(gè)扳向前時(shí),則顯示;當(dāng)K8扳向前時(shí),結(jié)束程序。設(shè)8255A的 B口接發(fā)光二極管,A口接八個(gè)開(kāi)關(guān)。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
DISP_BUF DB 0
DISP_FLAG DB 0
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H
OUT DX,AL
NEXT: CALL KEY_INPUT
CALL KEY_TEST
CALL DISP
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;開(kāi)關(guān)狀態(tài)檢查并設(shè)置相應(yīng)的旗標(biāo)
;出口參數(shù):若K7-K1全為0,DISP_FLAG=FALSE,否則DISP_FLAG = TRUE
; 若 K8=1,則EXIT_FLAG=TRUE
KEY_TEST:
MOV AL,0
MOV DX,PORT_A
OUT DX,AL
MOV DISP_FLAG,FALSE
MOV DX,PORT_C
IN AL,DX
TEST AL,7FH ;檢查K7-K1
JZ KEY_TEST_LP1
MOV DISP_FLAG,TRUE ;至少有一個(gè)為1,置顯示旗標(biāo)為真
KEY_TEST_LP1: TEST AL,80H ; 檢查K8
JZ KEY_TEST_EXIT
MOV EXIT_FLAG,TRUE
KEY_TEST_EXIT: RET
KEY_INPUT:
MOV AH,7 ;等待鍵盤(pán)輸入,但CRT上不顯示
INT 21H
CMP AL,’A’
JB KEY_INPUT_RET ; < A
CMP AL,’J’
JA KEY_INPUT_RET ; > J
MOV DISP_BUF,AL
KEY_INPUT_RET: RET
DISP:
CMP DISP_FLAG,TRUE
JNZ DISP_RET ; 顯示旗標(biāo)為假則不顯示
MOV AH,2 ; 輸出到CRT
MOV DL,DISP_BUF
INT 21H
MOV AL,DISP_BUF ; 輸出到發(fā)光二極管
MOV DX,PORT_A
OUT DX,AL
DISP_RET: RET
CODE ENDS
END START
5.編制一個(gè)程序,使其能完成:從標(biāo)準(zhǔn)鍵盤(pán)上鍵入任一數(shù)字鍵時(shí)可在LED1~LED6上循環(huán)顯示出來(lái)。要求按鍵之前,LED1~LED6上同時(shí)顯示“0”,當(dāng)鍵入“E”或“e”鍵時(shí),結(jié)束程序。設(shè)8255 A的B口作八段LED顯示器的段選口,C口作位選口。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
SEG7CODE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
DB 88H,83H,0C6H,0A1H,86H,8EH
DISP_BIT DB 00100000B
DISPBUF DB ?
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,80H
OUT DX,AL
MOV DISPBUF,0
MOV DISP_BIT,00111111B ; LED6-LED1 顯示初始數(shù)據(jù)0
CALL DISP
MOV DISP_BIT,00100000B ;為以后LED6顯示做準(zhǔn)備
MOV AH,1 ;等待第一次鍵盤(pán)輸入
INT 21H
AND AL,0FH
MOV DISPBUF,AL
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -