您当前的位置:首页 > 美文欣赏 > 内容

键盘win键在哪,键盘win键在哪里(30天自制操作系统day14)

关于【键盘win键在哪】,键盘win键在哪里,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

内容导航:1、键盘win键在哪2、30天自制操作系统day14: 在大分辨率的屏幕上打字

1、键盘win键在哪

1、Win键处于电脑键盘的左下角,处于Ctrl键与Alt键中间的那个带着微软的徽标的键就就是Win键,如下键盘图指所示;

2、配合Win键可以和其他按键组合成多种快捷操作方式,比如Win+1可以打开任务栏左下角第一个应用,Win+R可以打开运行符,Win+Q可以打开微软小娜Cortana;

3、对于Win键的作用了解的朋友并不多,尤其是在XP系统很多朋友其实都把其当做了摆设,随着Win7与Win8系统对电脑效率的不断优化,Win键的作用也越来越大,比如快速打开运行命令框等等实用Win键组合键则非常方便快捷。

关于键盘win键在哪的相关内容就介绍到这里了。

2、30天自制操作系统day14: 在大分辨率的屏幕上打字

通过day12,day13, 完成了对定时器,超时器管理器的使用,并且整理了代码。

今天day14,我们来完成在大分辨率的屏幕上打字。

这个功能完成之后,就为多任务并行运行准备好了一切素材。

今天的内容会按以下顺序展开:

调整屏幕为大分辨率完成字符输入功能完成用鼠标来移动窗口的功能

完成后的效果是这样的:

视频加载中...

调整屏幕为大分辨率

我们现在的屏幕分辨率是在asmhead.asm中这样设置的:

; haribote-os boot asm; TAB=4...VMODEEQU0x0ff2; 显示模式的所在的内存地址SCRNXEQU0x0ff4; 分辨率宽度所在的内存地址SCRNYEQU0x0ff6; 分辨率高度所在的内存地址VRAMEQU0x0ff8; 显存指针所在的内存地址ORG0xc200; 此代码存放在内存中的地址MOVAL,0x13; 设定显卡规定在VGA模式MOVAH,0x00INT0x10 ;调用BIOS中断程序,对显卡进行设定MOVBYTE [VMODE],8; 颜色的灰度级为2^8=256,MOVWORD [SCRNX],320MOVWORD [SCRNY],200MOVDWORD [VRAM],0x000a0000; 把0x000a 0000放到内存的0x0ff8处,即以后要用指针VRAM来访问显存地址

我们设置的分辨率是320x200,8位颜色。

那么如何调整到高分辨率?

这个对BIOS有个要求,需要BIOS支持VESA-BIOS扩展,简称VBE.

VESA是Video Electronics Standards Association,视频电子标准协会。

生产显示卡的厂家有很多,如果每个厂家的显示卡的设置方式不同,那么设置不同的显卡就会非常麻烦。所以,就需要为显卡设定一个标准,大家制造出来的显卡,用用一种方式去设定,用同一种方式去跟cpu交互。

BIOS为了与符合VESA标准的显卡交互,专门对BISO进行了扩展,扩展的内容称为VESA BIOS extension ,简称 VBE。

所以,一定是有的机器上的显卡支持VBE,有的不支持。不过大部分的显卡都是符合VESA标准的。

但是,有的模拟器就不支持VBE了,

所以,在设置显卡的时候,要分几步:

先检查是否支持VBE,如果不支持,就按原来的显示方式检查VBE的版本号是否大于2.0,如果版本号小于2.0,就按原来的显示方式设定分辨率,并检查设置是否成功,,如果设置失败,就按原来的显示方式第1,2,3步中,有一个不成功时,就按原来的显示方式

调整后的代码为:

