keypad.c

来自「键盘识别程序」· C语言 代码 · 共 134 行

C
134
字号
#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 + =
减小字号Ctrl + -
显示快捷键?