keyboard.c
上传用户:jinguanrq
上传日期:2022-06-04
资源大小:724k
文件大小:5k
源码类别:

uCOS

开发平台:

C/C++

  1. /*********************************************************************************************
  2. * File: keyboard.c
  3. * Author: embest
  4. * Desc: keyboard source code
  5. * History:
  6. *********************************************************************************************/
  7. /*--- include files ---*/
  8. #include "44b.h"
  9. #include "44blib.h"
  10. #include "8led.h"
  11. #include "keyboard.h"
  12. #include "includes.h"               /* uC/OS interface */
  13. //#include "Sems.h"               /* Semaphore */
  14. /*--- global variables ---*/
  15. /* keyboard control address */
  16. volatile unsigned char *keyboard_base = (unsigned char *)0x06000000;
  17. /*--- function declare ---*/
  18. void init_keyboard(void);
  19. void close_keyboard(void);
  20. void KeyboardInt(void);
  21. void Eint4567Isr(void);
  22. /*--- function code ---*/
  23. /*********************************************************************************************
  24. * name: init_keyboard
  25. * func: init keyboard interrupt
  26. * para: none
  27. * ret: none
  28. * modify:
  29. * comment:
  30. ********************************************************************************************/
  31. void init_keyboard()
  32. {
  33. /* enable interrupt */
  34. rINTMOD = 0x0;
  35. rINTCON = 0x1;
  36. /* set EINT1 interrupt handler */
  37. rINTMSK =~(BIT_GLOBAL|BIT_EINT1|BIT_EINT4567);
  38.     pISR_EINT1 = (int)KeyboardInt;
  39.     pISR_EINT4567 = (int)Eint4567Isr;
  40.     
  41.     /* PORT G */
  42.     rPCONG  = 0xffff; // EINT7~0
  43. rPUPG   = 0x0; // pull up enable     
  44. rEXTINT = rEXTINT|0x20; // EINT1 falling edge mode
  45. rI_ISPC = BIT_EINT1|BIT_EINT4567; // clear pending bit
  46. rEXTINTPND = 0xf; // clear EXTINTPND reg
  47. }
  48. /*********************************************************************************************
  49. * name: close_keyboard
  50. * func: close keyboard interrupt
  51. * para: none
  52. * ret: none
  53. * modify:
  54. * comment:
  55. ********************************************************************************************/
  56. void close_keyboard()
  57. {
  58. pISR_EINT1 = NULL;
  59. pISR_EINT4567 = NULL;
  60. /* Mask interrupt */
  61. rINTMSK = rINTMSK | BIT_EINT1 | BIT_EINT4567;
  62. }
  63. /*********************************************************************************************
  64. * name: KeyboardInt
  65. * func: keyboard interrupt handler function
  66. * para: none
  67. * ret: none
  68. * modify:
  69. * comment:
  70. ********************************************************************************************/
  71. void KeyboardInt(void)
  72. {
  73. int value;
  74. rI_ISPC = BIT_EINT1; // clear pending bit
  75. rEXTINTPND = 0xf; // clear EXTINTPND reg
  76. value = key_read();
  77. if(value > -1)
  78. Digit_Led_Symbol(value);
  79. rI_ISPC = BIT_EINT1; // clear pending bit
  80. rINTCON = 0x1;
  81. }
  82. /*********************************************************************************************
  83. * name: key_read
  84. * func: read key value
  85. * para: none
  86. * ret: key value, -1 -- error
  87. * modify:
  88. * comment:
  89. ********************************************************************************************/
  90.  int key_read()
  91. {
  92. int value;
  93. char temp;
  94. /* read line 1 */
  95. temp = *(keyboard_base+0xfd);
  96. /* not 0xF mean key down */
  97. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  98. {
  99. if( (temp&0x1) == 0 )
  100. value = 3;
  101. else if( (temp&0x2) == 0 )
  102. value = 2;
  103. else if( (temp&0x4) == 0 )
  104. value = 1;
  105. else if( (temp&0x8) == 0 )
  106. value = 0;
  107. return value;
  108. }
  109. /* read line 2 */
  110. temp = *(keyboard_base+0xfb);
  111. /* not 0xF mean key down */
  112. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  113. {
  114. if( (temp&0x1) == 0 )
  115. value = 7;
  116. else if( (temp&0x2) == 0 )
  117. value = 6;
  118. else if( (temp&0x4) == 0 )
  119. value = 5;
  120. else if( (temp&0x8) == 0 )
  121. value = 4;
  122. return value;
  123. }
  124. /* read line 3 */
  125. temp = *(keyboard_base+0xf7);
  126. /* not 0xF mean key down */
  127. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  128. {
  129. if( (temp&0x1) == 0 )
  130. value = 0xb;
  131. else if( (temp&0x2) == 0 )
  132. value = 0xa;
  133. else if( (temp&0x4) == 0 )
  134. value = 9;
  135. else if( (temp&0x8) == 0 )
  136. value = 8;
  137. return value;
  138. }
  139. /* read line 4 */
  140. temp = *(keyboard_base+0xef);
  141. /* not 0xF mean key down */
  142. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  143. {
  144. if( (temp&0x1) == 0 )
  145. value = 0xf;
  146. else if( (temp&0x2) == 0 )
  147. value = 0xe;
  148. else if( (temp&0x4) == 0 )
  149. value = 0xd;
  150. else if( (temp&0x8) == 0 )
  151. value = 0xc;
  152. return value;
  153. }
  154. return -1;
  155. }
  156. /*********************************************************************************************
  157. * name: Eint4567Isr
  158. * func:
  159. * para: none
  160. * ret: none
  161. * modify:
  162. * comment:
  163. *********************************************************************************************/
  164. void Eint4567Isr(void)
  165. {
  166. // unsigned char which_int;
  167. //    which_int  = rEXTINTPND;
  168.     rEXTINTPND = 0xf; //clear EXTINTPND reg.
  169.     rI_ISPC    = BIT_EINT4567; //clear pending_bit
  170.     
  171.     Uart_Printf("n SB2 or SB3 had pressed and light LED.n");
  172. /*    
  173.     if(which_int == 4) // SB2
  174.     {
  175.      Led_Display(0x0);
  176.      Led_Display(0x1);
  177.     }
  178.     else if(which_int == 8) // SB3
  179.     {
  180.      Led_Display(0x0);
  181.      Led_Display(0x2);
  182.     }
  183. */
  184. }