📄 keyboard.c
字号:
#include <stdio.h>
#include <string.h>
#include "standard.h"
#include "queue.h"
// Unshifted characters
u8 code unshifted[][2] = {
0x0d,9, //tab
0x0e,126, //~
0x15,'q',
0x16,'1',
0x1a,'z',
0x1b,'s',
0x1c,'a',
0x1d,'w',
0x1e,'2',
0x21,'c',
0x22,'x',
0x23,'d',
0x24,'e',
0x25,'4',
0x26,'3',
0x29,' ',
0x2a,'v',
0x2b,'f',
0x2c,'t',
0x2d,'r',
0x2e,'5',
0x31,'n',
0x32,'b',
0x33,'h',
0x34,'g',
0x35,'y',
0x36,'6',
0x3a,'m',
0x3b,'j',
0x3c,'u',
0x3d,'7',
0x3e,'8',
0x41,',',
0x42,'k',
0x43,'i',
0x44,'o',
0x45,'0',
0x46,'9',
0x49,'.',
0x4a,'/',
0x4b,'l',
0x4c,';',
0x4d,'p',
0x4e,'-',
0x52,'\'',
0x54,'[',
0x55,'=',
0x5a,13, //enter
0x5b,']',
0x5d,'\\',
0x61,'<', //test keyboard don't have this key
0x66,8, //backspace
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x76, 27, //esc
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9',
0,0
};
// Shifted characters
u8 code shifted[][2] = {
0x0d,9,
0x0e,126,
0x15,'Q',
0x16,'!',
0x1a,'Z',
0x1b,'S',
0x1c,'A',
0x1d,'W',
0x1e,'@',
0x21,'C',
0x22,'X',
0x23,'D',
0x24,'E',
0x25,'$',
0x26,'#',
0x29,' ',
0x2a,'V',
0x2b,'F',
0x2c,'T',
0x2d,'R',
0x2e,'%',
0x31,'N',
0x32,'B',
0x33,'H',
0x34,'G',
0x35,'Y',
0x36,'^',
0x3a,'M',
0x3b,'J',
0x3c,'U',
0x3d,'&',
0x3e,'*',
0x41,'<',
0x42,'K',
0x43,'I',
0x44,'O',
0x45,')',
0x46,'(',
0x49,'>',
0x4a,'\?',
0x4b,'L',
0x4c,':',
0x4d,'P',
0x4e,'_',
0x52,'"',
0x54,'{',
0x55,'+',
0x5a,13,
0x5b,'}',
0x5d,'|',
0x61,'>', //test keyboard don't have this key
0x66,8,
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x76, 27,
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9',
0,0
};
bit release=0;
bit capslock=0;
bit shift=0;
bit ctrl=0;
bit alt=0;
bit num=0;
bit del=0;
bit insert=0;
bit home=0;
bit end=0;
bit left=0;
bit right=0;
bit up=0;
bit down=0;
bit pageup=0;
bit pagedown=0;
Queue kb_buff;
u8 bitcount;
bit specialkey=0;
void decode (u8 sc);
void init_kb(void);
void init_kb(void)
{
EA=1;
EX1=1; //enable INT1
IT1=1; //falling edge INT1
bitcount=11;
P34=1;
Init_queue(&kb_buff);
}
void int1(void) small interrupt 2 using 2
{
static u8 kbcode;
if (bitcount < 11 && bitcount > 2)
{
kbcode = (kbcode>>1);
if (P34==1)
kbcode = kbcode | 0x80;
}
if (--bitcount == 0)
{
decode(kbcode);
bitcount = 11;
}
}
void decode (u8 sc) using 2
{
u8 i;
if (!release) //first press or repeat press not get breakcode F0
{
switch (sc)
{
case 0xF0: //get break code next code goto routine "else release key already"
release=1;
break;
case 0x12: //left shift
shift=1;
break;
case 0x59: //right shift
shift=1;
break;
case 0x58: //capslock
if (capslock==0) {
capslock=1;
} else {
capslock=0;
}
break;
case 0x14: //ctrl
ctrl=1;
break;
case 0x11: //alt
alt =1;
break;
case 0x77: //num
if (num==0) {
num=1;
} else {
num=0;
}
break;
case 0xE0: //speacial key
specialkey=1;
break;
default:
if (specialkey) goto keyspecial;
if (!num){
keyspecial:
switch (sc)
{
case 0x71: //del
del=1;
break;
case 0x70: //insert
insert=1;
break;
case 0x6C: //home
home=1;
break;
case 0x69: //end
end=1;
break;
case 0x6B: //left
left =1;
break;
case 0x74: //right
right=1;
break;
case 0x75: //up
up=1;
break;
case 0x72: //down
down=1;
break;
case 0x7D: //pageup
pageup=1;
break;
case 0x7A: //pagedown
pagedown=1;
break;
case 0x73: //5
break;
default:
goto otherkey;
}
} else {
otherkey:
// if (!ctrl)
// if (!alt)
if (capslock==0) // Capslock off
{
if (!shift) //it shift not pressed
{
for (i=0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
if (unshifted[i][0] == sc) AddQueue(unshifted[i][1],&kb_buff);
} else { //it shift pressed
for (i=0; shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc) AddQueue(shifted[i][1],&kb_buff);
}
} else { // Capslock on
if (shift) //it shift not pressed
{
for (i=0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
if (unshifted[i][0] == sc) AddQueue(unshifted[i][1],&kb_buff);
} else { //it shift pressed
for (i=0; shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc) AddQueue(shifted[i][1],&kb_buff);
}
}
break; //end switch statement outter loop
} // end if(!num)
} // end switch outter loop
} else { // release key already
release = 0;
ctrl = 0;
alt = 0;
del = 0;
insert = 0;
home = 0;
end = 0;
left = 0;
right = 0;
up = 0;
down = 0;
pageup = 0;
pagedown = 0;
specialkey=0;
switch (sc) //Maybe some button can hold on while another release
{ //example if sc!=0x12 or 0x59 so shift not release
case 0x12: //left shift
shift=0;
break;
case 0x59: //right shift
shift=0;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -