计算机接口与汇编实践-输入键盘并显示

a8255        equ 288H    ;8255 A口    
c8255        equ 28aH    ;8255 C口
 k8255        equ 28bH    ;8255控制口
data segment
 table1    dw 0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
           dw 07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h    ;键盘扫描码表
 LED       DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH
           DB 39h,5EH,79h,71h,0ffh   ;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
 char  db '0123456789ABCDEF'                    ;字符表
mes   db 0ah,0dh,'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0ah,0dh
       db 'IT WILL BE ON THE SCREEN! END WITH E ',0ah,0dh,'$'
 key_in db 0h
data ends
stacks segment stack    ;堆栈空间
     db 100 dup (?)
stacks ends
code segment
        assume cs:code,ds:data,ss:stacks,es:data
start:
        cli
        mov ax,data
        mov ds,ax
        mov es,ax
    mov ax,stacks
        mov ss,ax
        mov dx,offset mes       ;显示提示信息
        mov ah,09
        int 21h  
        MOV DX,k8255            ;初始化8255控制字
        mov al,81h   ;C口低四位输入,A口方式0输出
        out dx,al    
      
main_key:
        call key                ;get a char in (key_in) and display it
        call disply               	;调显示子程序,显示得到的字符
        cmp byte ptr key_in,'E'
        jnz main_key
        mov ax,4c00h            ;if (dl)='E' return to EXIT!
        int 21h                 ;退出

key proc near
key_loop:
        mov ah,1
        int 16h
        jnz exit                    ;pc键盘有键按下则退出
       
        mov dx,c8255
        mov al,0fh
        out dx,al
        in al,dx                    ;读行扫描值
        and al,0fh
        cmp al,0fh
        jz key_loop                 ;未发现有键按下则转
        call delay                  ;delay for amoment
        mov ah,al
        mov dx,k8255
        mov al,88h
        out dx,al
        mov dx,c8255
        mov al,ah
        or al,0f0h
        out dx,al
        in al,dx                    ;读列扫描值
        and al,0f0h
        cmp al,0f0h
        jz key_loop                 ;未发现有键按下则转
        
        mov si,offset table1        ;键盘扫描码表首址
        mov di,offset char          ;字符表首址
        mov cx,16                   ;待查表的表大小
key_tonext:
        cmp ax,[si]                 ;cmp (col,row) with every word
        jz key_findkey              ;in the table
        dec cx
        jz key_loop                 ;未找到对应扫描码
        add si,2
        inc di
        jmp key_tonext

key_findkey:
        mov dl,[di]
        mov ah,02
        int 21h            ;显示查找到的键盘码
        mov byte ptr key_in,dl

key_waitup:
        MOV DX,k8255
        mov al,81h
        out dx,al
        mov dx,c8255
        mov al,0fh
        out dx,al
        in al,dx           ;读行扫描值
        and al,0fh
        cmp al,0fh
        jnz key_waitup     ;按键未抬起转
        call delay         ;delay for amoment
        ret
exit:        mov byte ptr key_in,'E'
        ret
key endp
delay proc near
        push ax            ;delay 50ms--100ms
        mov ah,0
        int 1ah
        mov bx,dx
delay1:
        mov ah,0
        int 1ah
        cmp bx,dx
        jz delay1
        mov bx,dx
delay2:
        mov ah,0
        int 1ah
        cmp bx,dx
        jz delay2
        pop ax
       ret
delay endp
DISPLY    PROC NEAR
    	PUSH ax
    	MOV BX,OFFSET LED
    	MOV AL,byte ptr key_in
      SUB al,30h
      CMP al,09h
      JNG  DIS2
       SUB al,07h
DIS2:  XLAT
    	 MOV DX,a8255
    	 OUT DX,AL                     ;输出显示数据,段码
       POP AX
    	 RET
DISPLY    ENDP

code ends
end start

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值