; haribote-os boot asm; TAB=4[INSTRSET "i486p"]VBEMODEEQU0x100; 1024 x 768 x 8位; 也可以设置为其他的分辨率,只要给VBEMODE一个从0x105~0x107的值就行了;0x100 : 640 x 400 x 8位;0x101 : 640 x 480 x 8位;0x103 : 800 x 600 x 8位;0x105 : 1024 x 768 x 8位;0x107 : 1280 x 1024 x 8位;下面是原来的显示模式,原来的分辨率;因为有些硬件上可能不支持VBE的大分辨率, 所以,一旦我们发现硬件不支持,我们就还使用原来的设置VMODEEQU0x0ff2; SCRNXEQU0x0ff4; SCRNYEQU0x0ff6; VRAMEQU0x0ff8; ORG0xc200; ; VBE模式; 检查硬件是否符合需求,是否可以使用BEV来设定显示模式MOVAX,0x9000MOVES,AXMOVDI,0 ;将ES:DI设置为0x9000:0x0000,等待有VBE的硬件自动写入信息MOVAX,0x4f00INT0x10 ; 显卡中断,执行设置动作,VBE的相关信息会自动写入内存的ES:DI处CMPAX,0x004f; 如果有VBE,中断返回值AX应该等于0x004fJNEscrn320 ; 跳转去执行原来的小分辨率; 检查VBE的版本MOVAX,[ES:DI+4] ; 从内存地址取出刚才写入的VBE信息CMPAX,0x0200 ; 比较版本信息是否小于0x0200 ;如果版本小于0x0200,说明小于2.0版本,则不支持高分辨率JBscrn320; if (AX < 0x0200) goto scrn320,跳转去执行原来的小分辨率;取得画面模式信息MOVCX,VBEMODE ;把0x105放到CX中MOVAX,0x4f01 INT0x10 ;调用中断,设置显卡,VBE模型的显卡会把我们设置的信息写入到ES:DI处CMPAX,0x004f ;查看返回信息,如果一切正常,返回值AX应该等于0x004fJNEscrn320 ; 如果不正常,跳转去执行原来的小分辨率; 检查写入的信息是否与我们设定的值相等CMPBYTE [ES:DI+0x19],8 ;检查颜色的灰度级JNEscrn320CMPBYTE [ES:DI+0x1b],4 ;检查是否为调色板模式JNEscrn320MOVAX,[ES:DI+0x00] ;取出模式属性ANDAX,0x0080 ;查看取bit7位是不是1JZscrn320; 跳转去执行原来的小分辨率; 运行到这里,说明VBE模式设置成功了,我们将后面C语言要用的信息,比如宽,高,显存的首地址保存到指定的内存地址中。MOVBX,VBEMODE+0x4000 ; 设置显示分辨率MOVAX,0x4f02INT0x10MOVBYTE [VMODE],8; 将画面模式放到VMODE地址处MOVAX,[ES:DI+0x12]MOV[SCRNX],AX ;;将屏幕高度给SCRNX指针,显示程序中的指针要用MOVAX,[ES:DI+0x14]MOV[SCRNY],AX ;将屏幕高度给SCRNY指针,显示程序中的指针要用MOVEAX,[ES:DI+0x28]MOV[VRAM],EAX ;将显存地址放到VRAM指针,显示程序中的指针要用JMPkeystatus ;设置完了,跳转到对键盘的设置程序中 ;如果VBE模式失败,就还用原来的小分辨率模式scrn320:MOVAL,0x13; VGA显示模式MOVAH,0x00INT0x10MOVBYTE [VMODE],8; 记录显示位数MOVWORD [SCRNX],320MOVWORD [SCRNY],200MOVDWORD [VRAM],0x000a0000

这个汇编代码里,主要是一些指针操作,不懂的读者朋友可以在评论区问我。

经过以上的设置,重新编译操作系统,然后运行,就会看到如下画面:

键盘win键在哪,键盘win键在哪里(30天自制操作系统day14)

可以看到,分辨率变大了。鼠标在中心的时候坐标是312,218,这说明,屏幕分辨率已经到了640x400.

到此,我们对显示屏的设置就暂时完成了。

下面我们完成两个新功能:字符输入功能和移动窗口的功能

完成字符输入功能

要完成字符输入的功能,就要对键盘返回的数值进行了解。

键的按下和抬起都会返回数值,如果按下返回0x01,那么抬起返回0x81.抬起返回的值总是比按下返回的值大0x80.

所以,只要我们掌握了每个键盘按下时返回的值就可以了。

并且,我们要打字,实际上也只要按下的返回值就可以了。

我们来看看键按下时的返回值表。

键盘win键在哪,键盘win键在哪里(30天自制操作系统day14)

可以看到,他们的返回值从0x00到0x7F。

表中"7C:保留"字样,是指当前返回值为0x7C的键还没有。

既然返回值拿到了,我们就可以做一个表格,用返回值做索引,就可以取到相应的字符了。

我们做一个表格,这个表暂时支持如下字符:

