📄 keyboard.c
字号:
/*www.wzlab.com *ps2键盘驱动 *使用终端读数据 * */#include "keyboard.h"#include "scancodes.h"#define PIN_DIR DDRD#define PIN_KB PIND#define PORT_KB PORTD#define CLOCK 3#define DATAPIN 2#define BUFF_SIZE 32unsigned char bitcount; unsigned char kb_buffer[BUFF_SIZE];volatile unsigned char kinput=0;unsigned char koutput=0;void put_kbbuff(unsigned char c){ kb_buffer[kinput]=c; if (kinput<(BUFF_SIZE-1)) kinput++; else kinput=0; }int keyboard_getchar(void){ unsigned char temp; if(koutput==kinput){ return 0; } else{ temp=kb_buffer[koutput]; koutput=(koutput<(BUFF_SIZE-1))?(koutput+1):0; return temp; } }void keyboard_init(void){ PIN_DIR&=~((1<<CLOCK)|(1<<DATAPIN)); PORT_KB|=(1<<CLOCK)|(1<<DATAPIN); MCUCR = 0x08; GICR = 0x80; sei(); bitcount = 11;}/* 查表解码 */void decode(unsigned char sc){ static unsigned char shift,up,shiftup; unsigned char i; if(sc==0xf0) { up=1; return; } if(up==1) { up=0; if ((sc==0x12)|(sc==0x59)) shift=0; return; } switch (sc) { case 0x12: shift =1; shiftup=1; case 0x59: shift =1; shiftup=1; default: if (shift==0) { for(i = 0;(pgm_read_byte(unshifted+2*i)!=sc) && pgm_read_byte(unshifted+2*i); i++); if (pgm_read_byte(unshifted+2*i) == sc) { put_kbbuff(pgm_read_byte(unshifted+i*2+1)); } } else { for(i = 0;(pgm_read_byte(shifted+2*i)!=sc) && pgm_read_byte(shifted+2*i); i++); if (pgm_read_byte(shifted+2*i) == sc) { put_kbbuff(pgm_read_byte(shifted+2*i+1)); } } } }SIGNAL(SIG_INTERRUPT1){ static unsigned char data; switch (bitcount) { case 11: if ((PIN_KB&(1<<DATAPIN))!=0) return; else bitcount--; break; case 2: bitcount--; break; case 1: bitcount--; if((PIN_KB&(1<<DATAPIN))==0) { bitcount=11; return; } else { bitcount=11; decode(data); } break; default: data = (data >> 1); if((PIN_KB&(1<<DATAPIN))!=0) data|=0x80; bitcount--; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -