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

📄 keyboard.c

📁 Interface PC KEYBOARD using 8051 INT pin
💻 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 + -