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

📄 pcjianpan.h

📁 键盘可以直接接在单片机上
💻 H
字号:

#include <intrins.h>   //_nop_();


#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long

#define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

sbit Key_Data =P3^4; //定义Keyboard引脚

sbit Key_CLK=  P3^2;

void Delay5Ms(void);

void Delay400Ms(void);

unsigned char Decode(unsigned char ScanCode);

static unsigned char IntNum = 0; //中断次数计数

static unsigned char KeyV; //键值
static unsigned char Valid;  //是否有有效的输入
static unsigned char Key;
static unsigned char DisNum = 0; //显示用指针

static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识

static unsigned char BF = 0; //标识是否有字符被收到

unsigned char code UnShifted[61][2] = {

0x1C, 'a',

0x32, 'b',

0x21, 'c',

0x23, 'd',

0x24, 'e',

0x2B, 'f',

0x34, 'g',

0x33, 'h',

0x43, 'i',

0x3B, 'j',

0x42, 'k',

0x4B, 'l',

0x3A, 'm',

0x31, 'n',

0x44, 'o',

0x4D, 'p',

0x15, 'q',

0x2D, 'r',

0x1B, 's',

0x2C, 't',

0x3C, 'u',

0x2A, 'v',

0x1D, 'w',

0x22, 'x',

0x35, 'y',

0x1A, 'z',

0x45, '0',

0x16, '1',

0x1E, '2',

0x26, '3',

0x25, '4',

0x2E, '5',

0x36, '6',

0x3D, '7',

0x3E, '8',

0x46, '9',

0x0E, '`',

0x4E, '-',

0x55, '=',

0x5D, '\\',

0x29, ' ',

0x54, '[',

0x5B, ']',

0x4C, ';',

0x52, '\'',

0x41, ',',

0x49, '.',

0x4A, '/',

0x71, '.',

0x70, '0',

0x69, '1',

0x72, '2',

0x7A, '3',

0x6B, '4',

0x73, '5',

0x74, '6',

0x6C, '7',

0x75, '8',

0x7D, '9',

0x5A, '+',

0x66, '_',

};

unsigned char code Shifted[61][2] = {

0x1C, 'A',

0x32, 'B',

0x21, 'C',

0x23, 'D',

0x24, 'E',

0x2B, 'F',

0x34, 'G',

0x33, 'H',

0x43, 'I',

0x3B, 'J',

0x42, 'K',

0x4B, 'L',

0x3A, 'M',

0x31, 'N',

0x44, 'O',

0x4D, 'P',

0x15, 'Q',

0x2D, 'R',

0x1B, 'S',

0x2C, 'T',

0x3C, 'U',

0x2A, 'V',

0x1D, 'W',

0x22, 'X',

0x35, 'Y',

0x1A, 'Z',

0x45, ')',

0x16, '!',

0x1E, '@',

0x26, '#',

0x25, '$',

0x2E, '%',

0x36, '^',

0x3D, '&',

0x3E, '*',

0x46, '(',

0x0E, '~',

0x4E, '-',

0x55, '=',

0x5D, '|',

0x29, ' ',

0x54, '{',

0x5B, '}',

0x4C, ':',

0x52, '"',

0x41, '<',

0x49, '>',

0x4A, '?',

0x71, '.',

0x70, '0',

0x69, '1',

0x72, '2',

0x7A, '3',

0x6B, '4',

0x73, '5',

0x74, '6',

0x6C, '7',

0x75, '8',

0x7D, '9',

0x5A, '+',

0x66, '_',

};

 

//5ms延时

/*void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//400ms延时

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}
*/
void Keyboard_out(void) interrupt 0

{

if ((IntNum > 0) && (IntNum < 9))

{ 

KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位

if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位

}

IntNum++;

while (!Key_CLK); //等待PS/2CLK拉高

if (IntNum > 10)

{

IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收

BF = 1; //标识有字符输入完了

EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)

}

}

unsigned char Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码

{

unsigned char TempCyc; 

if (!Key_UP) //当键盘松开时

{

switch (ScanCode)

{

case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始

Key_UP = 1;

break;

case 0x12 : // 左 SHIFT

Shift = 1;

break;

case 0x59 : // 右 SHIFT

Shift = 1;

break;

default: 



if(!Shift) //如果SHIFT没按下

{

for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<61); TempCyc++); //查表显示

if (UnShifted[TempCyc][0] == ScanCode) 
		{
		Valid = 1;
		Key = UnShifted[TempCyc][1];
				
}

BF = 0; 
return Key;

} 

else //按下SHIFT

{

for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<61); TempCyc++); //查表显示

if (Shifted[TempCyc][0] == ScanCode) 
		{
	
		Valid = 1;
		Key = Shifted[TempCyc][1];	
		
	}

BF = 0; 
return Key;

}

break;

}

}

else

{ 

Key_UP = 0;

switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理

{

case 0x12 : // 左 SHIFT

Shift = 0;

break;

case 0x59 : // 右 SHIFT

Shift = 0;

break;

}

}

BF = 0; //标识字符处理完了
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -