⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 硬件上机.txt

📁 一些学习汇编语言的代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
1.    编制一个程序,使其能对标准键盘上的按键次数进行计数,并将计数结果显示在LED1上。要求按键之前,在CRT屏幕上显示有关提示信息。当开关K8为“1”时,结束程序。设8255 A的A口作八段LED显示器的段选口,B口作位选口,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



MESG       DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$'            ; 回车,换行,结束符



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




;无键输入立即返回,有键输入则DISP_BUF加1



KEYINPUT:



              MOV AH,0BH             ; 检查键盘有无输入



              INT 21H



              CMP AL,0FFH            ; AL=0FFH 有键输入



              JNZ KEYINPUT_RET



                  MOV AH,1           ; 读取键盘缓冲区内数据(清空键盘缓冲区)



                  INT 21H


2.编写一个程序:把从标准键盘上输入的一组大写字母(10个)转换成与之对应的小写字母,并从CRT屏幕的最左端开始输出,当按下操作面板4×4键盘的‘E’键时,八个发光二极管中L1、L3、L5、L7点亮,L2、L4、L6、L8熄灭,程序结束运行。设8255A的 C口作键盘的行信号,A口作键盘的列信号,B口接发光二极管。




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码,并预先放置显示结束符

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          ; 等待键盘连续输入10个大写字母

        MOV AH,2

        MOV DL,0DH

        INT 21H          ; 回车

        MOV AH,2

        MOV DL,0AH

        INT 21H          ; 换行

        CALL CHG         ; 大小写转换

        LEA DX,KEY_BUF

        ADD DX,2         ; 调整显示缓冲区地址指针到第一个字母位置

        MOV AH,09H       ; 显示转换结果

        INT 21H

        CALL TEST_EXIT   ; 若不满足退出条件,子程序不返回

        CALL DISP        ; 按要求显示发光二极管

        MOV AH,4CH

        INT 21H




; 按要求显示发光二极管,1=亮,0=灭

DISP:

        MOV DX,PORT_A

        MOV AL,01010101B

        OUT DX,AL

        RET




; 将输入的十个大写字母转换为小写

CHG:

              LEA SI,KEY_BUF

              ADD SI,2         ; 调整地址指针指到第一个字母位置

            MOV CX,10        ; 转换十个ASCII码

CHG_NEXT:   MOV AL,[SI]

            OR AL,20H        ; 大写转小写( AND AL,11011111B 即可将小写转大写)

MOV [SI],AL

INC SI

        LOOP CHG_NEXT

            RET




; 等待从非编码键盘上输入E键,是E键时返回

TEST_EXIT:

                   MOV DX,PORT_A

                   MOV AL,11111110B   ; 输出行号,即 C-F行

                   OUT DX,AL

                   MOV DX,PORT_C

                   IN AL,DX

                   TEST AL,00000100B  ; 检查列号,即E键

                   JNZ TEST_EXIT      ; 不是E键,继续等待

                 RET

CODE    ENDS

        END START
3. 编制一个程序:统计K1~K8中扳向前的开关数N和扳向后的开关数M,并将N显示在八段LED显示器LED6~LED4上,M显示在LED3~LED1上,两组交替显示(交替时间的延时由软件实现)。当八个开关都扳向前时,结束程序。设8255A的 C口作八段LED显示器的段选口,B口作位选口,A口接开关。




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

;计数开关中为1和为0的个数,当全为1时退出旗标有效

;出口参数:N= 为1的个数, M= 为0的个数, EXIT_FLAG

KEYINPUT:      MOV DX,PORT_C

               IN AL,DX

               MOV N,0

             MOV CX,8

KEYINPUT_NEXT: SHL AL,1               ;计数AL中有多少个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个开关全为1

                   MOV EXIT_FLAG,TRUE

KEYINPUT_EXIT: RET




; 将AL中的数显示到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




; 延时约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.编制一个程序:根据操作面板上开关的状态决定是否将标准键盘上键入的字母(A~J中任意一个)的ASCII码显示在八个发光二极管L1~L8以及CRT屏幕上。当K1~K7全扳向后时,不显示;当开关K1~K7中的任意一个扳向前时,则显示;当K8扳向前时,结束程序。设8255A的 B口接发光二极管,A口接八个开关。




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




;开关状态检查并设置相应的旗标

;出口参数:若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    ;至少有一个为1,置显示旗标为真

KEY_TEST_LP1:  TEST AL,80H              ; 检查K8

               JZ KEY_TEST_EXIT

                  MOV EXIT_FLAG,TRUE

KEY_TEST_EXIT: RET




KEY_INPUT:

                MOV AH,7             ;等待键盘输入,但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              ; 显示旗标为假则不显示

            MOV AH,2              ; 输出到CRT

            MOV DL,DISP_BUF

            INT 21H

            MOV AL,DISP_BUF       ; 输出到发光二极管

            MOV DX,PORT_A

            OUT DX,AL

DISP_RET:   RET




CODE    ENDS

        END START
4.编制一个程序:根据操作面板上开关的状态决定是否将标准键盘上键入的字母(A~J中任意一个)的ASCII码显示在八个发光二极管L1~L8以及CRT屏幕上。当K1~K7全扳向后时,不显示;当开关K1~K7中的任意一个扳向前时,则显示;当K8扳向前时,结束程序。设8255A的 B口接发光二极管,A口接八个开关。




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




;开关状态检查并设置相应的旗标

;出口参数:若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    ;至少有一个为1,置显示旗标为真

KEY_TEST_LP1:  TEST AL,80H              ; 检查K8

               JZ KEY_TEST_EXIT

                  MOV EXIT_FLAG,TRUE

KEY_TEST_EXIT: RET




KEY_INPUT:

                MOV AH,7             ;等待键盘输入,但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              ; 显示旗标为假则不显示

            MOV AH,2              ; 输出到CRT

            MOV DL,DISP_BUF

            INT 21H

            MOV AL,DISP_BUF       ; 输出到发光二极管

            MOV DX,PORT_A

            OUT DX,AL

DISP_RET:   RET




CODE    ENDS

        END START
5.编制一个程序,使其能完成:从标准键盘上键入任一数字键时可在LED1~LED6上循环显示出来。要求按键之前,LED1~LED6上同时显示“0”,当键入“E”或“e”键时,结束程序。设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 显示初始数据0



        CALL DISP



        MOV DISP_BIT,00100000B      ;为以后LED6显示做准备



    MOV AH,1                    ;等待第一次键盘输入



        INT 21H



        AND AL,0FH



  MOV DISPBUF,AL 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -