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

📄 keyscan.c

📁 Samsung S3C2440A SOC RISC Microprocessor test program that demonstrates how to code most peripherals
💻 C
字号:
/**************************************************************
4 Key Scan
**************************************************************/

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

#define LED1		(1<<5)		// rGPB[5] =1 ;
#define LED2		(1<<6)		// rGPB[5] =1 ;
#define LED3		(1<<7)		// rGPB[5] =1 ;
#define LED4		(1<<8)		// rGPB[5] =1 ;

/******************************************************************************
	4 个用户按键
四个输入引脚:
				EINT0 -----( GPF0  )----INPUT---K4
				EINT2 -----( GPF2  )----INPUT---K3
				EINT4 -----( GPF4  )----INPUT---K2
				EINT1 -----( GPF1  )----INPUT---K1
				 
				
******************************************************************************/
U8 Key_Scan( void )
{
	Delay( 80 ) ;
	if(      (rGPFDAT&(1<< 0)) == 0 )
	{
		rGPBDAT = rGPBDAT & ~(LED4);			//亮LED4

		return 4 ;
	}
	else if( (rGPFDAT&(1<< 2)) == 0 )
	{
		rGPBDAT = rGPBDAT & ~(LED3);			//亮LED3

		return 3;
	}
	else if( (rGPFDAT&(1<<4)) == 0 )
	{
		rGPBDAT = rGPBDAT & ~(LED2);			//亮LED2

		return 2 ;
	}
	else if( (rGPFDAT&(1<< 1)) == 0 )
	{
		rGPBDAT = rGPBDAT & ~(LED1);			//亮LED1

		return 1 ;
	}
	else
	{
		rGPBDAT = rGPBDAT & ~0x1e0|0x1e0;   //LED[8:5] => 1;

		return 0xff;
	}

}

static void __irq Key_ISR(void)
{
	U8 key;
	U32 r;

	EnterCritical(&r);
	if(rINTPND==BIT_EINT1)
	{
		//Uart_Printf("eint1\n");
		ClearPending(BIT_EINT1);
	}
	if(rINTPND==BIT_EINT4_7)
	{
		ClearPending(BIT_EINT4_7);
		if(rEINTPEND&(1<<4))
		{
			//Uart_Printf("eint4\n");
			rEINTPEND |= 1<< 4;
		}
	}
	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... Key is released!\n") ;
	else
		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");	

	rGPBUP = rGPBUP & ~0x03f0|0x03f0;			//  LED [8:5] => PU En
	rGPBCON = rGPBCON & ~0x3d57fc|0x3d57fc;		//LED[8:5] => OUTPUT;
	rGPFCON = rGPFCON & (~((3<<4)|(3<<0)|(3<<8)|(3<<2))) | ((2<<4)|(2<<0)|(2<<8)|(2<<2)) ;		//GPF4,2,1,0 set EINT
	
	rEXTINT0 &= ~(7|(7<<4)|(7<<8)|(7<<16));	
	rEXTINT0 |= (0|(0<<4)|(0<<8)|(0<<16));		//set eint0,1,2,4 falling edge int


	rEINTPEND |= (1<<4);							//clear eint 4
	rEINTMASK &= ~(1<<4);						//enable eint 4
	ClearPending(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
	pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
	EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);	

	 while( Uart_GetKey() != ESC_KEY ) ;
	 DisableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);	
}

⌨️ 快捷键说明

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