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

📄 key.c

📁 三星4510 BOOTLOADER全部源代码
💻 C
字号:
//***************************************************************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name:	Key.c
//Description: 	Test Matrix Keyboard. 
//Author:	Lee JuGuang
//Date:		2004-1-4
//***************************************************************************************************	

#include "s3c4510b_add.h"
#include "uart.h"

static void delay(unsigned int x);
static int key_scan(void);
	
extern void KeyTest()
{
	unsigned int tmp,i;
	//P0~P7:GPIO ,P8~P11:ROW,O,P12~P15:COL,I
	IOPMOD=0x0FF0;
	tmp=EXTDBWTH;
	EXTDBWTH=0x05503002;
	i_printf("\r\n\r\nPress any to continue...\r\n\r\n");
	
	while(1)
		{
		i=key_scan();
		if(kbd_hit())
			{
			LED4=LED3=LED2=LED1=0x0;
			EXTDBWTH=tmp;
			return;
			}
		}
}

//*********************************************************
//函数名:	delay();
//描述:	软件延时;
//参数:	延时时间;
//返回值:	无
//*********************************************************
static void delay(unsigned int x)
{
	unsigned int i,j,k;
	for(i=0;i<=x;i++)
		for(j=0;j<0xa0;j++)
			for(k=0;k<0xff;k++);
}


//*********************************************************
//函数名:	key_scan();
//描述:	键盘扫描;
//参数:	无
//返回值:	无
//*********************************************************
static int key_scan()
{
	static	unsigned int	step=0,ROW=0,COL=0,i=0,KEY_CODE,KEY_CODE1;
	unsigned char	LED;
	
	switch(step)
	{
		case	0:
			KEY_CODE=0;KEY_CODE1=0;
			LED=IOPDATA&0x3F0FF;//P8~P11=0;
			IOPDATA=LED;
			LED=(IOPDATA&0xF000)>>8;
			if(LED!=0xf0)
			{
				step++;					//有键按下,取行号
				LED=(~LED)&0xf0;
				for(i=1;i<5;i++)
				{
					LED=LED<<1;
					if(LED==0)
					{
					   ROW=i<<4;
					   break;
					}
				}
			}
			break;
	
		case	1:
			for(i=0;i<4;i++)
			{
			
				IOPDATA=0x01<<(8+i);
				LED=(IOPDATA&0xF000)>>8;
			
				if(LED==0xf0)	//键释放或找到被按下的键的列值
				{
					step++;
					COL=i+0x0a;
					KEY_CODE=ROW|COL;
					break;
				}
			}
			if(i==4)	
			 	step=0;
			break;
	
		case	2:
			delay(1);
			step++;
			break;
		case	3:					
			LED=IOPDATA&0x3F0FF;//P8~P11=0;
			IOPDATA=LED;
			LED=(IOPDATA&0xF000)>>8;
			if(LED!=0xf0)
			{
				step++;					//有键按下,取行号
				LED=(~LED)&0xf0;
				for(i=1;i<5;i++)
				{
					LED=LED<<1;
					if(LED==0)
					{
					   ROW=i<<4;
					   break;
					}
				}
			}
			else
				step=0;
			break;
	
		case	4:
			for(i=0;i<4;i++)
			{
			
				IOPDATA=0x01<<(8+i);
				LED=(IOPDATA&0xF000)>>8;
		
				if(LED==0xf0)	//键释放或找到被按下的键的列值
				{
					step++;
					COL=i+0x0a;
					KEY_CODE1=ROW|COL;
					break;
				}
			}
			if(i==4)	
			 	step=0;
			break;
		case	5:
			if(KEY_CODE==KEY_CODE1)		//键确认
				step++;
			else
				step=0;
			break;
		case	6:
			IOPDATA=IOPDATA&0x3F0FF;
			LED=(IOPDATA&0xF000)>>8;
			if(LED==0xf0)
				step++;
			break;
		case	7:
			switch(KEY_CODE)
			{
				case 0x1a:
					LED3=LED2=LED1=LED4=0x57;
					//i_printf("KEY_CODE=3\n\r");
				  	break;	
				case 0x1b:
					LED3=LED2=LED1=LED4=0x73;
					//i_printf("KEY_CODE=2\n\r");
				  	break;
				case 0x1c:
					LED3=LED2=LED1=LED4=0x06;
					//i_printf("KEY_CODE=1\n\r");
				  	break;
				case 0x1d:
					LED3=LED2=LED1=LED4=0xb7;
					//i_printf("KEY_CODE=0\n\r");

				  	break;
					
				case 0x2a:
					LED3=LED2=LED1=LED4=0x07;
					//i_printf("KEY_CODE=7\n\r");

				  	break;	
				case 0x2b:
					LED3=LED2=LED1=LED4=0xf5;
					//i_printf("KEY_CODE=6\n\r");

				  	break;
				case 0x2c:
					LED3=LED2=LED1=LED4=0xd5;
					//i_printf("KEY_CODE=5\n\r");

				  	break;
				case 0x2d:
					LED3=LED2=LED1=LED4=0xc6;
					//i_printf("KEY_CODE=4\n\r");

				  	break;
				case 0x3a:
					LED3=LED2=LED1=LED4=0xf4;
					//i_printf("KEY_CODE=B\n\r");

				  	break;	
				case 0x3b:
					LED3=LED2=LED1=LED4=0xE7;
					//i_printf("KEY_CODE=A\n\r");

				  	break;
				case 0x3c:
					LED3=LED2=LED1=LED4=0xd7;
					//i_printf("KEY_CODE=9\n\r");

				  	break;
				case 0x3d:
					LED3=LED2=LED1=LED4=0xf7;
					//i_printf("KEY_CODE=8\n\r");

				  	break;
				case 0x4a:
					LED3=LED2=LED1=LED4=0xe1;
					//i_printf("KEY_CODE=F\n\r");

				  	break;	
				case 0x4b:
					LED3=LED2=LED1=LED4=0xf1;
					//i_printf("KEY_CODE=E\n\r");

				  	break;
				case 0x4c:
					LED3=LED2=LED1=LED4=0x76;
					//i_printf("KEY_CODE=D\n\r");

				  	break;
				case 0x4d:
					LED3=LED2=LED1=LED4=0xb1;
					//i_printf("KEY_CODE=C\n\r");

				  	break;
			}					
			step=0;
			break;
	}
	return	1;
}

⌨️ 快捷键说明

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