以下内容转自: 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(unsignedint time) { 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
|