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

📄 key.asm

📁 是一个小键盘的并口程序 用汇编语言编的,小键盘是所用实验板上的
💻 ASM
字号:
pa55 equ 0dc00h-200h+218h
pb55 equ 0dc00h-200h+219h
p55ctl equ 0dc00h-200h+21bh

data   segment
d1  db 'please press the keyboard:$'
d2  db 'you press :$'
table  dw 0fefeh,'c'      ;书P150页有此定义
       dw 0fefdh,'d'      ;数字代表小键盘的地址??
       dw 0fefbh,'e'
       dw 0fef7h,'f'
       dw 0feefh,'b'
       dw 0fedfh,'a'
       dw 0febfh,'9'
       dw 0fe7fh,'8'
       dw 0fdfeh,'4'
       dw 0fdfdh,'5'
       dw 0fdfbh,'6'
       dw 0fdf7h,'7'
       dw 0fdefh,'3'
       dw 0fddfh,'2'
       dw 0fdbfh,'1'
       dw 0fd7fh,'0'
       dw 0fbefh,'r'
       dw 0fbdfh,'p'
       dw 0fbbfh,'m'
       dw 0fb7fh,'g'
data   ends

code   segment
       assume ds:data,cs:code
start: mov ax,data
       mov ds,ax
                          ;九号功能调用,显示字符串please press the keyboard:
       lea dx,d1
       mov ah,9
       int 21h

;loop1:
;       mov ah,01h
;       int 21h
;       cmp al,30h
;       jz aa
;       jmp loop0
;aa:
;       jmp next
loop1:
                          ;置8255控制字,A输出,B输入
       mov al,10000010b
       mov dx,p55ctl
       out dx,al

       mov al,0           ;A口都输出低电平
       mov dx,pa55        ;PA55
       out dx,al
       mov dx,pb55        ;PB55
       in al,dx           ;从B口读入状态
       cmp al,0ffh        ;列线都是高电平么
       jz loop1           ;是则继续等待
       call delay         ;不是则抖动
       push ax            ;保存列值          
       push ax
       
       
                          ;置8255控制字,A输入,B输出
       mov al,10010000b
       mov dx,p55ctl
       out dx,al

       mov dx,pb55         ;PB55,AX出栈,往B口输出保存的列值
       pop ax
       out dx,al
                  ;??保存列值
       mov dx,pa55         ;PA55,从A口读入行值
       in al,dx
       pop dx
       mov ah,dl           ;al行值,ah列值,??是否为dl??
       lea si,table
       mov cx,20
loop2:
       cmp ax,[si]         ;什么和什么比较??
       jz ts
       add si,4
       loop loop2
       jmp loop1
ts:                          ;显示you press :
       lea dx,d2
       mov ah,9
       int 21h
                             ;显示字符
       mov ah,2
       mov dl,[si+2]         ;因为字符是字型的
       int 21h
                             ;置8255控制字,A输出,B输入
       mov al,10000010b
       mov dx,p55ctl
       out dx,al
loop3:                       ;A口输出低电平
       mov dx,pa55
       mov al,0
       out dx,al
                             ;B口读入数据
       mov dx,pb55
       in al,dx
       cmp al,0ffh           ;键是否都释放了?
       jnz loop3
       
next:  mov ah,4ch
       int 21h

delay proc near               ;延时20s抖动
   
      push ax
      push bx
      push cx
      push dx

      mov cx,4000
loop4:
      loop loop4

      pop dx
      pop cx
      pop bx
      pop ax
      ret
      delay endp


code   ends
       end  start

⌨️ 快捷键说明

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