keyread.c

来自「程序是基于STC89C58的点阵屏显示程序」· C语言 代码 · 共 50 行

C
50
字号
#include"reg51.h"
sbit KEY_CLK=P3^6;
sbit KEY_DATA=P3^7;
//PS2每次发送11个数据位分别为起始位+八个数据位+奇偶校验位+停止位
bit keyread(unsigned char *keyborad);


bit keyread(unsigned char *keyborad) 
{ 
  static unsigned char passnumber=0;
  xdata unsigned char key;
  xdata unsigned int wi=0;
  xdata unsigned char i=0;
  EA=0;		 //每次扫描PS2协议时,都要关总中断允许位,PS2通信时不能被中断,否则会读错数据
  KEY_CLK=1;
   while(KEY_CLK){if(++wi>50) { KEY_CLK=0; EA=1;return(0);} } 	 //拉高时钟线,如果键盘有数据要发,要在50微秒内拉低时钟线
   while(!KEY_CLK){if(++wi>500) { KEY_CLK=0;EA=1;return(0);}}	 //跳过始位
 
   for(i=0;i<10;i++)
   { while(KEY_CLK){if(++wi>500) { KEY_CLK=0;EA=1; return(0);  }}  //return(0);
     if(i>=0&&i<=7)											 //只接收八位数据位,跳过奇偶校验位和停止位
     { key=key>>1;
       if(KEY_DATA)       key=key|0x80;}
       while(!KEY_CLK)
	   {
	   		if(++wi>500) { KEY_CLK=0;EA=1;return(0);}
	   }
   }
     
 
    KEY_CLK=0;EA=1;	 //拉低时钟线,抑制键盘发送数据,再开总中断允许位
	if(key==0xE1)	 //第三类键
	  passnumber=passnumber+2;  
	if(key==0xE0)	 //第二类键
      ++passnumber;   				  //这里有passnumber是为了只接后一组数据中的第一个,屏蔽每两个
	if(key==0xF0)
         passnumber=passnumber+2; 	    
    if(passnumber==0)
	 { *keyborad=key;
	   return(1);		 //如果成功接收一个键盘通码,就把flagre置1
	 }
	else 
	 { 
	 	--passnumber;
		return(0);

	 }
}

⌨️ 快捷键说明

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