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

📄 硬件上机.txt

📁 一些学习汇编语言的代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
NEXT:   CALL DISP                  ; 显示、移位并延时



        CALL KEY_INPUT



CMP EXIT_FLAG,TRUE



        JNZ NEXT



MOV AH,4CH



INT 21H












KEY_INPUT:  MOV AH,0BH



        INT 21H



            CMP AL,0



            JZ KEY_RET      ;无键盘输入,退出子程序



         MOV AH,1     ;读出ASCII码



             INT 21H



               OR AL,20H    ;改小写



       CMP AL,'e'



               JNZ KEY_LP1



                   MOV EXIT_FLAG,TRUE 



KEY_LP1:      AND AL,0FH



      MOV DISPBUF,AL 



KEY_RET:      RET






;将DISPBUF显示到DISP_BIT位上,显示位右移,延时0.4秒



DISP:      LEA BX,SEG7CODE



           MOV AL,DISPBUF



       AND AL,0FH



           XLAT



           MOV DX,PORT_B



       OUT DX,AL



           MOV AL,DISP_BIT



           MOV DX,PORT_C



       OUT DX,AL



           ROR DISP_BIT,1



           JNC DISP_RET



               MOV DISP_BIT,00100000B



DISP_RET:  CALL DELAY



       RET






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

6.编制一个程序,使其能完成:当从操作面板4×4键盘上连续键入不同的数字(只能是A~F)键,可按键入的先后顺序在CRT屏幕上依次显示出相应的字母,要求按键之前,在屏幕上先显示有关提示信息。当键入“0”键时,结束程序。设8255A的B口作键盘的行信号,C口作键盘的列信号。






PORT_ROW     EQU   209H
PORT_COL     EQU   20AH
PORT_CW      EQU   20BH






DATA SEGMENT



ASCII        DB ‘0123456789ABCDEF’



STRING       DB ‘PRESS A – F’, 0DH,0AH,‘$’



ROW_NUMBER   DB   ?



KEY_BUF      DB   ?



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,STRING      ;显示提示信息



        MOV AH,9



        INT 21H



NEXT:  CALL KEY_INPUT     ;检查非编码键盘



        CMP KEY_BUF,0      ;检查退出条件(0号键)



        JZ  EXIT           ;是,退出



        CMP KEY_BUF,0FFH   ;检查是否有键号输入



        JZ NEXT            ;无,重新等待



            CALL DISP      ;有输入,显示到CRT上(注:没做容错处理)



JMP NEXT



EXIT:       MOV AH,4CH     ;返回到DOS



INT 21H






; 将KEY_BUF中的键号显示到CRT上



DISP:       LEA BX,ASCII          ;取表指针

            MOV AL,KEY_BUF



            XLAT                  ;查表得ASCII码



  MOV DL,AL



            MOV AH,2              ;显示到CRT上



            INT 21H 



            RET






; 非编码键盘输入子程序



; OUTPUT: AL= 键号,0FFH 无键输入



KEY_INPUT:



          MOV KEY_BUF,#0FFH         ;置无键输入标志



                MOV ROW_NUMBER,0          ; 打开所有行
KEY_WAIT:       CALL OUT_ROW_IN_COL   
                CMP AL,0FH
                JZ KEY_EXIT               ; 没键输入,退出
                   CALL DELAY20MS         ; 防抖动
                   MOV ROW_NUMBER,0F7H    ;输出第一行
                   MOV BL,0
KEY_LP2:        CALL OUT_ROW_IN_COL
                   CMP AL,0FH
                   JNZ KEY_FIND           ; 检查按键是否在本行
                       ADD BL,4           ; 不在,键号+4
                       ROR ROW_NUMBER,1   ; 修改行号
                       JC KEY_LP2



                      JMP KEY_EXIT    ; 4行都没有,本次无效
KEY_FIND:       SHR AL,1                  ; 列号查找
                JNC KEY_LP3
                    INC BL                ;键号+1
                    JMP KEY_FIND
KEY_LP3:       MOV ROW_NUMBER,0           ; 判是否松手
               CALL OUT_ROW_IN_COL
               CMP AL,0FH
               JNZ KEY_LP3                ;未松手,继续等待
                   CALL DELAY20MS         ; 松手时防颤抖
KEY_RET:     MOV KEY_BUF,BL               ; 保存键号
KEY_EXIT:    RET





