⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyscan.c

📁 2440 开发板的测试程序。包括uart,iic,lcd
💻 C
字号:
/**************************************************************
4*4 Key Scan
**************************************************************/

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h" 

/******************************************************************************
	4X4 矩阵键盘
四个输入引脚:	EINT0 -----( GPF0  )----INPUT
				EINT2 -----( GPF2  )----INPUT
				EINT11-----( GPG3  )----INPUT
				EINT19-----( GPG11 )----INPUT
				
四个输出引脚:			   ( GPB6 )----OUTPUT
						   ( GPB7 )----OUTPUT
				
******************************************************************************/
U8 Key_Scan( void )
{
	Delay( 80 ) ;
	//rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (1<<6) | (0<<2) ;		//GPG6,2 output 0
	rGPBDAT &= ~( 1 << 6 );
	rGPBDAT |= 1 << 7;
	//Delay(10);
	//rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (1<<11) ;		//GPE13,11 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 ;

	//rGPGDAT = rGPGDAT & (~((1<<6)|(1<<2))) | (0<<6) | (1<<2) ;		//GPG6,2 output 0
	//rGPEDAT = rGPEDAT & (~((1<<13)|(1<<11))) | (1<<13) | (1<<11) ;		//GPE13,11 output 0
	rGPBDAT &= ~( 1 << 7 );
	rGPBDAT |= 1 << 6;
	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 ;
	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 << 11 ) )
		{
			//	Uart_Printf("eint11\n");
			rEINTPEND |= 1 << 11;
		}
		if ( rEINTPEND & ( 1 << 19 ) )
		{
			//		Uart_Printf("eint19\n");		
			rEINTPEND |= 1 << 19;
		}
	}
	if ( rINTPND == BIT_EINT0 )
	{
		//Uart_Printf("eint0\n");
		ClearPending( BIT_EINT0 );
	}
	if ( rINTPND == BIT_EINT2 )
	{
		//	Uart_Printf("eint2\n");
		ClearPending( BIT_EINT2 );
	}
	key = Key_Scan();
	if ( key != 0xff )
		Uart_Printf( "Interrupt occur... K%d is pressed!\n" , key ) ;

	rGPBCON &= ~( ( 3 << 12 ) | ( 3 << 14 ) );
	rGPBCON |= ( ( 1 << 12 ) | ( 1 << 14 ) );
	rGPBUP &= ~( 3 << 6 );
	rGPBDAT &= ~( 3 << 6 );
	ExitCritical( &r );
}

void KeyScan_Test( void )
{
	Uart_Printf( "\nKey Scan Test, press ESC key to exit !\n" );	

	//rGPGCON &= ~((3<<12)|(3<<4));
	//rGPGCON |= (1<<12)|(1<<4);		//GPG6,2 output 0
	//rGPGDAT &= ~((1<<6)|(1<<2));

	//rGPECON &= ~((3<<26)|(3<<22));
	//rGPECON |= (1<<26)|(1<<22);		//GPE13,11 output 0
	//rGPEDAT &= ~((1<<13)|(1<<11));

	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

	rEXTINT0 &= ~( 7 | ( 7 << 8 ) );	
	rEXTINT0 |= ( 0 | ( 0 << 8 ) );	//set eint0,2 falling edge int
	rEXTINT1 &= ~( 7 << 12 );
	rEXTINT1 |= ( 0 << 12 );	//set eint11 falling edge int
	rEXTINT2 &= ~( 0xf << 12 );
	rEXTINT2 |= ( 0 << 12 );	//set eint19 falling edge int

	rGPBCON &= ~( ( 3 << 12 ) | ( 3 << 14 ) );
	rGPBCON |= ( ( 1 << 12 ) | ( 1 << 14 ) );
	rGPBUP |= ( 3 << 6 );
	rGPBDAT &= ~( 3 << 6 );

	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 );
	pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = ( U32 ) Key_ISR;
	EnableIrq( BIT_EINT0 | BIT_EINT2 | BIT_EINT8_23 );	

	//rGPGCON &= ~(3<<20);

	//rGPGUP  &= ~(1<<10);
	while ( Uart_GetKey() != ESC_KEY ) ;
	DisableIrq( BIT_EINT0 | BIT_EINT2 | BIT_EINT8_23 );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -