OK6410裸机开发之KEY

还是一样,我们先来看KEY部分的原理图:

由此图我们可以知道OK6410开发板上的KEY连接的是GPN的管脚,那么接下来我们具体看看GPN的相关寄存器:

这里我们只需要设置GPN0-5为输入即可。

*rGPNCON  = *rGPNCON & (0xffffffff<<(2*6));/*GPNCON[11:0]=0*/
下面主要看看扫描按键的代码:

从第一张原理图可以看出,当一个按键按下时,引脚会变成低电平。所以,我们主要判断(*rGPNDAT & 0x3f)是否为0x3f,如果是0x3f,那么就说明没有按键按下。

好了,贴上源代码:

/*
 * key.c
 *
 *  Created on: 2013-1-22
 *      Author: HackSnow
 */

#if 0
/*下面这三段代码在用eclipse调试的时候会提示“No symbol "***" in current context.”
 *并且调试的时候LED会不显示,但换另一种方式写的话可以解决这个问题。
 *目前不知道具体什么原因,知道的,麻烦告诉下,
 *谢了!
 */
/*KEY的相关寄存器*/
#define rGPNCON          (*(volatile unsigned *)(0x7F008830))
#define rGPNDAT          (*(volatile unsigned *)(0x7F008834))
#define rGPNPUD          (*(volatile unsigned *)(0x7F008838))
/*BEEP的相关寄存器*/
#define rGPFCON          (*(volatile unsigned *)(0x7F0080A0))
#define rGPFDAT          (*(volatile unsigned *)(0x7F0080A4))
#define rGPFPUD          (*(volatile unsigned *)(0x7F0080A8))
/*LED的相关寄存器*/
#define rGPMCON          (*(volatile unsigned *)(0x7F008820))
#define rGPMDAT          (*(volatile unsigned *)(0x7F008824))
#define rGPMPUD          (*(volatile unsigned *)(0x7F008828))
#endif

volatile unsigned long *rGPNCON = (volatile unsigned long *)0x7F008830;
volatile unsigned long *rGPNDAT = (volatile unsigned long *)0x7F008834;
volatile unsigned long *rGPNPUD = (volatile unsigned long *)0x7F008838;

volatile unsigned long *rGPFCON = (volatile unsigned long *)0x7F0080A0;
volatile unsigned long *rGPFDAT = (volatile unsigned long *)0x7F0080A4;
volatile unsigned long *rGPFPUD = (volatile unsigned long *)0x7F0080A8;

volatile unsigned long *rGPMCON = (volatile unsigned long *)0x7F008820;
volatile unsigned long *rGPMDAT = (volatile unsigned long *)0x7F008824;
volatile unsigned long *rGPMPUD = (volatile unsigned long *)0x7F008828;

void msDelay(int time)
{
    	volatile unsigned int i,j;
    	for(i = 0; i < 2000000; i++)
    		for(j=0; j<time; j++);
}

void GPIO_InitKey(void)
{
	*rGPNCON  = *rGPNCON & (0xffffffff<<(2*6));/*GPNCON[11:0]=0*/
}

void GPIO_InitBeep(void)
{
	*rGPFCON  = *rGPFCON & (~(0x1<<(31)));/*GPFCON[31]=0*/
	*rGPFCON  = *rGPFCON | (0x1<<(2*15));/*GPFCON[30]=1*/
	*rGPFPUD  = *rGPFPUD & (~(0x3<<(2*15)));
	*rGPFDAT  = *rGPFDAT & 0x7fff;
}

void GPIO_InitLED(void)
{
	*rGPMCON = *rGPMCON | 0x11111;
	*rGPMPUD  = 0x00;
	*rGPMDAT  = 0X1F;
}

void GPIO_Init(void)
{
	GPIO_InitKey();
	GPIO_InitBeep();
	GPIO_InitLED();
}

void BeepOn(void)
{
	*rGPFDAT = *rGPFDAT | 0x8000;	/*GPF15置1*/
}

void BeepOff(void)
{
	*rGPFDAT = *rGPFDAT & 0x7fff;	/*GPF15置0*/
}

void KeyTest(void)
{
	while(1)
	{
		switch(*rGPNDAT & 0x3f)
		{
		case 0x3E://S2按下
			*rGPMDAT = 0x0A;
			break;
		case 0x3D://S3按下
			*rGPMDAT = 0x05;
			break;
		case 0x3B://S4按下
			BeepOn();
			break;
		case 0x37://S5按下
			BeepOff();
			break;
		case 0x2F://S6按下
			BeepOn();
			msDelay(10);
			BeepOff();
			break;
		case 0x1F://S7按下
			break;
		}
	}
}
void main(void)
{
	GPIO_Init();
	KeyTest();
}
由于前几天在调试的时候遇到点问题,所以没有及时更新博客,抱歉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值