全部博文(321)
分类: 嵌入式
2013-03-07 22:44:46
四、KEY按键:两种模式:查询和中断(宏开关,#ifdef===#elif defined====#endif)
查询:
主要查询状态寄存器是rGPGDAT对应的哪个管脚为0低电平,(按下低电平)则对应是哪一个按键按下。
1.从K1-->EINT8....-->GPGCON=((0<<0)|(0<<6)|(0<<10)|(0<<12)|(0<<14)|(0<<22));输入 功能。由外部控制。
2.查询temp=rGPGDAT,switch(temp&((1<<0)|(1<<3)|(1<<5)|(1<<6)|(1<<7)|(1<<11)))判断 哪个键按下。 //初始状态GPGDAT是高电平//当有键按下则是低电平,取反;
3.获取键值,,去抖动,去重复;去抖动,两次扫描,中间有个小延时,
/*去抖动*/
key1=key_scan(); //第一次扫描键值
Delay_MS(20); //判断是否延时后键是否还是按下
key2=key_scan(); //第二次扫描键值
if(key1 != key2) //如果不相等==不小心按到,很快,只有一下,所以要直接退出。是去抖动的。
return NOKEY; //键是抖动按下的,返回0
/* 去重复*/
newKeyValue = key2; //第一次new=key2 ;第二次键等于键按下的
if(oldKeyValue != newKeyValue)//第一次old=0 ;第二次old=newkey2的第一次
{
oldKeyValue = newKeyValue;
return newKeyValue;
}
return NOKEY;
中断:
1.GPGCON设置为EINT功能= ((2<<0)|(2<<6)|(2<<10)|(2<<12)|(2<<14)|(2<<22));
2.要设置EXTINTn(1-2),一般都设置下降沿触发,再设置中断 SRCPND,INTPND,INTMSK,INTMOD.
3.中断处理函数。
4.获取键值,通过switch(rEINTPEND),因为有中断,EINTPEND外部中断挂起,可以 判断是哪个键按下。之后要清除中断挂起。
rEINTPEND |= ((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));
rSRCPND |= BIT_EINT8_23;
rINTPND |= BIT_EINT8_23;
写1清零。注:EINTPEND要放在INTPND前面,否则会多执行一次switch语句。
会误认为,再一次中断来。
5.中断没有去重复,只有去抖动。
if(keyflag == NOKEY ) //如果没有键按下,则返回0
return NOKEY;
else
{
temp=keyvalue;
keyflag = NOKEY; //全局变量//去抖动,是去按下去后的抖动。
keyvalue = NOKEY; //全局变量
return temp;
}