文档详情

PC键盘输入实验原理讲解及程序

简****9
实名认证
店铺
DOC
19.66KB
约5页
文档ID:109719906
PC键盘输入实验原理讲解及程序_第1页
1/5

1. PC机键盘的工作过程键盘电路正常工作时不断地扫描键盘矩阵n 有按键,则确定按键位置之后以串行数据形式发送给系统板键盘接口电路n 键按下时,发送该键的接通扫描码n 键松开时,发送该键的断开扫描码n 若一直按住某键,则以拍发速率(每秒2~30次)连续发送该键的接通扫描码接通扫描码反映该键在键盘上的位置断开扫描码(接通扫描码最高位置1)=接通扫描码+80H2. 键盘接口电路的工作过程n 接收一个串行形式字符以后,进行串并转换n 然后产生键盘中断IRQ1请求,等待读取键盘数据n CPU响应中断,则进入09H键盘中断服务程序: ① 读取键盘扫描码:用IN AL,60H即可 ② 响应键盘:系统使PB7=1 ③ 允许键盘工作:系统使PB7=0 ④ 处理键盘数据 ⑤ 给8259A中断结束EOI命令,中断返回3. PC机键盘中断服务程序n 09H号中断服务程序(kbint过程)n 完成常规的操作n 处理键盘数据:将获取的扫描码通过查表转换为对应的ASCII码送缓冲区对于不能显示的按键,则转换为0,且不再送至缓冲区n 键盘I/O功能程序(kbget子程序)n 从缓冲区中读取转换后的ASCII码n 功能调用(主程序)n 循环显示键入的字符DATA SEGMENTbuffer db 10 dup(0)bufptr1 dw 0 ;队列头指针bufptr2 dw 0 ;队列尾指针scantb db 0,1,'1234567890-=',08h;键盘第1排的按键,从ESC到退格 db 0,'qwertyuiop[]',0dh;键盘第2排的按键,从Tab到回车 db 0,'asdfghjkl;',0,0;键盘第3排的按键 db 0,0,'zxcvbnm,./',0,0;键盘第4排的按键 db 0,' ',0,0,0,0,0,0,0,0,0,0,0;键盘第5排的按键 db 0,0,'789-456+1230.';右边小键盘,从Num Lock到Del DATA ENDSCODE SEGMENT START PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX mov ax,3509h int 21h push es push bx ;保存09H号原中断向量 cli ;关中断 push ds ;设置09H号新中断向量 mov ax,seg kbint mov ds,ax mov dx,offset kbintmov ax,2509h int 21h pop ds in al,21h ;允许IRQ1中断,其他不变 push ax and al,0fdh out 21h,al sti ;开中断start1: call kbget ;获取按键的ASCII码 cmp al,1 jz start2 ;是ESC键,则退出 push ax ;保护字符 mov dl,al ;显示字符 mov ah,2 int 21h pop ax ;恢复字符cmp al,0dh ;该字符是回车符吗? jnz start1 ;不是,取下一个按键字符 mov dl,0ah ;是回车符,则再进行换行 mov ah,2 int 21h jmp start1 ;继续取字符start2: cli pop ax out 21h,al pop dx pop ds mov ax,2509h int 21h sti mov ax,4c00h ;返回DOS int 21hRETSTART ENDPkbget prockbget1: push bx ;保护BX cli mov bx,bufptr1 ;取头指针 cmp bx,bufptr2 ;与尾指针相等否? jnz kbget2 ;不相等,说明缓冲区有字符,转移 sti ;相等,说明缓冲区空 pop bx jmp kbget1 ;等待缓冲区有字符kbget2: mov al,buffer[bx] ;取字符送AL inc bx ;队列头指针增量 cmp bx,10 ;是否指向队列末端 jc kbget3 ;没有,转移 mov bx,0 ;指针指向队列末端,则循环,指向始端kbget3: mov bufptr1,bx ;设定新队列头指针 sti pop bx retkbget endpkbint proc sti ;开中断 push ax ;保护寄存器 push bx in al,60h ;读取键盘扫描码 push ax in al,61h ;使PB7=1,响应键盘 or al,80h out 61h,al and al,7fh ;使PB7=0,允许键盘 out 61h,alpop ax test al,80h ;是断开扫描码? jnz kbint2 ;是,则退出 mov bx,offset scantb ;是接通扫描码,取表首地址 xlat ;将扫描码转换成ASCII码 cmp al,0 ;是否为合法的ASCII码? jz kbint2 ;不是,则退出mov bx,bufptr2 mov buffer[bx],al ;将ASCII码存入缓冲区队列尾 inc bx ;队列尾指针增量 cmp bx,10 ;是否指向队列末端? jc kbint1 ;没有,转移 mov bx,0 ;指针指向队列末端,则循环,指向始端kbint1: cmp bx,bufptr1 jz kbint2 ;若队列满,则退出 mov bufptr2,bx ;队列不满,设置新的队列尾指针kbint2: mov al,20h ;向8259A发送普通中断结束命令 out 20h,al pop bx ;恢复寄存器 pop ax iret ;中断返回kbint endpCODE ENDSEND START。

下载提示
相似文档
正为您匹配相似的精品文档