在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口空按键的使用方法。