mini2440之GPIO控制按键的方法

     在mini2440里控制按键方法有使用终端和只用GPIO口控制,初学者在接触时不免有些陌生,下面将简单介绍如何利用GPIO口控制按键。

首先建立一个(.c)的源文件和(.h)的头文件。简单介绍按键模块的开发过程:

1、找到该设备-à2、在原理图上找该设备-à 3、分析该设备的特点

K1—没按下,EINT8信号为高;按下,EINT8信号为低

K2—没按下,EINT11信号为高;按下,EINT11信号为低

2、找出该信号接到CPU的哪里。---在原理图上,名字相同的信号代表连通。

K1---EINT8----》GPG0

K2---EINT11----》GPG3

3、找出该引脚的控制寄存器

K2 K1---GPGCON [7:6,1:0]à00 00  输入功能

读GPGDAT 对应的位是0—》按键按下;对应的位是1—》按键没按下

GPGUP 不使能

4、封装函数。

这个功能是利用按键控制led灯的亮灭,key1~key4控制led1~led4,key5控制灯全亮,key6控制灯全灭:

/************************************************* 

      Copyright (C),    2016-2020, xmetc Co., Ltd. 

      File name    :    key

      Author       :	lifngguo
      
      Version      :	V1.0
              
      Date         :  	2016-8-5
      
      Description  :  	keys control leds on/off
        
      Others       :    none
      
      History	   :     
                     
        1. Date	   :    2016-8-4

          Author   : 	lifngguo

*************************************************/

#include "2440addr.h"
#include "key.h"

extern void Delay_MS( unsigned int time);	//延迟


void key_init(void)
{
	volatile unsigned int temp;
	temp = rGPGCON;		//配置按键GPGCON
	temp &= ~((3<<22) | (3<<14) | (3<<12) | (3<<10) | (3<<6) | (3<<0));	//清零  00为输入
	rGPGCON = temp;		//回写
	
	temp = rGPGUP;		//上拉电阻禁止
	temp |= ((1<<11) | (1<<7) | (1<<6) | (1<<5) | (1<<3) | (1<<0));		//1
	rGPGUP = temp;
}


int key_scan(void)		//扫描按键
{
	int key = NO_KEY_PRESS;
    unsigned int temp;
	temp = ~rGPGDAT;   //按键按下--0,取反--未按下为0
	temp = temp & ((1<<11) | (1<<7) | (1<<6) | (1<<5) | (1<<3) | (1<<0));	//temp的值按键位都是1
	switch(temp)
	{
		case 1:
		{
			key = KEY1;
			break;
		}
		case 1<<3:
		{
			key = KEY2;
			break;
		}
		case 1<<5:
		{
			key = KEY3;
			break;
		}
		case 1<<6:
		{
			key = KEY4;
			break;
		}
		case 1<<7:
		{
			key = KEY5;
			break;
		}
		case 1<<11:
		{
			key = KEY6;
			break;
		}
		default:
		{
			key = NO_KEY_PRESS;
			break;
		}
	}
	return key;
}

int return_key_num(void)		//功能:去抖  去重复
{
	int key = NO_KEY_PRESS;
	if((key = key_scan()) != NO_KEY_PRESS)		//电平拉低
	{
		Delay_MS(1);		//去抖
		if((key = key_scan()) != NO_KEY_PRESS)	//有按键按下		
		{
			while(key_scan() != NO_KEY_PRESS);	//按键没有弹起  去重复
			return key;		//返回按键值
		}
	}
}
在使用按键的时候要注意去抖动和去重复。

在头文件中声明一些定义和一些使用到的函数:

/************************************************* 

      Copyright (C),    2016-2020, xmetc Co., Ltd. 

      File name    :    key

      Author       :	lifngguo
      
      Version      :	V1.0
              
      Date         :  	2016-8-5
      
      Description  :  	define key number and declare functions
        
      Others       :    none
      
      History	   :     
                     
        1. Date	   :    2016-8-5
          Author   : 	lifngguo

*************************************************/

#ifndef _KEY_H_
#define _KEY_H_

extern void key_init(void);
extern int key_scan(void);
extern int return_key_num(void);

#define NO_KEY_PRESS 0
#define KEY_PRESS 1

#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4
#define KEY5 5
#define KEY6 6

#endif
/*******************************结束**************/
#ifndef _KEY_H_
#define _KEY_H_
<pre name="code" class="cpp">#endif
这三句代码是防止头文件被重复定义,宏展开的时候只要展开一次就可以了

 
这个就是简单的GPIO口空按键的使用方法。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值