---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)深入浅出操作系统 - 目录
文章目录
1. 问题一
- 计算机已经接入了键盘,为啥按键没反应?
1.1 键盘的本质
键盘是一种计算机外部设备
键盘与计算机的通信(数据交互)需要借助 中断 完成
1.2 键盘驱动步骤
- 使能主8259A引脚 IRQ1(启用键盘中断)
- 编写中断服务程序,并注册到中断向量表( 0x21号中断 )
1.3 编程实验:键盘中断
【参看链接】:71-72-73 - 键盘驱动程序设计 / 71 / 00一次键盘输入
2. 问题二
- 为什么键盘中断只能发生一次?如何获取键盘按键的值?
2.1 键盘工作原理简介
2.2 键盘扫描码(键位信息)
- 处理器接收到键盘中断后,从0x60端口读取键盘扫描码
- 扫描码 指的是硬件电路对键位的编码
- Make Code:按下键时产生的扫描码
- Break Code:释放键时产生的扫描码
- Break Code = Make Code + 0x80
2.3 小贴士
- C语言中的函数是怎么返回值的?
- 通过AX寄存器返回
注:
2.4 端口数据读取
注释:in al, 21H
;表示从21H端口读取一字节数据到al
2.5 编程实验:读取键盘扫描码
【参看链接】:71-72-73 - 键盘驱动程序设计 / 71 / 01读取键盘扫描码
2.6 思考
- 键盘扫描码可以直接使用吗?扫描码代表键位上的字符吗?
- 扫描码不是字符编码
2.7 常用编码区别
- 扫描码 Scan Code
与键盘厂商相关,不同厂商的扫描码可能不同 - 虚拟键码 Key Code
键盘按键统一标准码(键盘厂商无关) - ASCII码
常用字符的统一编码(键盘按键无关)
3. 键盘驱动设计
- 建立扫描码,虚拟键码,ASCII码之间的映射
- 解析扫描码,处理常用组合键(Shift,Capslock,等)
- 用4字节表示:键盘操作结果:动作 | 扫描码 | 虚拟键码 | ASCII
- 键盘输入a字符:
- 按下:0x 01_1E_41_61( 动作|扫描码|虚拟键码|ASCII )
- 释放:0x001E4161
- 键盘输入A字符:
- 按下:0x011E4141
- 释放:0x001E4141
- 键盘输入a字符:
3.1 键盘驱动主要功能
- 处理主键盘按键
字符按键,功能按键,Shift,CapsLock - 处理数字键盘按键
字符按键,Shift,NumLock - 处理特殊字符
Pause Break
3.2 深入键盘扫描码
- 普通按键:1字节(按键扫描码)
- E0扩展按键:2字节(0xE0 + 按键扫描码)
- E1扩展按键:6字节(Break Pause)
- E2扩展按键:……
3.3 关键体力活:建立映射表
3.4 键盘驱动关键逻辑
- 常规键盘中存在Shift,CapsLock,NumLock与其它键的组合操作;因此处理逻辑中,首次判断这几个特殊键是否同时被按下。
- 编程实验
【参看链接】:71-72-73 - 键盘驱动程序设计 / 72
3.5 思考
- 如何判断按键是否属于数字小键盘?数字小键盘上的按键有什么特殊之处?
3.6 数字小键盘键位判断
- 因为数字小键盘上的键位功能并不唯一,有可能带 0xE0 前缀,所以需要配合 完整扫描码 进行判断。
3.6.1 编码前的考虑
Shift键:同一个键位可能表示不同功能
CapsLock键:默认字母大小写控制
NumLock键:小数字键盘启动控制
- 当前按键的编码必须结合Shift,CapsLock和NumLock按键的状态来计算
3.6.2 数字小键盘的特殊之处
默认情况下NumLock处于关闭状态
默认情况下按键不代表数字字符,代表特殊功能
NumLock打开后,可使用Shift控制键位的意义
- 专用映射表:
3.6.3 数字键盘键位编码
3.7 普通键位编码
3.8 编程实验:键盘键位编码
【参看链接】:71-72-73 - 键盘驱动程序设计 / 73
3.9 思考
- 内核对按键事件进行编码后,如何处理?