/**********************************************
名称: ReadKey
功能: 4*4键盘扫描,不支持组合键
输入: 无
输出: 有键按下返回相应的键号(0x00-0x0f);
没键按下返回0xff。
**********************************************/
#define INT8U unsigned char
INT8U KeyCode(void);
void DelayNms(INT8U Tick);
sfr KeyPort="0x80"; //P0
INT8U ReadKey(void)
{
KeyPort="0xf0";
if(KeyPort!=0xf0)
{
DelayNms(20); //去抖动
if(KeyPort!=0xf0)
{
KeyPort =0xfe;
while((KeyPort&0x10)!=0) //行扫描循环
{
if((KeyPort&0x10)==0) //列1
return(KeyCode());
else if((KeyPort&0x20)==0)//列2
return(KeyCode()+1);
else if((KeyPort&0x40)==0)//列3
return(KeyCode()+2);
else if((KeyPort&0x80)==0)//列4
return(KeyCode()+3);
KeyPort=(KeyPort<<1)+1; //下一行
}
}
}
return(0xff);
}
/**********************************************/
INT8U KeyCode(void)
{
if((KeyPort&0x0f)!=0x07)
return(~(KeyPort&0x0f)>>1<<2);//return 0,4,8
else
return(~(KeyPort&0x0f)+4); //return c
}
/**********************************************/
void DelayNms(INT8U Tick)
{
for(;Tick>0;Tick--)
;//延时1ms省略
}
文章评论(0条评论)
登录后参与讨论