使用控制台与键盘进行输入输出

1、控制台简介与初始化

计算机在上电启动后,显示器被默认配置成80x25列的文本显示模式 。其使用从0xb8000开始,一共32KB的显存用于显示。如要在屏幕上指定位置显示特定的字符,则只需找到该位置对应的显存地址,写入2字节的数据:ascii码和颜色属性字节。

由于一屏共8025个字符,每个字符占用2个字节,所以一屏字符显示需要约4000字节数据。而显存一共32KB,因此这些存储区域可以存储8块屏幕的显示数据。

后续可以通过切换对应的显存屏幕数据。

2、在控制台上显示字符串

采用老式屏幕显示方式,没有采用现在的显卡写。

显示字符,只需要往计算机的显存中写入数据即可。计算机上的显卡会自动从这块区域读取数据,完后控制屏幕显示。

具体显示时,如果需要往屏幕上写字符显示,需要使用两个字节来控制。一个字节用于显示字符,一个字节用于配置显示属性

3、处理换行和清屏

清屏:填入空白字符即可实现清屏功能。即只需要将当前屏幕对应的显存内容全部用空格符号清空,或者用前景色和后景色相同的字符清空

换行:当已经显示满屏时,整个屏幕需要上移滚屏。具体实现采用了非常简单的方式:将整个屏幕区域的数据往上复制一行。

3、设置光标

光标的主要作用是帮助用户感知下一字符显示的位置

在文本模式下,计算机显示硬件自动会提供一个光标,并且经BIOS设置后会显示在屏幕上。但是,当我们在显存上写入字符后,光标并不会自动调整位置。 因此,我们要做的只是随着显示的位置,调整光标的显示位置,无需再初始化。

光标的位置为在整个屏幕中显示的字符符号。在当前的显示模式下,显示范围为80列*25行,因此总共有2000个字符,如果以0开始进行编址,则光标的地址范围为0~1999。即屏幕左上角的位置为0,右下角的位置为1999.

4、保存并恢复光标位置

本小节实现光标位置的保存和恢复,其两个序列如下:

CSI sSCP – 保存光标位置(Save Cursor Position)保存光标的当前位置。
CSI uRCP – 恢复光标位置(Restore Cursor Position)恢复保存的光标位置。

示例:

int main (void) {printf("\0337Hello,word!\0338123\n");  // ESC 7,8 输出123lo,word!printf("\033[31;42mHello,word!\033[39;49m123\n");  // ESC [pn m, Hello,world红色,>其余绿色printf("123\033[2DHello,word!\n");  // 光标左移2,1Hello,word!printf("123\033[2CHello,word!\n");  // 光标右移2,123  Hello,word!printf("\033[31m");  // ESC [pn m, Hello,world红色,其余绿色printf("\033[10;10H test!\n");  // 定位到10, 10,test!printf("\033[20;20H test!\n");  // 定位到20, 20,test!printf("\033[32;25;39m123\n");  // ESC [pn m, Hello,world红色,其余绿色
}

5、更新显示字体的颜色

| CSI n m | SGR – 选择图形再现(Select Graphic Rendition) | 设置SGR参数 ,包括文字颜色

CSI后可以是0或者更多参数,用分号分隔。如果没有参数,则视为CSI 0 m(重置/常规)。

6、移动光标位置并清屏

