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

📄 keypad.c

📁 键盘识别程序
💻 C
字号:
#include "includes.h"
#include "consol.h"
#include "keypad.h"


static void Delay60us(void)
{
	unsigned int i;
	for (i=0;i<0x9ff;i++);
}


void PrintKeyScanCode(U32 OriValue)
{
	switch (OriValue)
	{
	case KEYPAD0:
		CONSOL_Printf("KEYPAD0");
		break;
	case KEYPAD1:
		CONSOL_Printf("KEYPAD1");
		break;
	case KEYPAD2:
		CONSOL_Printf("KEYPAD2");
		break;
	case KEYPAD3:
		CONSOL_Printf("KEYPAD3");
		break;
	case KEYPAD4:
		CONSOL_Printf("KEYPAD4");
		break;
	case KEYPAD5:
		CONSOL_Printf("KEYPAD5");
		break;
	case KEYPAD6:
		CONSOL_Printf("KEYPAD6");
		break;
	case KEYPAD7:
		CONSOL_Printf("KEYPAD7");
		break;
	case KEYPAD8:
		CONSOL_Printf("KEYPAD8");
		break;
	case KEYPAD9:
		CONSOL_Printf("KEYPAD9");
		break;
	case KEYPADADD:
		CONSOL_Printf("KEYPAD \"+\"");
		break;
	case KEYPADSUB:
		CONSOL_Printf("KEYPAD \"-\"");
		break;
	case KEYPADDOT:
		CONSOL_Printf("KEYPAD \".\"");
		break;
	case KEYPADMUL:
		CONSOL_Printf("KEYPAD \"*\"");
		break;
	case KEYPADDIV:
		CONSOL_Printf("KEYPAD \"/\"");
		break;
	case KEYPADENTER:
		CONSOL_Printf("KEYPAD enter");
		break;
	case KEYPADNUMLK:
		CONSOL_Printf("KEYPAD NumLock");
		break;
	}
	CONSOL_Printf(" 扫描码:0x%x\n", OriValue);
}


void MatrixKeypad_Init(void)
{
	//行 input
	rGPBCON &= ~(0x3 << 20); //GPB10 C0
	rGPBUP  &= ~(0x1 << 10);

	rGPCCON &= ~(0x3<<14 | 0x3<<12 | 0x3<<10); //GPC7 GPC6 GPC5 C1 C2 C3
	rGPCUP  &= ~(0x1<<7  | 0x1<<6  | 0x1<<5);

	rGPGCON &= ~(0x3<<8 | 0x3<<6); //GPG4 GPG3 C4 C5
	rGPGUP  &= ~(0x1<<4 | 0x1<<3);

	//列 output
	rGPGCON &= ~(0x3<<10 | 0x3<<4);
	rGPGCON |=  (0x1<<10 | 0x1<<4);

	rGPECON &= ~(0x3<<22);
	rGPECON |=  (0x1<<22);

	rGPHCON &= ~(0x3<<20);
	rGPHCON |=  (0x1<<20);
}

U32 MatrixKeypad_ReadScanCode(void)
{
	int i;
	U32 t1, t2, t3, ScanCode = 0;

	for(i=0; i<4; i++)
	{
		rGPGDAT |= 0x1<<2;
		rGPGDAT |= 0x1<<5;
		rGPEDAT |= 0x1<<11;
		rGPHDAT |= 0x1<<10;
		switch(i)
		{
		case 0:
			rGPGDAT &= ~(0x1<<2);
			break;
		case 1:
			rGPGDAT &= ~(0x1<<5);
			break;
		case 2:
			rGPEDAT &= ~(0x1<<11);
			break;
		case 3:
			rGPHDAT &= ~(0x1<<10);
			break;
		}
		Delay60us();
		Delay60us();

		t1 = ((~(rGPBDAT)) & (0x1<<10                 ) ) >> 10;
		t2 = ((~(rGPCDAT)) & (0x1<<7 | 0x1<<6 | 0x1<<5) ) >> 4;
		t3 = ((~(rGPGDAT)) & (0x1<<4 | 0x1<<3         ) ) << 1;
		ScanCode |= (t1 | t2 | t3) << (i*6);
	}
	return ScanCode;
}


⌨️ 快捷键说明

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