轮询方式处理按键

《朱老师物联网大讲堂》学习笔记

学习地址: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】

剩下的就不写出来了。

轮询方式处理按键_第1张图片


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


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

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

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

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

轮询方式处理按键_第2张图片

轮询方式流程:

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)循环起来,出不来了。



你可能感兴趣的:(ARM裸机)