⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 一个小型的操作系统,采用gcc进行开发,几千行的代码,方便初学者学习
💻 C
字号:
/**  Snixos Project version 1.0, 2003.6*  (C) Copyright 2003,2004,2005 Jockeyson,KeqiangGao <Snallie@tom.com>*  All Rights Reserved.*  Distributed under the terms of the GNU General Public License.**  This program is a free and open source software and you can redistribute *  it and/or modify it under the terms of the GNU General Public License as*  published by the Free Software Foundation. As no any liability is assumed *  for any incidental or consequential damages in connection with the *  information or program fragments contained herein,so any exception arised*  is at your own risk. It is ABSOLUTELY WITHOUT ANY WARRANTY.*  Bug report please send to Snallie@tom.com .*//*  keyboard.c: keyboard interrupt handler in C  Author  : snallie@tom.com  Time    : 2004.3  $Id: keyboard.c,v 1.3 2004/06/11 22:42:56 root Exp root $  built   : $Date: 2004/06/11 22:42:56 $  $Revision: 1.3 $*/#include "keyboard.h"#include "io.h"#include "stdio.h"#include "keybd.h"/*keyBdHandle() 	read keyboard and store scancode and ascii code to keyboard queue, lit up 	keyboard LEDS when capsLock,numLock,scrollLock alternated ,etc...*/void keyBdHandle(){    unsigned char scanCode;    scanCode = inb(KBDATAPORT);    switch (scanCode) {		/* function and control key */    case 1:	printf("<Esc>");	goto bye;	break;    case 59:	printf("<F1>");	goto bye;	break;    case 60:	printf("<F2>");	goto bye;	break;    case 61:	printf("<F3>");	goto bye;	break;    case 62:	printf("<F4>");	goto bye;	break;    case 63:	printf("<F5>");	goto bye;	break;    case 64:	printf("<F6>");	goto bye;	break;    case 65:	printf("<F7>");	goto bye;	break;    case 66:	printf("<F8>");	goto bye;	break;    case 67:	printf("<F9>");	goto bye;	break;    case 68:	printf("<F10>");	goto bye;	break;    case 87:	printf("<F11>");	goto bye;	break;    case 88:	printf("<F12>");	goto bye;	break;    case 0x2a:			/* left shift pressed */	ks.LeftShift = PRESSED;	goto bye;	break;    case 0x36:			/* right shift pressed */	ks.RightShift = PRESSED;	goto bye;	break;    case 0xaa:			/* left shift released */	ks.LeftShift = RELEASED;	goto bye;	break;    case 0xb6:			/* right shift released */	ks.RightShift = RELEASED;	goto bye;	break;    case 0x1d:			/* left Ctrl pressed */	ks.LeftCtrl = PRESSED;	goto bye;	break;    case 0x9d:			/* left ctrl released */	ks.LeftCtrl = RELEASED;	goto bye;	break;    case 0x38:			/* left Alt pressed */	ks.LeftAlt = PRESSED;	goto bye;	break;    case 0xb8:			/* Left Alt released */	ks.LeftAlt = RELEASED;	goto bye;	break;    case 58:			/* alternate CapsLock bit */	kbdLEDS = kbdLEDS ^ 4;	kbdLedOnOff(kbdLEDS);	ks.CapsLock = (ks.CapsLock + 1) % 2;	goto bye;	break;    case 69:			/* alternate NumLock bit */	kbdLEDS = kbdLEDS ^ 2;	kbdLedOnOff(kbdLEDS);	ks.NumLock = (ks.NumLock + 1) % 2;	goto bye;	break;    case 70:			/* alternate ScrollLock bit */	kbdLEDS = kbdLEDS ^ 1;	kbdLedOnOff(kbdLEDS);	ks.ScrollLock = (ks.ScrollLock + 1) % 2;	goto bye;	break;    case 0xe0:			/* extended scanCode */	ks.ScanExtE0 = 1;	goto bye;	break;    }    if (ks.ScanExtE0 == 1) {	/* e0 1c e0 9c */	switch (scanCode) {	case 0x1d:		/* RightCtrl pressed */	    ks.RightCtrl = PRESSED;	    break;	case 0x9d:		/* RightCtrl released */	    ks.RightCtrl = RELEASED;	    break;	case 0x38:		/* RightAlt pressed */	    ks.RightAlt = PRESSED;	    break;	case 0xb8:		/* RightAlt released */	    ks.RightAlt = RELEASED;	    break;	case 0x1c:		/* Enter on keypad */	    ks.ScanExtE0 = 0;	    goto sendToBuffer;	    break;	case 0x35:		/* / on keypad */	    goto sendToBuffer;	    break;	case 82:		/* Insert  */	case 83:		/* Delete */	case 71:		/* Home  */	case 79:		/* End  */	case 73:		/* PageUp */	case 81:		/* PageDown */	case 72:		/* Up */	case 75:		/* Left */	case 80:		/* Down */	case 77:		/* Right */	    ks.ScanExtE0 = 0;	    goto sendToBuffer;	    break;	}	ks.ScanExtE0 = 0;	goto bye;    }    if ((ks.NumLock != LOCKED)) {	switch (scanCode) {	case 82:	    printf("<Insert>");	    goto bye;	    break;	case 83:	    printf("<Delete>");	    goto bye;	    break;	case 71:	    printf("<Home>");	    goto bye;	    break;	case 79:	    printf("<End>");	    goto bye;	    break;	case 73:	    printf("<PageUp>");	    goto bye;	    break;	case 81:	    printf("<PageDown>");	    goto bye;	    break;	case 72:	    printf("<Up>");	    goto bye;	    break;	case 75:	    printf("<Left>");	    goto bye;	    break;	case 80:	    printf("<Down>");	    goto bye;	    break;	case 77:	    printf("<Right>");	    goto bye;	    break;	}    }    if ((ks.NumLock == LOCKED) && (ks.ScanExtE0 == 0)) {	/* enable keypad */	switch (scanCode) {	case 71:		/*ch='7'; */	    scanCode = 8;	    break;	case 72:		/*ch='8'; */	    scanCode = 9;	    break;	case 73:		/*ch='9'; */	    scanCode = 10;	    break;	case 75:		/*ch='4'; */	    scanCode = 5;	    break;	case 76:		/*ch='5'; */	    scanCode = 6;	    break;	case 77:		/*ch='6'; */	    scanCode = 7;	    break;	case 79:		/*ch='1'; */	    scanCode = 2;	    break;	case 80:		/*ch='2'; */	    scanCode = 3;	    break;	case 81:		/*ch='3'; */	    scanCode = 4;	    break;	case 82:		/*ch='0'; */	    scanCode = 11;	    break;	case 83:		/*ch='.'; */	    scanCode = 0x34;	    break;	}    } else {			/* disable keypad */	switch (scanCode) {	case 82:	    printf("<Insert>");	    goto bye;	    break;	case 83:	    printf("<Delete>");	    goto bye;	    break;	case 71:	    printf("<Home>");	    goto bye;	    break;	case 79:	    printf("<End>");	    goto bye;	    break;	case 73:	    printf("<PageUp>");	    goto bye;	    break;	case 81:	    printf("<PageDown>");	    goto bye;	    break;	case 72:	    printf("<Up>");	    goto bye;	    break;	case 75:	    printf("<Left>");	    goto bye;	    break;	case 80:	    printf("<Down>");	    goto bye;	    break;	case 77:	    printf("<Right>");	    goto bye;	    break;	}    }  sendToBuffer:    if (scanCode >= 0x80)	/* released or pressed (bit7=0 means pressed) */	goto bye;    if ((keyTail + 1) % KBSIZE == keyHead) {	printf("keyboard buffer full\n");	goto bye;    }    keybdTail->scan = scanCode;    keybdTail->ascii = (ks.LeftShift == PRESSED			|| ks.RightShift == PRESSED			|| ks.CapsLock ==			LOCKED) ? shiftMap[scanCode] : ascTab[scanCode];    moveTail();  bye:    /*  send reset signal to keyboard */    scanCode = inb(KBCTRLPORT);    scanCode || 0x80;    outb(scanCode, KBCTRLPORT);    scanCode = inb(KBCTRLPORT);    scanCode && 0x7f;    outb(scanCode, KBCTRLPORT);    /*  send EOI to 8259  */    outb(0x20, 0x20);		/* EOI , without this keyborad may hang up! */}static void moveHead(){    keyHead = (keyHead + 1) % KBSIZE;}static void moveTail(){    keyTail = (keyTail + 1) % KBSIZE;}/*  if keyborad buffer emtpy then return 1, else return 0 */int keyEmpty(){    return ((keyHead % KBSIZE) == keyTail ? 1 : 0);}/*  return ascii key */char getKey(){    char a;    while (1) {	if (!keyEmpty())	    break;    }    a = keybdHead->ascii;    moveHead();    return a;}/*  return scan key  */char getScan(){    char a;    while (1) {	if (!keyEmpty())	    break;    }    a = keybdHead->scan;    moveHead();    return a;}/*  return both ascii and scan key */void readKeybd(char *ascii, char *scan){    while (1) {	if (!keyEmpty())	    break;    }    *ascii = keybdHead->ascii;    *scan = keybdHead->scan;    moveHead();}/* return 1 pressed, return 0 released */int getLeftCtrl(){  return ks.LeftCtrl;}/*  port 60h b0 is ScrollLock, b1 is NumLock, b2 is CapsLock */void kbdLedOnOff(unsigned char i){    unsigned int a = 0;    outb(0xed, 0x60);    while (a < 0xfffff) 	a++;	/* delay */    outb(i & 7, 0x60);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -