第十五章键盘程序设计15.1键盘的种类与扫描码15.2IBMPC/XT标准键盘接口15.3键盘中断程序设计15.1键盘的种类与扫描码5960F1F26162F3F46364F5F66566F7F86768F9F1012!3@4#5$6%7^8&9*10(11)12_13+14ESC1234567890-=←Backspace15←1617181920212223242526{27}28→QWERTYUIOP[]ENTER2930313233343536373839:40“41~CtrlASDFGHJKL;‘`4243|4445464748495051<52>53?5455*Shift\ZXCVBNM,./Shiftprtsc565758CapsAltSpacebarLock69Num78ScrollLockLock717728739Home↑PgUp75476776←5→79180282End↓PgDn82883InsDel74-78*28Enter83键的键位布局和扫描码41~2!3@4#5$6%7^8&9*10(11)12_13+14`1234567890-=←Backspace15←1617181920212223242526{27}28→QWERTYUIOP[]2930313233343536373839:40“CapslockASDFGHJKL;‘ENTER424445464748495051<52>53?5743|ShiftZXCVBNM,./Shift\29565730CtrlAltSpacebarAltCtrlPageInsHomeUpPageDelEndDown↑←↓→69Num74Lock/*-717728739Home↑PgUp754765776←→791802813End↓PgDn8283InsDelEnter78*1ESC59606162F1F2F3F463646566F5F6F7F867686970F9F10F11F12Prt70ScSRCPauseLockNumCapsScrollLockLockLock口口口15.1键盘的种类与扫描码101键的键位布局和扫描码15.2IBMPC/XT标准键盘接口PA口PB7PB6D1OECLRCLOCKM′QQRSDDDQQ∨DB8255A74LS322键盘数据键盘时钟CLK8259AIRQ1∧15.2IBMPC/XT标准键盘接口1.信号连接及使用2.(1)系统加电后,将8255A初始化为方式0,PA口为输入方式,3.PB口为输出方式。4.(2)PB口的PB6用于控制键盘时钟:5.当PB6=0时,禁止键盘输出;当PB6=1时,允许键盘输出。6.(3)PB口的PB7控制74LS322的输出:7.PB7=0时,允许74LS322输出;PB7=1时,禁止74LS322输出。8.同时,PB7还用于清除74LS322和中断请求触发器。9.(4)中断请求触发器的Q接至8259A的IRQ1端,Q接至键盘数10.据输入端,以保证在键盘数据未取出之前,禁止74LS322接收11.新数据。15.2IBMPC/XT标准键盘接口2.工作过程(1)将8255A的PB6置为1,PB7置为0,键盘逻辑可正常工作。(2)当用户按下某一键时,键位的扫描码的串行数据通过电缆送至74LS322的D1端。(3)74LS322按串行数据格式接收完一个扫描码后,保存起来,串行数据的起始位通过M′端送入触发器,使触发器置1,产生中断请求信号,同时,封锁键盘数据线。(4)CPU响应中断,从8255A中读取扫描码,然后通过PB7发出一个正脉冲信号,清除74LS322寄存器和中断请求触发器,以备接收下一个扫描码。键按下和键抬起各产生一次中断请求,由扫描码的最高位识别,最高位为0,表示键按下,最高位为1,表示键抬起。(5)将读取的键位扫描码译为ASCII码,然后按需要进行解释。15.3键盘中断程序设计例15.1编制从键盘上接收字符并在屏幕上显示出来的程序,按ESC键则返回系统。从键盘上接收字符利用键盘中断服务程序实现,每当按下一键时,就进入中断服务程序,中断服务程序读取按键的扫描码,并进行译码,放入键盘缓冲区。在屏幕上显示字符,利用DOS中断的2号功能实现。主程序从键盘缓冲区中读取字符,利用DOS中断的2号功能在屏幕上显示出来。由此可见,键盘中断服务程序和主程序通过键盘缓冲区交换信息。键盘中断服务程序向缓冲区中写信息,而主程序则从键盘缓冲区中读取信息。15.3键盘中断程序设计键盘缓冲区是一个循环队列,按照先进先出的原则存取信息,当访问到最后一个单元时,再从头开始继续访问。示意如下:(1)初始化后头指针头指针:用于指示要读的信息在缓冲区中的位置尾指针:用于指示要写入的单元的位置尾指针头指针15.3键盘中断程序设计(2)写入4个数据后尾指针头指针(3)读取2个数据后尾指针头指针(4)写入1个数据后尾指针头指针(5)再写入1个数据后尾指针15.3键盘中断程序设计头指针(6)此时再写入1个数据尾指针15.3键盘中断程序设计缓冲区满状态:(尾指针+2)MOD缓冲区的长度=头指针缓冲区空状态:头指针=尾指针SSEGSEGMENTSTACKDB80DUP(0)SSEGENDSDATASEGMENTKEYIPDW?KEYCSDW?BTOPDW?BTLLDW?BUFFDW16DUP(0)SCTABDB0,1BH,‘1234567890-=’,08HDB09H,‘QWERTYUIOP[]’,0DHDB0,‘ASDFGHJKL;’`’D...