以下内容转自: http://weibo.com/p/1001603917155212107692
像玩51单片机一样玩NanoPi2——按键检测
直接贴上main.c文件代码
/*像玩51单片机一样玩NanoPi2
按键检测实验
----by DikaVimenkey
功能:两个按键,每个按键控制一个LED
两个按键,一个LED灯,一个板载UserLED
UserLED GPIOB12
LED 接 GPIOB28
按键1接 GPIOB29
按键2接 GPIOB30
VCC的接口只有2个,再加上扩展板子上的一个,所以只接了三个*/
#include"gpio.h"
/*延时函数,没有确定的时间*/
void delay(unsignedinttime)
{
while(time--);
}
void main(void)
{
/*初始化GPIOB*/
/*设置端口复用*/
GPIOBALTFN0 &= ~(0x3<<24);//清位,GPIOB12
GPIOBALTFN0 |= (0x2<<24);//置位,GPIOB12为GPIO模式
GPIOBALTFN1 &=~((0X3<<24)|(0x3<<26)|(0x3<<28));//清位,GPIOB28、29、30
GPIOBALTFN1 |=((1<<24)|(1<<26)|(1<<28));//置位,
//设置GPIOB28、29、30为GPIO模式
/*设置GPIOB模式*/
GPIOBOUTENB &=~(0x3<<29); //设置GPIOB12为输出模式=1
GPIOBOUTENB |=((1<<28)|(1<<12));//设置GPIOB28为输出模式=1
//设置GPIOB29为输入模式=0
//设置GPIOB30为输入模式=0
/*预置GPIOB状态*/
GPIOBOUT &=~((1<<28)|(0<<12));//先置GPIOB28为低电平,让LED灭,
//GPIOB12为高,UserLED灭
/*初始化检测输入的寄存器*/
GPIOBDETMODE1 &=~((0X3<<26)|(0x3<<28));//GPIOB29设置为低电平检测
//GPIOB30设置为低电平检测
GPIOBDETMODEEX &=~((1<<29)|(1<<30));//GPIOB29、30扩展位要置零
GPIOBINTENB &=~((1<<29)|(1<<30));//关闭检测中断
/*以上三行代码可以不写,如果需要按键中断的时候,就要写*/
/*初始化完毕*/
while(1)
{
/*UserLED*/
if((GPIOBPAD& (1<<29)) ==(1<<29))
{
delay(3000);
if((GPIOBPAD& (1<<29)) == (1<<29))
{
GPIOBOUT|= (1<<12);
}
delay(3000);
}
else
{
GPIOBOUT&= ~(1<<12);
}
/*LED*/
if((GPIOBPAD& (1<<30)) ==(1<<30))
{
delay(3000);
if((GPIOBPAD& (1<<30)) == (1<<30))
{
GPIOBOUT&= ~(1<<28);
}
delay(3000);
}
else
{
GPIOBOUT|= (1<<28);
}
}
}
Main.c代码结束
程序注释已经很明白,不再过多解释。
如何GPIO输入呢?在处理器的数据手册中已经写明。
在使用GPIO输入的时候,需要先设置GPIO的端口复用为GPIO模式,然后在GPIOxOUTENB寄存器中设置GPIO为输入模式。这样才能用。
GPIOxDETMODE0/1的用途是设置端口检测模式,高电平/低电平/上升沿/下降沿。
GPIOxDET是中断标志位
GPIOxPAD是端口的状态,通过读取它来检测是高还是低电平
GPIOxINTENB是输入中断使能寄存器。
感谢 倚海听风
解决了编译代码链接时的报错。
将start.s文件的内容修改如下
.text
.global _start
_start:
bstart
.word0x00000000
.word0x00000000
.word0x00000000
.word0x00000000
.word0x00000000
.word0x00000000
.word0x00000000
start:
bmain
|