;输出行号值,读回列号值(AL)
; INPUT:  ROW_NUMBER
; OUTPUT: AL
OUT_ROW_IN_COL:
          MOV DX,PORT_ROW         ;输出行号
          MOV AL,ROW_NUMBER
          OUT DX,AL
          MOV DX,PORT_COL         ;读回列号
          IN AL,DX
          AND AL,0FH
          RET









DELAY20MS:
        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




CODE    ENDS



        END START

7.编写一个程序,它能对操作面板上4×4键盘的按键次数进行计数,并将该计数结果以压缩BCD码形式显示在发光二极管L8~L1上,要求按键之前,在CRT屏幕上显示有关提示符,计满20次后回零,并在CRT上显示“END”,结束程序。设8255A的A口接L1~L8,B口作键盘的行信号,C口作键盘的列信号。




PORT_A   EQU  208H

PORT_B   EQU  209H

PORT_C   EQU  20AH

PORT_CW  EQU  20BH




DATA SEGMENT

MESS       DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$'

MESS2      DB 'END',0DH,0AH,'$'

COUNTER    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

        LEA DX,MESS

        MOV AH,09H

        INT 21H

NEXT:   CALL KEY_INPUT

        CALL DISP

        CMP COUNTER,20         ; 检查是否计数20次

        JNZ NEXT

      MOV COUNTER,0      ;关显示

            CALL DISP

      LEA DX,MESS2       ;屏幕显示提示信息

            MOV AH,9

      INT 21H

            MOV AH,4CH

        INT 21H




;检查非编码键盘有无输入,无输入返回,有输入则COUNTER加1

KEY_INPUT:

                MOV DX,PORT_B

                MOV AL,0             ;打开所有行号

                OUT DX,AL

                MOV DX,PORT_C

                IN AL,DX

                AND AL,0FH

                CMP AL,0FH          ;检查有无键输入

                JZ KEY_INPUT_RET

                   INC COUNTER     ;计数

                   CALL DELAY       ;防颤抖

KEY_INPUT_WAIT:    MOV DX,PORT_C

                   IN AL,DX

                   AND AL,0FH

                   CMP AL,0FH           ;判按键是否松手

                   JNZ KEY_INPUT_WAIT   ;没松手继续等待

                   CALL DELAY           ;防颤抖

KEY_INPUT_RET:  RET




;延时约20ms

DELAY:

                PUSH BX

                PUSH CX

                        MOV BX,200

NEXT2:                  MOV CX,0FFFFH

NEXT1:                  LOOP NEXT1

                        DEC BX

                        JNZ NEXT2

                POP CX

                POP BX

                RET




; 将COUNTER中的数据转换为组合BCD码并显示到发光二极管上

DISP:       MOV AL,DISP_BUF

            MOV BL,10

            MOV AH,0

            DIV BL

            MOV CL,4

            SHL AL,CL        ;商移到高位

            ADD AL,AH        ;加余数得组合BCD码

            MOV DX,PORT_A

            OUT DX,AL

RET




CODE    ENDS

        END START
8.编制程序,完成如下功能:将开关K5~K8的状态所对应的十六进制数在LED1~LED6上按从左到右的顺序循环显示;当开关K1为“1”时,结束程序。设8255A的B口作八段LED显示器的段选口,A口作位选口,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,89H



        OUT DX,AL



NEXT:   CALL KEYINPUT



        CALL DISP



        CMP EXIT_FLAG,TRUE



        JNZ NEXT



        MOV AH,4CH



        INT 21H






KEYINPUT:



               MOV DX,PORT_C



               IN AL,DX



               TEST AL,00000001B    ; 检查退出开关K1



               JZ KEYINPUT_LP1



                  MOV EXIT_FLAG,TRUE



KEYINPUT_LP1:  MOV CL,4



               SHR AL,CL            ;将K8-K5移到低4位



               MOV DISPBUF,AL



               RET






; INPUT: DISPBUF



DISP:



        LEA BX,SEG7CODE



        MOV AL,DISPBUF



        AND AL,0FH



        XLAT                        ;查表得七段显示码



        MOV DX,PORT_B



        OUT DX,AL



        MOV AL,DISP_BIT



        MOV DX,PORT_A



        OUT DX,AL



        ROR DISP_BIT,1              ; 移到下一个LED显示位



        JNC DISP_RET



            MOV DISP_BIT,00100000B   ;6次后显示位复位



DISP_RET:  CALL DELAY



        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

⌨️ 快捷键说明

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