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

📄 keyscan.c

📁 arm9.rar
💻 C
字号:
/**************************************************************
4*4 Key Scan
**************************************************************/
#include "def.h"
#include "2410addr.h"
#include "config.h"
#include "board.h"
#include "utils.h"


#define	KEY_ROW_R	*(volatile U16 *)( 0x38001002 )		//nGCS7

static U8 key_ch[16] = {	'7',  '8',  '9',  'f', 
							'4',  '5',  '6',  'e',
							'1',  '2',  '3',  'd',
							'0',  'a',  'b',  'c'};

static U8 key_matrix[256];

U32 down_key;


U8 Kbhit(void)
{
	int j;
	KEY_ROW_R = 0x00;
	for(j=0; j<24; j++);
	if((!(rGPFDAT&(1<<0)))||(!(rGPFDAT&(1<<2)))||(!(rGPGDAT&(1<<3)))||(!(rGPGDAT&(1<<11))))
	return 1;
	return 0;
}
static __inline void set_io(void)
{
	// GPF0,GPF2 input with pull-up
	rGPFCON &= ~(3 | (3<<4));
	rGPFUP  &= ~(1 | (1<<2));
	// GPG3,GPG11 input with pull-up
	rGPGCON = rGPGCON & ~((3<<6) | (3<<22));
	rGPGUP  = rGPGUP & ~((1<<3) | (1<<11));

	KEY_ROW_R = 0xf;
}

void key_scan_proc(U32 dummy)
{
	static int key_last = -1;
	int i, j, key = 0xffff;
	int tmp;

	for(i=0; i<4; i++)			/*这个循环是逐行扫描循环*/
	{
		KEY_ROW_R = ~(1<<i);
		for(j=0; j<24; j++);
		
		if(!(rGPFDAT&(1<<0)))
			key &= ~(1<<i);
		if(!(rGPFDAT&(1<<2)))
			key &= ~(1<<(i+4));
		if(!(rGPGDAT&(1<<3)))
			key &= ~(1<<(i+8));
		if(!(rGPGDAT&(1<<11)))
			key &= ~(1<<(i+12));
	}
	
		tmp  = key^key_last;
		tmp &= key_last;
		
		key_last = key;
		/*下面的代码主要用来获得按键的值*/
		if(tmp)
		{
			for(i=0; i<16; i++)
				if(tmp&(1<<i))
				{
					down_key = key_ch[i];
				//	printf("key 0x%x %c down!\n", tmp, down_key);
					break;
				}
		}

}

void KeyScanInit(void)
{
	int r, c;
	
	down_key = 0;
	for(r=0; r<256; r++)
		key_matrix[r] = 0;
	for(r=0; r<4; r++)
		for(c=0; c<4; c++)
			key_matrix[(1<<(r+4))+(1<<c)] = key_ch[r*4+c];
			
	set_io();
}

⌨️ 快捷键说明

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