还是一样,我们先来看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(); }
浙公网安备 33010602011771号