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

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

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

 

  1. *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();
}

 

posted on 2013-02-15 15:14  爱哎唉  阅读(210)  评论(0)    收藏  举报