static char keytable[0x54] = {0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0, 0,'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0, 0, 'A', 'S','D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V','B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1','2', '3', '0', '.'};

有了这个表格,我们就可以把键值i翻译成字符keytable[i]了。

我们可以在代码中这样使用表格:

...for (;;) {io_cli();if (fifo32_status(&fifo) == 0) {io_stihlt();} else {i = fifo32_get(&fifo);io_sti();if (256 <= i && i <= 511) { // 如果FIFO中放入的值在256~511之间,是键盘的键按下了sprintf(s, "%02X", i - 256);putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);if (i < 256 + 0x54) {//如果值小于256+0x54,我们可以用表格keytable把键值变成字符if (keytable[i - 256] != 0) {s[0] = keytable[i - 256];s[1] = 0; // 将字符绘制到窗口sht_win上putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 1);}}} ...

效果:

视频加载中...

现在可以把键值显示成字符了,但是只能打一个字符,能不能改成输入一行呢?

可以的,

if (i < 0x54 + 256) {if (keytable[i - 256] != 0 && cursor_x < 144) {s[0] = keytable[i - 256];s[1] = 0; // 用cursor_x来控制字符写入的位置putfonts8_asc_sht(sht_win, cursor_x, 28, COL8_000000, COL8_FFFFFF, s, 1);cursor_x += 8;// 每次写完一个字符,cursor_x+8}}

然后我们把光标,那么会闪烁的光标,也绘制到cursor_x+8的位置:

if (i <= 1) { //FIFO中的数值为0,1说明是光标发生超时if (i != 0) {timer_init(timer3, &fifo, 0); cursor_c = COL8_000000;} else {timer_init(timer3, &fifo, 1); cursor_c = COL8_FFFFFF;}timer_settime(timer3, 50); // 在cursor_x位置绘制光标,营造打字效果boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, 28, cursor_x + 7, 43);sheet_refresh(sht_win, cursor_x, 28, cursor_x + 8, 44);}

完成改造后的效果:

视频加载中...

擦除效果的支持:

if (i == 256 + 0x0e && cursor_x > 8) { // 当按下的退格键,以及cursor_x>8,也就是已经答应了一个字符了// 给cursor_x位置绘制白色,实现擦除效果putfonts8_asc_sht(sht_win, cursor_x, 28, COL8_000000, COL8_FFFFFF, " ", 1);cursor_x -= 8;// cursor_x-8,下次在擦除的位置打印新字符}

这是擦除的支持。

其实我们可以继续对字符的输入进行完善。

不过目前我们还没有必要继续完善。因为要完成一个高效的文档编辑,其实需要多任务并行的支持,要完成文档的保存等等功能。

我们在完成多任务后,然后尝试在这个操作系统上开发应用程序,到时候,我们就开发一个文档输入的APP出来。

现在先等等。

把其他的需要完善的功能都开发出来,然后再去开发应用程序。

下一个要实现的功能是:对窗口进行移动。

完成用鼠标来移动窗口的功能

在操作系统的 for循环中,找到鼠标数据的处理程序,当鼠标左键被按下时,窗口win就移动到鼠标的位置。

if (512 <= i && i <= 767) { if (mouse_decode(&mdec, i - 512) != 0) {sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);if ((mdec.btn & 0x01) != 0) {s[1] = 'L';}if ((mdec.btn & 0x02) != 0) {s[3] = 'R';}if ((mdec.btn & 0x04) != 0) {s[2] = 'C';}putfonts8_asc_sht(sht_back, 32, 16, COL8_FFFFFF, COL8_008484, s, 15);mx += mdec.x;my += mdec.y;if (mx < 0) {mx = 0;}if (my < 0) {my = 0;}if (mx > binfo->scrnx - 1) {mx = binfo->scrnx - 1;}if (my > binfo->scrny - 1) {my = binfo->scrny - 1;}sprintf(s, "(%3d, %3d)", mx, my);putfonts8_asc_sht(sht_back, 0, 0, COL8_FFFFFF, COL8_008484, s, 10);sheet_slide(sht_mouse, mx, my);if ((mdec.btn & 0x01) != 0) {// 当鼠标的左键被按下时// 利用sheet_slide函数,把窗口sht_win移动到鼠标所在的位置sheet_slide(sht_win, mx - 80, my - 8);}}}

sheet_slide本来是用来移动鼠标所在的图层的,现在也用来移动其他窗口了。

这说明,原来我们按层来控制显示,功能非常强大。

我们来看看效果:

视频加载中...

本文关键词:笔记本键盘win键在哪,台式机键盘win键在哪,电脑键盘全图详细,键盘win键在哪里,电脑键盘快捷键大全一览表。这就是关于《键盘win键在哪,键盘win键在哪里(30天自制操作系统day14)》的所有内容,希望对您能有所帮助!


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 表达心累又无奈的诗句,表达心累且无奈的诗句(七首人生快意古诗)

下一篇: 沙滩鞋和凉鞋的区别,凉鞋与沙滩鞋有什么区别(DOZER4)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号