📄 keyboard.c
字号:
#include "regs240x.H"
//==================================
volatile ioport unsigned int port0a; //KBD scan(0-3)
volatile ioport unsigned int port0b; //KBD scan(4-5)
volatile ioport unsigned int port0c; //KBD input(0-3)
volatile ioport unsigned int port0d; //KBD input(4-5)
#define KBDSCANLOW port0a;
#define KBDSCANHIGH port0b;
#define KBDINLOW port0c;
#define KBDINHIGH port0d;
#define KEYBUFFERLEVEL 64
#define KEYWIDTH 6
#define KEYHEIGHT 6
//key value defination
#define PAGEUP 50
#define PAGEDOWN 51
#define ENTER 52
#define CANCEL 53
#define BACKSPACE 54
#define UP 55
#define DOWN 56
#define LEFT 57
#define RIGHT 58
//key map
static unsigned int keymap[KEYHEIGHT*KEYWIDTH] = {
// 0 1 2 3 4 5 6 7 8 9 10 11 12 14 16 18 20 22 24
LEFT,RIGHT,DOWN,CANCEL,ENTER,255,8,9,UP,13,BACKSPACE,255,4,5,6,7,PAGEDOWN,255,0,1,2,3,PAGEUP,255,255,
// 13 15 17 19 21 23
// 25 26 27 28 29 30 31 32 33 34 35 为得到的物理键值,作为数组序号
255,255,255,255,255,255,255,255,255,255,255 //为用户自定义的键盘映像
};
/*
static unsigned int keymap[KEYHEIGHT*KEYWIDTH] = {
// 0 1 2 3 4 5 6 7 8 9 1011 12 14 16 18 20 22 24
NUMLOCK,255,1,4,7,255,/,0,2,5,8,255,*,DEL,3,6,9,255,-,1,ENTER,255,+,255,255,
// 13 15 17 19 21 23
// 25 26 27 28 29 30 31 32 33 34 35 为得到的物理键值,作为数组序号
255,255,255,255,255,255,255,255,255,255,255 //为用户自定义的键盘映像
};
*/
unsigned int keybuff[KEYBUFFERLEVEL]; //Key Input Buffer, level 16 in all
unsigned int keyold; //Oldest key of not processed
unsigned int keynew; //Newest key of inputted
void KBDInit(void){
keynew = 1;
keyold = 0;
XINT1CR = 0x03; //Falling edge | low polarity | enable INT1
IFR = 0xFFFF; //Write 1s into IFR to clear any INT flag existed
IMR = 0x21; //Unmask only INT1
asm(" CLRC INTM "); //Enable all inttrupts.
}
/*void interrupt c_int1()
{
int i;
int portin[4],keyx,keyy;
asm(" SETC INTM "); //Disable all inttrupts.
//=========================
//=========================
XINT1CR = 0x8001;
IFR = 0xFFFF; //Write 1s into IFR to clear any INT flag existed
asm(" CLRC INTM "); //Enable all inttrupts.
}
*/
void interrupt c_int6()
{
int i;
int portin[4],keyx,keyy;
asm(" SETC INTM "); //Disable all inttrupts.
//=========================
if( keynew != keyold )
{ i = 0;
portin[i++] = KBDSCANHIGH;
portin[i++] = KBDSCANLOW;
portin[i++] = KBDINHIGH;
portin[i++] = KBDINLOW;
keyx = (0x3f-((portin[1] & 0x0f) | (portin[0] << 4) & 0x030));
keyy = (0x3f-((portin[3] & 0x0f) | (portin[2] << 4) & 0x030));
for( i=0;i<KEYHEIGHT;i++ ){
if( (keyx & (1<<i)) ){
keyx = i;
break;
}
}
for( i=0;i<KEYWIDTH;i++ ){
if( (keyy & (1<<i)) ){
keyy = i;
break;
}
}
keybuff[keynew++] = keymap[keyy + keyx * KEYWIDTH];
if( keynew > KEYBUFFERLEVEL ){
keynew = keynew - KEYBUFFERLEVEL ;
}
}
//=========================
XINT1CR = 0x8003;
asm(" CLRC INTM "); //Enable all inttrupts.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -