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

📄 keyread.c

📁 程序是基于STC89C58的点阵屏显示程序
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -