keyscan.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:3k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /**************************************************************
  2. 4*4 Key Scan
  3. **************************************************************/
  4. #include "def.h"
  5. #include "option.h"
  6. #include "2440addr.h"
  7. #include "2440lib.h"
  8. #include "2440slib.h" 
  9. /******************************************************************************
  10. 1X6 矩阵键盘
  11. 六个输入引脚: EINT8 -----( GPG0  )
  12. EINT11 -----( GPG3  )
  13. EINT13-----( GPG5  )
  14. EINT14-----( GPG6 )
  15. EINT15-----( GPG7 )
  16. EINT19-----( GPG11 )
  17. ******************************************************************************/
  18. U8 Key_Scan( void )
  19. {
  20. Delay( 80 ) ;
  21. if(      (rGPGDAT&(1<< 0)) == 0 )
  22. return 1 ;
  23. else if( (rGPGDAT&(1<< 3)) == 0 )
  24. return 2;
  25. else if( (rGPGDAT&(1<< 5)) == 0 )
  26. return 3 ;
  27. else if( (rGPGDAT&(1<< 6)) == 0 )
  28. return 4 ;
  29. else if( (rGPGDAT&(1<< 7)) == 0 )
  30. return 5 ;
  31. else if( (rGPGDAT&(1<<11)) == 0 )
  32. return 6 ;
  33. else
  34. return 0xff;
  35. }
  36. static void __irq Key_ISR(void)
  37. {
  38. U8 key;
  39. U32 r;
  40. EnterCritical(&r);
  41. if(rINTPND==BIT_EINT8_23) {
  42. ClearPending(BIT_EINT8_23);
  43. if(rEINTPEND&(1<<8)) {
  44. //Uart_Printf("eint11n");
  45. rEINTPEND |= 1<< 8;
  46. }
  47. if(rEINTPEND&(1<<11)) {
  48. //Uart_Printf("eint11n");
  49. rEINTPEND |= 1<< 11;
  50. }
  51. if(rEINTPEND&(1<<13)) {
  52. //Uart_Printf("eint11n");
  53. rEINTPEND |= 1<< 13;
  54. }
  55. if(rEINTPEND&(1<<14)) {
  56. //Uart_Printf("eint11n");
  57. rEINTPEND |= 1<< 14;
  58. }
  59. if(rEINTPEND&(1<<15)) {
  60. //Uart_Printf("eint11n");
  61. rEINTPEND |= 1<< 15;
  62. }
  63. if(rEINTPEND&(1<<19)) {
  64. // Uart_Printf("eint19n");
  65. rEINTPEND |= 1<< 19;
  66. }
  67. }
  68. key=Key_Scan();
  69. if( key == 0xff )
  70. Uart_Printf( "Interrupt occur... Key is released!n") ;
  71. else
  72. Uart_Printf( "Interrupt occur... K%d is pressed!n", key) ;
  73. ExitCritical(&r);
  74. }
  75. void KeyScan_Test(void)
  76. {
  77. Uart_Printf("nKey Scan Test, press ESC key to exit !n");
  78. rGPGCON = rGPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |
  79.  ((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14)) ; //GPG11,3 set EINT
  80. rEXTINT1 &= ~(7|(7<<0));
  81. rEXTINT1 |= (0|(0<<0)); //set eint8 falling edge int
  82. rEXTINT1 &= ~(7<<12);
  83. rEXTINT1 |= (0<<12); //set eint11 falling edge int
  84. rEXTINT1 &= ~(7<<20);
  85. rEXTINT1 |= (0<<20); //set eint13 falling edge int
  86. rEXTINT1 &= ~(7<<24);
  87. rEXTINT1 |= (0<<24); //set eint14 falling edge int
  88. rEXTINT1 &= ~(7<<28);
  89. rEXTINT1 |= (0<<28); //set eint15 falling edge int
  90. rEXTINT2 &= ~(0xf<<12);
  91. rEXTINT2 |= (0<<12); //set eint19 falling edge int
  92. rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19); //clear eint 11,19
  93. rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //enable eint11,19
  94. ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
  95. pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = (U32)Key_ISR;
  96. EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
  97.  while( Uart_GetKey() != ESC_KEY ) ;
  98.  DisableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
  99. }