CSI n ACUU – 光标上移(Cursor Up)光标向指定的方向移动(默认1)格。如果光标已在屏幕边缘,则无效。
CSI n BCUD – 光标下移(Cursor Down)
CSI n CCUF – 光标前移(Cursor Forward)
CSI n DCUB – 光标后移(Cursor Back)
CSI n ECNL – 光标移到下一行(Cursor Next Line)光标移动到下面第(默认1)行的开头。(非ANSI.SYS
CSI n FCPL – 光标移到上一行(Cursor Previous Line)光标移动到上面第(默认1)行的开头。(非ANSI.SYS)
CSI n GCHA – 光标水平绝对(Cursor Horizontal Absolute)光标移动到第(默认1)列。(非ANSI.SYS)
CSI n ; m HCUP – 光标位置(Cursor Position)光标移动到第n行、第m列。值从1开始,且默认为1(左上角)。例如CSI ;5H和CSI 1;5H含义相同;CSI 17;H、CSI 17H和CSI 17;1H三者含义相同。
CSI n JED – 擦除显示(Erase in Display)清除屏幕的部分区域。如果n是0(或缺失),则清除从光标位置到屏幕末尾的部分。如果n是1,则清除从光标位置到屏幕开头的部分。如果n是2,则清除整个屏幕(在DOS ANSI.SYS中,光标还会向左上方移动)。如果n是3,则清除整个屏幕,并删除回滚缓存区中的所有行(这个特性是xterm
添加的,其他终端应用程序也支持)。

7、键盘初始化

PC机中使用键盘控制器(KBC)处理键盘与鼠标的链接。键盘与鼠标通过KBC与CPU进行通信,并链接到中断控制器IRQ1和IRQ2

通过端口0x60和0x64对KBC进行配置以及读取相应的数据

IO Port读写功能
0x60读/写数据寄存器
0x64只读状态寄存器
0x64只写命令寄存器

其中状态寄存器的值如下

BitMeaning
0输出缓存寄存器(0 = 空,无数据, 1 = 满,有数据)
1输入缓存寄存器(0 = 空,无数据, 1 = 满,有数据)
2系统标志位
3命令或数据(0 = data written to input buffer is data for PS/2 device, 1 = data written to input buffer is data for PS/2 controller command)
4-
5-
6是否发生超时错误 (0 = no error, 1 = time-out error)
7是否发生奇偶校验错误 (0 = no error, 1 = parity error)

在计算机上电后,BIOS会自动完成对键盘相关的初始化,因此我们只需要使用缺省值即可,无需再次初始化

8、借助按键映射表进行键值转换

主要对读取的键值进行转码,并且处理shift健按下时大小写转换的问题

键盘扫描码

当按键按下时,将触发中断,可从中断中读取按键的键值,但是这个值并非按键上的字符丝印对应的字符,而是某种特定编码的数值,这套编码为键盘扫描码集1(Scan Code Set 1),如下表:

Scan codeKeyScan codeKeyScan codeKeyScan codeKey
0x01escape pressed0x021 pressed0x032 pressed
0x043 pressed0x054 pressed0x065 pressed0x076 pressed
0x087 pressed0x098 pressed0x0A9 pressed0x0B0 (zero) pressed
0x0C- pressed0x0D= pressed0x0Ebackspace pressed0x0Ftab pressed
0x10Q pressed0x11W pressed0x12E pressed0x13R pressed
0x14T pressed0x15Y pressed0x16U pressed0x17I pressed
0x18O pressed0x19P pressed0x1A[ pressed0x1B] pressed
0x1Center pressed0x1Dleft control pressed0x1EA pressed0x1FS pressed
0x20D pressed0x21F pressed0x22G pressed0x23H pressed
0x24J pressed0x25K pressed0x26L pressed0x27; pressed
0x28' (single quote) pressed0x29` (back tick) pressed0x2Aleft shift pressed0x2B\ pressed
0x2CZ pressed0x2DX pressed0x2EC pressed0x2FV pressed
0x30B pressed0x31N pressed0x32M pressed0x33, pressed
0x34. pressed0x35/ pressed0x36right shift pressed0x37(keypad) * pressed
0x38left alt pressed0x39space pressed0x3ACapsLock pressed0x3BF1 pressed
0x3CF2 pressed0x3DF3 pressed0x3EF4 pressed0x3FF5 pressed
0x40F6 pressed0x41F7 pressed0x42F8 pressed0x43F9 pressed
0x44F10 pressed0x45NumberLock pressed0x46ScrollLock pressed0x47(keypad) 7 pressed
0x48(keypad) 8 pressed0x49(keypad) 9 pressed0x4A(keypad) - pressed0x4B(keypad) 4 pressed
0x4C(keypad) 5 pressed0x4D(keypad) 6 pressed0x4E(keypad) + pressed0x4F(keypad) 1 pressed
0x50(keypad) 2 pressed0x51(keypad) 3 pressed0x52(keypad) 0 pressed0x53(keypad) . pressed
0x57F11 pressed
0x58F12 pressed
0x81escape released0x821 released0x832 released
0x843 released0x854 released0x865 released0x876 released
0x887 released0x898 released0x8A9 released0x8B0 (zero) released
0x8C- released0x8D= released0x8Ebackspace released0x8Ftab released
0x90Q released0x91W released0x92E released0x93R released
0x94T released0x95Y released0x96U released0x97I released
0x98O released0x99P released0x9A[ released0x9B] released
0x9Center released0x9Dleft control released0x9EA released0x9FS released
0xA0D released0xA1F released0xA2G released0xA3H released
0xA4J released0xA5K released0xA6L released0xA7; released
0xA8' (single quote) released0xA9` (back tick) released0xAAleft shift released0xAB\ released
0xACZ released0xADX released0xAEC released0xAFV released
0xB0B released0xB1N released0xB2M released0xB3, released
0xB4. released0xB5/ released0xB6right shift released0xB7(keypad) * released
0xB8left alt released0xB9space released0xBACapsLock released0xBBF1 released
0xBCF2 released0xBDF3 released0xBEF4 released0xBFF5 released
0xC0F6 released0xC1F7 released0xC2F8 released0xC3F9 released
0xC4F10 released0xC5NumberLock released0xC6ScrollLock released0xC7(keypad) 7 released
0xC8(keypad) 8 released0xC9(keypad) 9 released0xCA(keypad) - released0xCB(keypad) 4 released
0xCC(keypad) 5 released0xCD(keypad) 6 released0xCE(keypad) + released0xCF(keypad) 1 released
0xD0(keypad) 2 released0xD1(keypad) 3 released0xD2(keypad) 0 released0xD3(keypad) . released
0xD7F11 released
0xD8F12 released
0xE0, 0x10(multimedia) previous track pressed
0xE0, 0x19(multimedia) next track pressed
0xE0, 0x1C(keypad) enter pressed0xE0, 0x1Dright control pressed
0xE0, 0x20(multimedia) mute pressed0xE0, 0x21(multimedia) calculator pressed0xE0, 0x22(multimedia) play pressed
0xE0, 0x24(multimedia) stop pressed
0xE0, 0x2E(multimedia) volume down pressed
0xE0, 0x30(multimedia) volume up pressed0xE0, 0x32(multimedia) WWW home pressed
0xE0, 0x35(keypad) / pressed
0xE0, 0x38right alt (or altGr) pressed
0xE0, 0x47home pressed
0xE0, 0x48cursor up pressed0xE0, 0x49page up pressed0xE0, 0x4Bcursor left pressed
0xE0, 0x4Dcursor right pressed0xE0, 0x4Fend pressed
0xE0, 0x50cursor down pressed0xE0, 0x51page down pressed0xE0, 0x52insert pressed0xE0, 0x53delete pressed
0xE0, 0x5Bleft GUI pressed
0xE0, 0x5Cright GUI pressed0xE0, 0x5D"apps" pressed0xE0, 0x5E(ACPI) power pressed0xE0, 0x5F(ACPI) sleep pressed
0xE0, 0x63(ACPI) wake pressed
0xE0, 0x65(multimedia) WWW search pressed0xE0, 0x66(multimedia) WWW favorites pressed0xE0, 0x67(multimedia) WWW refresh pressed
0xE0, 0x68(multimedia) WWW stop pressed0xE0, 0x69(multimedia) WWW forward pressed0xE0, 0x6A(multimedia) WWW back pressed0xE0, 0x6B(multimedia) my computer pressed
0xE0, 0x6C(multimedia) email pressed0xE0, 0x6D(multimedia) media select pressed
0xE0, 0x90(multimedia) previous track released
0xE0, 0x99(multimedia) next track released
0xE0, 0x9C(keypad) enter released0xE0, 0x9Dright control released
0xE0, 0xA0(multimedia) mute released0xE0, 0xA1(multimedia) calculator released0xE0, 0xA2(multimedia) play released
0xE0, 0xA4(multimedia) stop released
0xE0, 0xAE(multimedia) volume down released
0xE0, 0xB0(multimedia) volume up released0xE0, 0xB2(multimedia) WWW home released
0xE0, 0xB5(keypad) / released
0xE0, 0xB8right alt (or altGr) released
0xE0, 0xC7home released
0xE0, 0xC8cursor up released0xE0, 0xC9page up released0xE0, 0xCBcursor left released
0xE0, 0xCDcursor right released0xE0, 0xCFend released
0xE0, 0xD0cursor down released0xE0, 0xD1page down released0xE0, 0xD2insert released0xE0, 0xD3delete released
0xE0, 0xDBleft GUI released
0xE0, 0xDCright GUI released0xE0, 0xDD"apps" released0xE0, 0xDE(ACPI) power released0xE0, 0xDF(ACPI) sleep released
0xE0, 0xE3(ACPI) wake released
0xE0, 0xE5(multimedia) WWW search released0xE0, 0xE6(multimedia) WWW favorites released0xE0, 0xE7(multimedia) WWW refresh released
0xE0, 0xE8(multimedia) WWW stop released0xE0, 0xE9(multimedia) WWW forward released0xE0, 0xEA(multimedia) WWW back released0xE0, 0xEB(multimedia) my computer released
0xE0, 0xEC(multimedia) email released0xE0, 0xED(multimedia) media select released
0xE0, 0x2A, 0xE0, 0x37print screen pressed
0xE0, 0xB7, 0xE0, 0xAAprint screen released
0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5pause pressed

9、

1)每个键按下和弹起时,都会产生扫描码(scan code)

