转:OK6410裸机开发之KEY

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

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

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

 

[cpp] view plaincopy
 
  1. *rGPNCON  = *rGPNCON & (0xffffffff<<(2*6));/*GPNCON[11:0]=0*/  

下面主要看看扫描按键的代码:

 

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

好了,贴上源代码:

 

[cpp] view plaincopy
 
  1. /* 
  2.  * key.c 
  3.  * 
  4.  *  Created on: 2013-1-22 
  5.  *      Author: HackSnow 
  6.  */  
  7.   
  8. #if 0  
  9. /*下面这三段代码在用eclipse调试的时候会提示“No symbol "***" in current context.” 
  10.  *并且调试的时候LED会不显示,但换另一种方式写的话可以解决这个问题。 
  11.  *目前不知道具体什么原因,知道的,麻烦告诉下, 
  12.  *谢了! 
  13.  */  
  14. /*KEY的相关寄存器*/  
  15. #define rGPNCON          (*(volatile unsigned *)(0x7F008830))  
  16. #define rGPNDAT          (*(volatile unsigned *)(0x7F008834))  
  17. #define rGPNPUD          (*(volatile unsigned *)(0x7F008838))  
  18. /*BEEP的相关寄存器*/  
  19. #define rGPFCON          (*(volatile unsigned *)(0x7F0080A0))  
  20. #define rGPFDAT          (*(volatile unsigned *)(0x7F0080A4))  
  21. #define rGPFPUD          (*(volatile unsigned *)(0x7F0080A8))  
  22. /*LED的相关寄存器*/  
  23. #define rGPMCON          (*(volatile unsigned *)(0x7F008820))  
  24. #define rGPMDAT          (*(volatile unsigned *)(0x7F008824))  
  25. #define rGPMPUD          (*(volatile unsigned *)(0x7F008828))  
  26. #endif  
  27.   
  28. volatile unsigned long *rGPNCON = (volatile unsigned long *)0x7F008830;  
  29. volatile unsigned long *rGPNDAT = (volatile unsigned long *)0x7F008834;  
  30. volatile unsigned long *rGPNPUD = (volatile unsigned long *)0x7F008838;  
  31.   
  32. volatile unsigned long *rGPFCON = (volatile unsigned long *)0x7F0080A0;  
  33. volatile unsigned long *rGPFDAT = (volatile unsigned long *)0x7F0080A4;  
  34. volatile unsigned long *rGPFPUD = (volatile unsigned long *)0x7F0080A8;  
  35.   
  36. volatile unsigned long *rGPMCON = (volatile unsigned long *)0x7F008820;  
  37. volatile unsigned long *rGPMDAT = (volatile unsigned long *)0x7F008824;  
  38. volatile unsigned long *rGPMPUD = (volatile unsigned long *)0x7F008828;  
  39.   
  40. void msDelay(int time)  
  41. {  
  42.         volatile unsigned int i,j;  
  43.         for(i = 0; i < 2000000; i++)  
  44.             for(j=0; j<time; j++);  
  45. }  
  46.   
  47. void GPIO_InitKey(void)  
  48. {  
  49.     *rGPNCON  = *rGPNCON & (0xffffffff<<(2*6));/*GPNCON[11:0]=0*/  
  50. }  
  51.   
  52. void GPIO_InitBeep(void)  
  53. {  
  54.     *rGPFCON  = *rGPFCON & (~(0x1<<(31)));/*GPFCON[31]=0*/  
  55.     *rGPFCON  = *rGPFCON | (0x1<<(2*15));/*GPFCON[30]=1*/  
  56.     *rGPFPUD  = *rGPFPUD & (~(0x3<<(2*15)));  
  57.     *rGPFDAT  = *rGPFDAT & 0x7fff;  
  58. }  
  59.   
  60. void GPIO_InitLED(void)  
  61. {  
  62.     *rGPMCON = *rGPMCON | 0x11111;  
  63.     *rGPMPUD  = 0x00;  
  64.     *rGPMDAT  = 0X1F;  
  65. }  
  66.   
  67. void GPIO_Init(void)  
  68. {  
  69.     GPIO_InitKey();  
  70.     GPIO_InitBeep();  
  71.     GPIO_InitLED();  
  72. }  
  73.   
  74. void BeepOn(void)  
  75. {  
  76.     *rGPFDAT = *rGPFDAT | 0x8000;   /*GPF15置1*/  
  77. }  
  78.   
  79. void BeepOff(void)  
  80. {  
  81.     *rGPFDAT = *rGPFDAT & 0x7fff;   /*GPF15置0*/  
  82. }  
  83.   
  84. void KeyTest(void)  
  85. {  
  86.     while(1)  
  87.     {  
  88.         switch(*rGPNDAT & 0x3f)  
  89.         {  
  90.         case 0x3E://S2按下  
  91.             *rGPMDAT = 0x0A;  
  92.             break;  
  93.         case 0x3D://S3按下  
  94.             *rGPMDAT = 0x05;  
  95.             break;  
  96.         case 0x3B://S4按下  
  97.             BeepOn();  
  98.             break;  
  99.         case 0x37://S5按下  
  100.             BeepOff();  
  101.             break;  
  102.         case 0x2F://S6按下  
  103.             BeepOn();  
  104.             msDelay(10);  
  105.             BeepOff();  
  106.             break;  
  107.         case 0x1F://S7按下  
  108.             break;  
  109.         }  
  110.     }  
  111. }  
  112. void main(void)  
  113. {  
  114.     GPIO_Init();  
  115.     KeyTest();  
  116. }  

 

原文地址:http://blog.csdn.net/xiaopang059/article/details/8545466

posted @ 2013-03-13 00:11  heyb7  阅读(118)  评论(0)    收藏  举报