转: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();
- }
原文地址:http://blog.csdn.net/xiaopang059/article/details/8545466

浙公网安备 33010602011771号