2)扫描码根据字节量可分为三种:

  • 单个字节
  • 以E0开头的2字节或4字节
  • 以E1开头的6字节(只有一两个键)、

3)扫描码根据按下和弹起,又分为:make code,break code,区别是扫描码的最高位第7位是否为1

例如:

  • 当A键按下时,产生扫描码0x1E(第7位为0);断开时,产生扫描码0x9E(第7位为1)

  • 当光标向左键按下时,产生扫描码0xE0, 0x4B(第7位为0);断开时,产生扫描码0xE0, 0xCB(第7位为1)

9、处理caplock键

这个键本身并不任何有效的字符输入,而是用于控制其它键输入的效果。

  • capslock:每按1次转换一下,键上方有对应的大小写指示灯(绿灯亮为大写字母输入模式,反之为小写字母输入模式)。如果shift键和Capslock键一起按时,是小写字母模式

10、其他特殊功能健

在不同的操作系统和应用程序下可能有不同的用户,例如在浏览器中,F1键可能是用于打开帮助页面。我们现在是在键盘驱动程序中编写代码,F1等功能键不对应于任何具体的字符,也不对应具体的功能;因此,目前只是在代码中将其识别出来,具体有什么用可以留等以后扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1522291.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

海外直播对网速、带宽、安全的要求

