📄 keyscan.c
字号:
/**************************************************************
Key Scan
**************************************************************/
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
U8 Key_Scan( void )
{
if ( (rGPFDAT&(1<< 0)) == 0 ) return 1 ;
else if( (rGPFDAT&(1<< 2)) == 0 ) return 2 ;
else if( (rGPFDAT&(1<< 3)) == 0 ) return 3 ;
else if( (rGPGDAT&(1<< 0)) == 0 ) return 4 ;
else return 0xff;
}
static void __irq Key_ISR(void)
{
U8 key;
U32 r;
EnterCritical(&r);
if(rINTPND==BIT_EINT8_23) {
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8)) {
rEINTPEND |= 1<< 8;
}
}
if(rINTPND==BIT_EINT0) {
ClearPending(BIT_EINT0);
}
if(rINTPND==BIT_EINT2) {
ClearPending(BIT_EINT2);
}
if(rINTPND==BIT_EINT3) {
ClearPending(BIT_EINT3);
}
key=Key_Scan();
if( key != 0xff )
Uart_Printf( "Interrupt occur... K%d is pressed!\n", key ) ;
ExitCritical(&r);
}
void KeyScan_Test(void)
{
Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");
rGPGCON = rGPGCON & (~3) | 2 ; //GPG0 set EINT
rGPFCON = rGPFCON & (~((3<<6)|(3<<4)|(3<<0))) | ((2<<6)|(2<<4)|(2<<0)) ; //GPF3,2,0 set EINT
rEXTINT0 &= ~(7|(7<<8)|(7<<12));
rEXTINT0 |= (2|(2<<8)|(2<<12)); //set eint0,2,3 falling edge int
rEXTINT1 &= (~7);
rEXTINT1 |= 2; //set eint8 falling edge int
rEINTPEND |= (1<<8); //clear eint8
rEINTMASK &= (~(1<<8)); //enable eint8
ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT8_23);
pISR_EINT0 = pISR_EINT2 = pISR_EINT3 = pISR_EINT8_23 = (U32)Key_ISR;
EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT8_23);
while( Uart_GetKey() != ESC_KEY ) ;
DisableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -