还是一样,我们先来看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();
}
由于前几天在调试的时候遇到点问题,所以没有及时更新博客,抱歉!