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

📄 ps-2keyboard.c

📁 EDN板之PS2键盘接口程序-- 单片机殿堂
💻 C
字号:
/********************************************************************************************************
原理:每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p3.4口一位位传进来
接口:键盘时钟接在p3.2口,即8051的外部中断int1上,键盘数据接到p3.4上,外部中断使用边沿触发方式
键盘返回数据格式:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验)
*********************************************************************************************************/

#include "ScanCode.h" //按键通码与ascii对照表
#include "ps2KEYBOARD.h"
#include "lcdapi.h"
#include "3310.h"

uchar InIndex=0,OutIndex=0;
uchar KeyBuff[BUFF_SIZE];

/*功能:通过外部中断1读取键盘发送回来的数据位
 *性质:中断调用
 *参数:无
 *返回:无
 */
void KeyBoardISR() interrupt 2 //外部中断1 用来接受键盘发来的数据
{
	static uchar BitCount=11,KeyData;
	if(BitCount<11 && BitCount>2)
	{
		KeyData>>=1;
		if(KeyBoardSda)
			KeyData|=0x80;
	}
	if(--BitCount==0)
	{
		BitCount=11;
		KeyBuff[InIndex]=KeyData;
		if(++InIndex==BUFF_SIZE)
			InIndex=0;
		KeyData=0;
	}
}

/*功能:通过串口或其它方式显示键盘值(自定义)
 *性质:外部调用
 *参数:键盘按键值
 *返回:无
 */
void Send(uchar d)
{
	static uchar i,j;
	
    if(i!=80)
	   {
	    DispAsc(i,2,&d);
      	i+=8;
		}
	 else if(i==80)
	   {
	    DispAsc(j,4,&d);
	    j+=8;
		if(j==80)
          {
          i=0;
          j=0;
		  LCD_Clr2();
		  DispString(16,0,"零距离");
          }
	  }
}

/*功能:通过中断程序的数据位从数组中取出键值
 *性质:外部调用
 *参数:无
 *返回:无
 */
void KeyBoardDecode(void)
{
	static bit ShiftFlg,CapsFlg,NumFlg,BreakFlg,ExtendFlg;
	uchar ArrayIndex;
	uchar ScanCode;

	while(InIndex != OutIndex)
	{
		if(!BreakFlg)
		{
			switch(KeyBuff[OutIndex])
			{
				case 0x12:								//左SHIFT
				case 0x59:
					ShiftFlg = 1; 			//右SHIFT
					break;
				case 0x58:
					if(CapsFlg)				//Caps
					{
						CapsFlg = 0;
					}
					else if(!CapsFlg)	
					{
						CapsFlg = 1;
					}
					break;
				case 0x77:
					if(NumFlg)				//切换Num
					{
						NumFlg = 0;
					}
					else if(!NumFlg)	
					{
						NumFlg = 1;
					}
					break;
				case 0xe0 :
					if(!ExtendFlg)
					{
						ExtendFlg = 1; 
					}
					else if(ExtendFlg)
					{
						ExtendFlg = 0;
					}	 		
					break;
				case 0xf0 :
					BreakFlg = 1;
					break;									
				default:		
					if(ShiftFlg)		
					{
						for(ArrayIndex = 0;shifted[ArrayIndex][0] != 0 ;ArrayIndex++)
						{
							
							if(KeyBuff[OutIndex] == shifted[ArrayIndex][0])
							{
								ScanCode = shifted[ArrayIndex][1];
								Send(ScanCode);
								break;
							}	
						}
					
					}
					else	if(CapsFlg)
					{
						for(ArrayIndex = 0;unshifted[ArrayIndex][0] != 0 ;ArrayIndex++)
						{
							
							if(KeyBuff[OutIndex] == unshifted[ArrayIndex][0])
							{
								ScanCode = unshifted[ArrayIndex][1];
								if((ScanCode >= 'a')&&(ScanCode <= 'z'))
								{
									ScanCode -= 0x20;
								}
								Send(ScanCode);
								break;
							}	
						}
					}
					else	if(!ShiftFlg)
					{
						for(ArrayIndex = 0;unshifted[ArrayIndex][0] != 0;ArrayIndex++)	
						{
							if(KeyBuff[OutIndex] == unshifted[ArrayIndex][0])
							{
								ScanCode = unshifted[ArrayIndex][1];
								Send(ScanCode);
								break;
							}	
						}
					}
			}
		}
		else	
		{
			BreakFlg = 0;									//break code received
			switch(KeyBuff[OutIndex])
			{
				case 0x12	:								//lshft
				case 0x59 	:	ShiftFlg = 0; //rshft
									break;
			}
		}
		OutIndex ++;
		if(OutIndex == BUFF_SIZE)	OutIndex =0;  //循环 outpointer
	}
 }

⌨️ 快捷键说明

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