/**********************************************************************************************
KEYS.c file
按键处理程序
作者:Computer-lov
建立日期:2006-4-11
修改日期:2006-4-12
版本:V1.0
版权所有,盗版必究。
任何技术问题可到我的博客上留言: http://computer00.21ic.org
Copyright(C) Computer-lov 2006-2016
All rights reserved
**********************************************************************************************/
#include "KEYS.h"
#include <ADuC7027.H>
KEYBoard Key;
/*********************************************************************************************/
void KEYBoardInit(void)
{
GP0CON &= ~(0x00330000); //将按键对对应的IO口设置为GPIO口
GP1CON &= ~(0x00330000);
GP0DAT &= ~(0x30000000); //将按键对应的IO设置为输入口
GP1DAT &= ~(0x30000000);
GP0PAR &= ~(0x00110000); //打开按键对应的IO口的上拉电阻
GP1PAR &= ~(0x00110000);
Key.Value=0; //Key初始化
Key.OldValue=0;
Key.NewValue=0;
Key.PressedTime=0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************************************/
void ScanKey(void) //键盘扫描
{
if(Key.Value)return; //如果上次按键还未处理,则直接返回,不扫描新的按键
if(KEY1IN && KEY2IN && KEY3IN && KEY4IN) //如果输入全部是高,则按键处于释放状态
{
if(!(Key.OldValue)) //如果上次无按键按下
{
return; //返回
}
else //如果上次有按键按下
{
if(Key.PressedTime>100) //按键时间超过一秒,长按键码
{
Key.Value=Key.OldValue+0x80; //长按键码等于普通按键码加0x80
}
else if(Key.PressedTime>1)
{
Key.Value=Key.OldValue; //按键值
}
Key.OldValue=0;
}
return;
}
else //按键按下
{
Key.NewValue=0;
if(!KEY1IN)Key.NewValue=KEY1; //KEY1键按下
if(!KEY2IN)Key.NewValue=KEY2; //KEY2键按下
if(!KEY3IN)Key.NewValue=KEY3; //KEY3键按下
if(!KEY4IN)Key.NewValue=KEY4; //KEY4键按下
if(Key.NewValue==Key.OldValue) //如果连续两次扫描到一样的键,即按键按下长于10ms
{
if(Key.PressedTime>200) //如果按键按下超过2s
{
Key.PressedTime-=4; //则自动按键。相当于每隔50ms按一次
Key.Value=Key.NewValue;
return;
}
else
{
Key.PressedTime++; //按键按下计时加一
}
}
else
{
Key.PressedTime=0; //如果本次按下跟上次按下不一样,则按键按下时间清零
}
Key.OldValue=Key.NewValue; //保存本次按键值
}
}
///////////////////////////////////////////////////////////////////////////////////////////////