Chinaunix首页 | 论坛 | 博客
  • 博客访问: 815626
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: 嵌入式

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;

}


阅读(1561) | 评论(0) | 转发(0) |
0

上一篇:中断与时钟

下一篇:4-裸机中断原理

给主人留下些什么吧!~~