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

📄 key.c

📁 用51单片机模拟PS2接口。可以接PS2口的键盘。做外接键盘时很有用
💻 C
字号:
#include<reg51.h>
#define WAITFORKEYBOARDPULSE  while(!scl); while(scl);
#define uchar unsigned char
#define uint unsigned int
#define DE 0x40
#define PDATA P0

uchar read_key (void);
//sbit led = P1^2;
sbit scl = P1^0;
sbit sda = P1^1;
void setkey(uchar row,uchar col);

uchar te;
void Delay(unsigned int MS)
{
     unsigned char us,usn;
     while(MS!=0)            //for 12M
           { usn = 2;
                 while(usn!=0)
                       {
                             us=0xf5;
                             while (us!=0){us--;};
                             usn--;
                       }
                 MS--;
           }
}
main ()
{ 
	Delay(250);
//	setkey(1,3);
	while(1)
    {
	 switch(read_key())
	 {
	 	case 0x69: //1
			setkey(0,0);
			while(read_key()==0x69 || read_key()==0xF0);
			break;
		case 0x72: //2
			setkey(0,1);
			while(read_key()==0x72 || read_key()==0xF0);
			break;
		case 0x7A: //3
			setkey(0,2);
			while(read_key()==0x7A || read_key()==0xF0);
			break;
		case 0x6B: //4
			setkey(1,0);
			while(read_key()==0x6B || read_key()==0xF0);
			break;
		case 0x73: //5
			setkey(1,1);
			while(read_key()==0x73 || read_key()==0xF0);
			break;
		case 0x74: //6
			setkey(1,2);
			while(read_key()==0x74 || read_key()==0xF0);
			break;
		case 0x6C: //7
			setkey(2,0);
			while(read_key()==0x6C || read_key()==0xF0);
			break;
		case 0x75: //8
			setkey(2,1);
			while(read_key()==0x75 || read_key()==0xF0);
			break;
		case 0x7D: //9
			setkey(2,2);
			while(read_key()==0x7D || read_key()==0xF0);
			break;
		case 0x70: //0
			setkey(3,0);
			while(read_key()==0x70 || read_key()==0xF0);
			break;
		case 0x71: //.
			setkey(3,1);
			while(read_key()==0x71 || read_key()==0xF0);
			break;

		case 0x06: //设置  F2
			setkey(0,3);
			while(read_key()==0x06 || read_key()==0xF0);
			break;
		case 0x05: //F1
			setkey(1,3);
			while(read_key()==0x05 || read_key()==0xF0);
			break;
		case 0x79: //X 小+
			setkey(2,3);
			while(read_key()==0x79 || read_key()==0xF0);
			break;
		case 0xE0: //确认 小回车
			if(read_key()==0x5A)
			{
			setkey(3,3);
			while(read_key()==0xE0 || read_key()==0x5A);
			}
			break;
		case 0x0C: //查询 F4
			setkey(3,2);
			while(read_key()==0x0C || read_key()==0xF0);
			break;
		case 0x5A: //结账 大回车
			setkey(4,3);
			while(read_key()==0x5A || read_key()==0xF0);
			break;
		case 0x76: //退出	ESC
			setkey(4,0);
			while(read_key()==0x76 || read_key()==0xF0);
			break;
		case 0x03: //总清	F5
			setkey(4,1);
			while(read_key()==0x03 || read_key()==0xF0);
			break;
		case 0x66: //清除	退格键
			setkey(4,2);
			while(read_key()==0x66 || read_key()==0xF0);
			break;

	 }
    }
}

void setkey(uchar row,uchar col)
{
	uchar tmp;
	//led=0;
	tmp=row+(col<<3);
	tmp&=~DE;
	PDATA=tmp;
	Delay(58);
	tmp|=DE;
	PDATA=0xFF;
//	led=1;		
}
uchar read_key (void)
{
uchar KeyCode;
uchar Rbit;
while(scl);                            // 等待键盘把时钟第一次拉低

   for(Rbit = 8; Rbit != 0; Rbit --)   // 把起始位算入
   {
    WAITFORKEYBOARDPULSE;              // 等待一个有效的下跳沿
    KeyCode  >>= 1;                    // 按照PS2格式,数据低位在前
    scl  = 1;
    sda  = 1;
    if(sda == 1)
         {
         KeyCode |= 0x80;                 // 得到有效的数据位
         }
    }
   WAITFORKEYBOARDPULSE;               // 等待按键发送效验位
   WAITFORKEYBOARDPULSE;               // 等待按键发送终止位
   while(!scl);                        // 等待键盘把时钟线拉高

   return(KeyCode);                    // 返回按键扫描
}

⌨️ 快捷键说明

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