要满足海外直播的要求,需要拥有合适的网络配置。在全球化的浪潮下,海外直播正逐渐成为企业、个人和各类组织的重要工具。不论是用于市场推广、品牌宣传,还是与观众互动,海外直播都为参与者带来了丰富的机会。然而,确保…

【C++从练气到飞升】19---哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列

🎈个人主页:库库的里昂 ✨收录专栏:C从练气到飞升 🎉鸟欲高飞先振翅,人求上进先读书🎉 目录 ⛳️推荐 一、unordered 系列关联式容器 二、unordered_map 1.1 unordered_map 介绍 1.2 unordered_map 的…

5大专业措施确保源代码防泄密

深信达的SDC防泄密软件通过一系列创新技术和方法来实现源代码的安全保护,以下是一些关键点和注意事项: 1. **内核级虚拟沙盒技术**:SDC沙盒创建一个与外部环境隔离的执行空间,源代码的编译、运行和调试过程完全隔离于外部操作系统…

部标JT808标准下的视频汇聚新方案:EasyCVR平台助力推动车辆监管智能化进程

在数字化转型的浪潮中,智慧城市的建设正以前所未有的速度推进,而市政车载设备作为城市运行的重要“神经末梢”,其智能化、联网化水平直接影响着城市管理效率与服务质量。近年来,随着部标协议(即国家行业标准协议&#…

如何录制黑神话悟空的游戏BGM导入iPhone手机制作铃声?

在游戏的世界里,总有那么一些旋律,能够触动玩家的心弦,让人难以忘怀。《黑神话悟空》以其精美的画面和动人的背景音乐,赢得了无数玩家的喜爱。如果你也想将游戏中的背景音录制下来,制作成个性化的m4r格式铃声&#xff…

实例分割【YOLOv8版】

参考文档 Segment - Ultralytics YOLO Docs​docs.ultralytics.com/tasks/segment/ 何为实例分割? 实例分割比目标检测更进一步,涉及识别图像中的各个对象并将它们与图像的其余部分分割开来。 实例分割模型的输出是一组用于勾勒图像中每个对象的掩码…

element-plus表单项循环的得到的。并且一个项里面有多个子项需要校验。

数据内容循环得到。并且还可以自己增加减少。怎么给他写校验呢&#xff1f; <el-formref"ruleFormRef":rules"rules":model"row" > <el-form-item:label"index>0?:资质及职称"v-for"(item,index) in row!.userTitl…

EE trade:区块链工程专业是什么

区块链技术&#xff0c;作为近年来最具颠覆性的技术之一&#xff0c;正在深刻地改变着我们的生活方式和商业模式。区块链工程专业&#xff0c;应运而生&#xff0c;旨在培养能够胜任区块链领域技术开发、应用和管理的专业人才&#xff0c;为数字经济发展提供强有力的人才支撑。…

HTB-bike(SSTI模版注入)

前言 大家好&#xff0c;我是qmx_07,今天给大家讲解bike靶场 渗透过程 信息搜集 服务器开放了 22 ssh 和 http80端口 Wappalyzer 介绍&#xff1a;Wappalyzer是一种浏览器扩展程序&#xff0c;用于识别正在访问的网站所使用的技术栈和工具&#xff0c;比如使用的web框架&…

算法设计与分析:实验1 排序算法性能分析

1.常见排序算法分析 &#xff08;1&#xff09;选择排序 算法原理&#xff1a; 从数组 a[1--n] 中找到最小的元素&#xff0c;将其与第一个元素 a[1] 进行值的交换&#xff0c;这样数组中第一个位置就是最小的元素&#xff0c;即第一个位置变得有序。接着从数组 a[2--n] 中找…

Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解

A. Dora’s Set Problem Statement Dora has a set s s s containing integers. In the beginning, she will put all integers in [ l , r ] [l, r] [l,r] into the set s s s. That is, an integer x x x is initially contained in the set if and only if l ≤ x ≤…

std::future和std::promise详解(原理、应用、源码)

在编程实践中&#xff0c;我们常常需要使用异步调用。通过异步调用&#xff0c;我们可以将一些耗时、阻塞的任务交给其他线程来执行&#xff0c;从而保证当前线程的快速响应能力。还有一些场景可以通过将一个任务&#xff0c;分成多个部分然后将这部分交给多个线程来进行并发执…

通过FFmpeg和URL查看流的编码格式

FFmpeg下载后会有三个执行文件&#xff0c;跳转到FFmpeg所在文件夹 查看视频流URL地址的编码格式命令&#xff1a; // 在下载ffmpeg的文件夹中执行如下命令&#xff0c;可查看流的编码格式&#xff0c;这里的测试流是H264编码ffprobe http://devimages.apple.com/iphone/sample…

华为打造“新能源航母”,能否挑翻BBA?

华为在汽车行业的动作&#xff0c;频繁让它聚焦在市场镁光灯之下。 前有享界S9陷入飞坡争议&#xff0c;后有智界R7即将登台&#xff0c;后面还有尊界等待亮相&#xff0c;一波又一波的操作令人眼花缭乱。在新能源浪潮之下&#xff0c;BBA的日子并不好过&#xff0c;华为及其他…

VMware Fusion 13.6 发布下载,新增功能概览

VMware Fusion 13.6 发布下载&#xff0c;新增功能概览 VMware Fusion 13.6 for Mac - 领先的免费桌面虚拟化软件 适用于基于 Intel 处理器和搭载 Apple 芯片的 Mac 的桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13/&#xff0c;查看最…

JDBC |封装JDBCUtils|PreparedStatement|事务|批处理|数据库连接池| Blob类型数据的读写|Apache—DBUtils简介

一.概述 在Java中&#xff0c;数据库存取技术可分为如下几类&#xff1a; JDBC直接访问数据库JDO技术&#xff08;Java Data Object&#xff09;第三方O/R工具&#xff0c;如Hibernate, Mybatis 等 JDBC是java访问数据库的基石&#xff0c;JDO, Hibernate等只是更好的封装了J…

单片机-初识单片机(keil安装以及编写简单驱动)(一)

目录 一、嵌入式介绍 1.嵌入式系统&#xff1a; 2.嵌入式操作系统 3.单片机&#xff1a; 二、STM32F103ZET6简介 1.单片机的组成&#xff1a; 2.单片机外观&#xff1a; 3.ARM公司 4.ST公司--意法半导体 三、资料部分 1.安装工具&#xff1a; 2.破解软件&#xff1…

哲学概述1(马克)

哲学题目大原则&#xff1a; 一、哲学与世界观 世界观&#xff1a;人们对于生活于其中的世界以及与世界关系的根本观点、根本看法方法论&#xff1a;是人们认识世界、改造世界的一般方法&#xff0c;是人们用啥样的方式、方法来观察事物和处理问题哲学&#xff1a;是理论化、…

最新车型库大全|阿里云实现调用API接口

整体请求流程&#xff1a; 介绍&#xff1a; 本次解析通过阿里云云市场的云服务来实现查询车型库大全查询&#xff0c;首先需要选择一家可以提供查询的商品。 [探数API]车型库查询_API专区_云市场-阿里云 步骤1: 选择商品 如图点击免费试用&#xff0c;即可免费申请该接口数…

使用合同比对工具时,有哪些常见问题和解决方案?

在使用合同比对工具的过程中&#xff0c;企业可能会面临一系列挑战&#xff0c;这些问题可能会影响工具的效率和效果。以下是一些常见的问题&#xff1a; 1.兼容性问题&#xff1a;在不同的工作环境中&#xff0c;合同文档可能以不同的格式存在&#xff0c;如PDF、Word、Excel…