您的位置:首页 > 其它

轮询方式处理按键

2016-04-07 21:32 162 查看
《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org

按键影响电压,进而影响这个GPIO引脚的输入信号,

此时GPIO配置为输入模式,即可从SOC内部读取该引脚的电平为1还是0.

要先弄清楚各个开关对应的GPIO是哪个,

SW5 GPH0_2

SW6 GPH0_3

SW7 GPH2_0

SW8 GPH2_1

SW9 GPH2_2

SW10 GPH2_3

下面只是GPH0的数据手册部分,其它一样,

GPH0_2对应GPH0CON[2],也就是【11:8】

GPH0_3对应GPH0CON[3],也就是【15:12】

剩下的就不写出来了。



上面是控制寄存器,设置为输入模式后,就该读取数据了,也就是下面。

上面的GPH0CON有【0】到【7】,

下面的GPH0DAT也有【0】到【7】,

读取为1表示高电平,按键弹起,

读取为0表示低电平,按键按下。



轮询方式流程:

1.初始化GPIO模式为input,

2.循环读取GPIO的电平值,然后判断有无按键按下。

#define GPH0CON		0xE0200C00
#define	GPH0DAT		0xE0200C04
#define GPH2CON		0xE0200C40
#define	GPH2DAT		0xE0200C44
#define rGPH0CON	(*(volatile unsigned int*)GPH0CON)
#define	rGPH0DAT	(*(volatile unsigned int*)GPH0DAT)
#define rGPH2CON	(*(volatile unsigned int*)GPH2CON)
#define	rGPH2DAT	(*(volatile unsigned int*)GPH2DAT)

void key_init( void )
{
rGPH0CON &= ~(0xFF<<8);
rGPH2CON &= ~(0xFFFF<<0);

//	如果只是单纯设置这些位为0,直接赋值0就可以,
//	但是为了以免波及无辜,所以这样不会破坏其它位的值
}

void key_polling( void )
{
//依次挨个去读取每个GPIO的值,判断其为1还是0,
//若为1则弹起,为0则按下
while( 1 )
{
if( rGPH0DAT & (1<<2) )
{
led_one();
}
else
{
led_two();
}
}
}
要注意led_one和led_two的内部,不能是无限循环的,

开始用的流水灯代码,结果跳不出来了,

因为进入一个分支后,就一直while(1)循环起来,出不来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: