71-72-73 - 键盘驱动程序设计

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

文章目录

  • 1. 问题一
    • 1.1 键盘的本质
    • 1.2 键盘驱动步骤
    • 1.3 编程实验:键盘中断
  • 2. 问题二
    • 2.1 键盘工作原理简介
    • 2.2 键盘扫描码(键位信息)
    • 2.3 小贴士
    • 2.4 端口数据读取
    • 2.5 编程实验:读取键盘扫描码
    • 2.6 思考
    • 2.7 常用编码区别
  • 3. 键盘驱动设计
    • 3.1 键盘驱动主要功能
    • 3.2 深入键盘扫描码
    • 3.3 关键体力活:建立映射表
    • 3.4 键盘驱动关键逻辑
    • 3.5 思考
    • 3.6 数字小键盘键位判断
      • 3.6.1 编码前的考虑
      • 3.6.2 数字小键盘的特殊之处
      • 3.6.3 数字键盘键位编码
    • 3.7 普通键位编码
    • 3.8 编程实验:键盘键位编码
    • 3.9 思考

1. 问题一

  • 计算机已经接入了键盘,为啥按键没反应?

1.1 键盘的本质

键盘是一种计算机外部设备
键盘与计算机的通信(数据交互)需要借助 中断 完成

71-72-73 - 键盘驱动程序设计_第1张图片

1.2 键盘驱动步骤

  1. 使能主8259A引脚 IRQ1(启用键盘中断)
  2. 编写中断服务程序,并注册到中断向量表( 0x21号中断

71-72-73 - 键盘驱动程序设计_第2张图片

1.3 编程实验:键盘中断

【参看链接】:71-72-73 - 键盘驱动程序设计 / 71 / 00一次键盘输入

71-72-73 - 键盘驱动程序设计_第3张图片

2. 问题二

  • 为什么键盘中断只能发生一次?如何获取键盘按键的值?

2.1 键盘工作原理简介

71-72-73 - 键盘驱动程序设计_第4张图片

2.2 键盘扫描码(键位信息)

  • 处理器接收到键盘中断后,从0x60端口读取键盘扫描码
  • 扫描码 指的是硬件电路对键位的编码
    • Make Code:按下键时产生的扫描码
    • Break Code:释放键时产生的扫描码
    • Break Code = Make Code + 0x80

2.3 小贴士

  • C语言中的函数是怎么返回值的?
  • 通过AX寄存器返回

71-72-73 - 键盘驱动程序设计_第5张图片
注:
71-72-73 - 键盘驱动程序设计_第6张图片

2.4 端口数据读取

71-72-73 - 键盘驱动程序设计_第7张图片

注释:in al, 21H ;表示从21H端口读取一字节数据到al

2.5 编程实验:读取键盘扫描码

【参看链接】:71-72-73 - 键盘驱动程序设计 / 71 / 01读取键盘扫描码

71-72-73 - 键盘驱动程序设计_第8张图片

2.6 思考

  • 键盘扫描码可以直接使用吗?扫描码代表键位上的字符吗?
  • 扫描码不是字符编码

2.7 常用编码区别

  • 扫描码 Scan Code
    与键盘厂商相关,不同厂商的扫描码可能不同
  • 虚拟键码 Key Code
    键盘按键统一标准码(键盘厂商无关)
  • ASCII码
    常用字符的统一编码(键盘按键无关)

3. 键盘驱动设计

  1. 建立扫描码,虚拟键码,ASCII码之间的映射
  2. 解析扫描码,处理常用组合键(Shift,Capslock,等)
  3. 用4字节表示:键盘操作结果:动作 | 扫描码 | 虚拟键码 | ASCII
    • 键盘输入a字符:
      • 按下:0x 01_1E_41_61( 动作|扫描码|虚拟键码|ASCII
      • 释放:0x001E4161
    • 键盘输入A字符:
      • 按下:0x011E4141
      • 释放:0x001E4141

3.1 键盘驱动主要功能

  • 处理主键盘按键
    字符按键,功能按键,Shift,CapsLock
  • 处理数字键盘按键
    字符按键,Shift,NumLock
  • 处理特殊字符
    Pause Break

3.2 深入键盘扫描码

  • 普通按键:1字节(按键扫描码)
  • E0扩展按键:2字节(0xE0 + 按键扫描码)
  • E1扩展按键:6字节(Break Pause)
  • E2扩展按键:……

3.3 关键体力活:建立映射表

71-72-73 - 键盘驱动程序设计_第9张图片

3.4 键盘驱动关键逻辑

71-72-73 - 键盘驱动程序设计_第10张图片

  • 常规键盘中存在Shift,CapsLock,NumLock与其它键的组合操作;因此处理逻辑中,首次判断这几个特殊键是否同时被按下。

71-72-73 - 键盘驱动程序设计_第11张图片

  • 编程实验

【参看链接】:71-72-73 - 键盘驱动程序设计 / 72

71-72-73 - 键盘驱动程序设计_第12张图片

3.5 思考

  • 如何判断按键是否属于数字小键盘?数字小键盘上的按键有什么特殊之处?

3.6 数字小键盘键位判断

  • 因为数字小键盘上的键位功能并不唯一,有可能带 0xE0 前缀,所以需要配合 完整扫描码 进行判断。

71-72-73 - 键盘驱动程序设计_第13张图片

3.6.1 编码前的考虑

Shift键:同一个键位可能表示不同功能
CapsLock键:默认字母大小写控制
NumLock键:小数字键盘启动控制

  • 当前按键的编码必须结合Shift,CapsLock和NumLock按键的状态来计算

3.6.2 数字小键盘的特殊之处

默认情况下NumLock处于关闭状态
默认情况下按键不代表数字字符,代表特殊功能
NumLock打开后,可使用Shift控制键位的意义

  • 专用映射表:

71-72-73 - 键盘驱动程序设计_第14张图片

3.6.3 数字键盘键位编码

71-72-73 - 键盘驱动程序设计_第15张图片

3.7 普通键位编码

71-72-73 - 键盘驱动程序设计_第16张图片

3.8 编程实验:键盘键位编码

【参看链接】:71-72-73 - 键盘驱动程序设计 / 73

71-72-73 - 键盘驱动程序设计_第17张图片

3.9 思考

  • 内核对按键事件进行编码后,如何处理?

你可能感兴趣的:(深入浅出操作系统,linux,unix,嵌入式硬件,c语言)