利用实验箱所带小键盘,加上一个开关作为功能选项键,实现A-H八个大写母,以 及 a-h 八个小写字母的输入扫描程序,利用另一个开关模拟回车键,让所输入的字 母显示在七段数码管显示器上。
;********************;
;* 8255薄膜按键实验 *;
;********************;
a8255 equ 288H ;8255 A口
b8255 equ 289H
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 67H,74H,5cH,7cH,58H,5eH,7bH,71H,7DH,76H,77H,7FH
DB 39h,3FH,79h,71h,0ffh ;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
char db '01234567?@ABCDEF' ;字符表
NUM DB 8 DUP(0)
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,k8255 ;初始化8255控制字
mov al,81h ;设置c端口低四位输入,a,b输出,0工作方式
out dx,al
MOV BX,0
main_key:
call key
cmp byte ptr key_in,'1'
jz dis1
cmp byte ptr key_in,'2'
jz dis2
dis1: call key
cmp byte ptr key_in, '0'
jz bbb
PUSH BX
MOV BX,OFFSET LED
MOV AL,byte ptr key_in
SUB al,30h
CMP al,09h
JNG DIS2
SUB al,07h
sub al,8
XLAT
POP BX
MOV NUM+BX,AL
INC BX
CMP BX,8
JB dis1
jmp ccc
DIS2: call key
cmp byte ptr key_in, '0'
jz bbb
PUSH BX
MOV BX,OFFSET LED
MOV AL,byte ptr key_in
SUB al,30h
CMP al,09h
JNG DIS2
SUB al,07h
XLAT
POP BX
MOV NUM+BX,AL
INC BX
CMP BX,8
JB dis2
CCC: MOV BX,0FE08H ;BH=0FE BL=08 ;预备点亮第一个数码管,并且控制循环次数
MOV DI ,OFFSET NUM ;取num偏移地址
BBB: MOV DX,b8255
MOV AL,bh
OUT DX,AL ;点亮数码管
ROL BH,1 ;准备点亮下一个
MOV DX,a8255
MOV AL,[di]
OUT DX,AL ;依次将得到的字符输出
inc di
push cx
mov cx,100
ddd: loop ddd ;延时
pop cx
DEC BL
CMP BL,0
JZ CCC ;是否已经全部输出,如果是则重新输出
JMP BBB
; mov ax,4c00h
;int 21h
key proc near
key_loop:
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 ;消抖
ret
;exit: mov byte ptr key_in,'E'
ret
key endp
delay proc near
push cx
mov cx,0ffffh
delay1:
loop delay1
pop cx
ret
delay endp
code ends
end start
这个程序谁能看懂?求求大的很帮我注释一下每一步的作用。万分感谢 |