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

📄 keyboard.c

📁 一个在51单片机下PS/2键盘的应用
💻 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 + -