📄 keyscan.c
字号:
#include "2410addr.h"
#include "2410lib.h"
#include "timer.h"
/******************************************************************************
4X4 矩阵键盘
四个输入引脚: EINT0 -----( GPF0 )
EINT2 -----( GPF2 )
EINT11-----( GPG3 )
EINT19-----( GPG11 )
四个输出引脚: KEYSCAN0---( GPE11 )
KEYSCAN1---( GPG6 )
KEYSCAN2---( GPE13 )
KEYSCAN3---( GPG2 )
******************************************************************************/
U8 Key_Scan( void )
{
Delay( 100 ) ;
//扫描键盘第4列 K16、K15、K14、K13
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (1<<6) | (0<<2) ; //GPG6 output 1;GPG2 output 0
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (1<<11) ; //GPE13 output 1;GPE11 output 1
if( (rGPFDAT&(1<< 0)) == 0 ) return 10 ;
else if( (rGPFDAT&(1<< 2)) == 0 ) return 12 ;
else if( (rGPGDAT&(1<< 3)) == 0 ) return 14 ;
else if( (rGPGDAT&(1<<11)) == 0 ) return 16 ;
//扫描键盘第2列 K11、K8、K5、K2
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (0<<6) | (1<<2) ; //GPG6 output 0;GPG2 output 1
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (1<<11) ; //GPE13 output 1;GPE11 output 1
if( (rGPFDAT&(1<< 0)) == 0 ) return 2 ;
else if( (rGPFDAT&(1<< 2)) == 0 ) return 4 ;
else if( (rGPGDAT&(1<< 3)) == 0 ) return 6 ;
else if( (rGPGDAT&(1<<11)) == 0 ) return 8 ;
Delay( 80 ) ;
//扫描键盘第1列 K10、K7、K4、K1
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (1<<6) | (1<<2) ; //GPG6 output 1;GPG2 output 1
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (0<<11) ; //GPE13 output 1;GPE11 output 0
if( (rGPFDAT&(1<< 0)) == 0 ) return 1 ;
else if( (rGPFDAT&(1<< 2)) == 0 ) return 3 ;
else if( (rGPGDAT&(1<< 3)) == 0 ) return 5 ;
else if( (rGPGDAT&(1<<11)) == 0 ) return 7 ;
//扫描键盘第3列 K12、K9、K6、K3
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (1<<6) | (1<<2) ; //GPG6 output 1;GPG2 output 1
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (0<<13) | (1<<11) ; //GPE13 output 0;GPE11 output 1
if( (rGPFDAT&(1<< 0)) == 0 ) return 9 ;
else if( (rGPFDAT&(1<< 2)) == 0 ) return 11 ;
else if( (rGPGDAT&(1<< 3)) == 0 ) return 13 ;
else if( (rGPGDAT&(1<<11)) == 0 ) return 15 ;
else return 0xff ;
}
static void __irq KeyISR(void)
{
U8 key ;
rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((0<<22)|(0<<6)) ; //GPG11,13 set input
rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((0<<4)|(0<<0)) ; //GPF2,0 set input
if(rINTPND==BIT_EINT8_23)
{
if(rEINTPEND&(1<<11))
{
rEINTPEND |= 1<< 11; //clear EINT11 in EINTPND
ClearPending(BIT_EINT8_23); //clear EINT8_23 in INTPND and SRCPND
}
if(rEINTPEND&(1<<19))
{
rEINTPEND |= 1<< 19; //clear EINT19 in EINTPND
ClearPending(BIT_EINT8_23); //clear EINT8_23 in INTPND and SRCPND
}
ClearPending(BIT_EINT8_23); //clear EINT8_23 in INTPND and SRCPND
}
else if(rINTPND==BIT_EINT0)
{
ClearPending(BIT_EINT0); //clear EINT0 in INTPND and SRCPND
}
else if(rINTPND==BIT_EINT2)
{
ClearPending(BIT_EINT2); //clear EINT2 in INTPND and SRCPND
}
//查询按键键值
key = Key_Scan() ;
if( key != 0xff )
printf( "the keyboard: %d is pressed!\n", key ) ;
//重新初始化IO口
rGPGCON = rGPGCON & (~((3<<12)|(3<<4))) | ((1<<12)|(1<<4)) ; //GPG6,2 set output
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))); //GPG6,2 output 0
rGPECON = rGPECON & (~((3<<26)|(3<<22))) | ((1<<26)|(1<<22)); //GPE13,11 set output
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))); //GPE13,11 output 0
rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ; //GPG11,3 set EINT
rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ; //GPF2,0 set EINT
}
void KeyScanInit(void)
{
rGPGCON = rGPGCON & (~((3<<12)|(3<<4))) | ((1<<12)|(1<<4)) ; //GPG6,2 set output
rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))); //GPG6,2 output 0
rGPECON = rGPECON & (~((3<<26)|(3<<22))) | ((1<<26)|(1<<22)); //GPE13,11 set output
rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))); //GPE13,11 output 0
rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ; //GPG11 set EINT19;GPG3 set EINT11
rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ; //GPF2 set EINT2;GPF0 set EINT0
rEXTINT0 &= ~(7|(7<<8));
rEXTINT0 |= (2|(2<<8)); //set eint0,2 falling edge int
rEXTINT1 &= ~(7<<12);
rEXTINT1 |= (2<<12); //set eint11 falling edge int
rEXTINT2 &= ~(0xf<<12);
rEXTINT2 |= (2<<12); //set eint19 falling edge int
rEINTPEND |= (1<<11)|(1<<19); //clear eint 11,19
rEINTMASK &= ~((1<<11)|(1<<19)); //enable eint11,19
ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);//clear EINT0、2、11、19
pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = (U32)KeyISR;//建立中断函数
EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);//enable EINT0、2、11、19
}
void Main(void)
{
SetClockDivider(1, 1);
SetSysFclk(DFT_FCLK_VAL);
Port_Init();
Uart_Printf( "\n4X4 KEY array TEST ( Interrupt MODE )\n" );
Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );
KeyScanInit() ;
while( Uart_GetKey() != ESC_KEY ) ;
rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((0<<22)|(0<<6)) ; //GPG11,3 set input
rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((0<<4)|(0<<0)) ; //GPF2,0 set input
Uart_Printf( "the keyboarb is stopped\n" );
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -