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

📄 main.c

📁 ARM7(S3C 5540)在Linux系统下键盘程序
💻 C
字号:
//******************************************************
//Beijing Winsilicon Technology LT.CO,
//File Name:	main.c
//Description: 	Keyboard Test
//Author:	JuGuang,Lee
//Date:		
//******************************************************	

#include "s3c4510b_add.h"			

void	delay(unsigned int x);
void	InitUART(int Port,int Baudrate);
void 	PrintUART0(char *s);
int	key_scan(void);
	
int C_Entry()
{
	int i=0;
	//P0~P3:switch,I,P4~P7:LED,O,P8~P11:ROW,O,P12~P15:COL,I
	IOPMOD=0x0FF0;
	InitUART(0,0x500);
	PrintUART0("\r\n\r\nPress any key to test...\r\n\r\n");
	while(1)
		{
		i=key_scan();
		}
}

//*********************************************************
//函数名:	PrintUART0();
//描述:	向UART0发送一个字符串;
//参数:	要发送的字符串;
//返回值:	无
//*********************************************************
void PrintUART0(char *s)
{
	for(;*s!='\0';s++)
	{
		while(!(USTAT0&0x40));
		UTXBUF0=*s;
	}
}

//*********************************************************
//函数名:	InitUART();
//描述:	初始化指定的串行口;
//参数:	串行口号;数据通信协议;
//返回值:	无
//*********************************************************
void InitUART(int Port,int Baudrate)
{
	if(Port==0)
		{ULCON0=0x03;
		UCON0=0x09;
		UBRDIV0=Baudrate;   
		}
	if(Port==1)
		{ULCON1=0x03;
		UCON1=0x09;
		UBRDIV1=Baudrate;   
		}

}

//*********************************************************
//函数名:	delay(();
//描述:	软件延时;
//参数:	延时时间;
//返回值:	无
//*********************************************************
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();
//描述:	键盘扫描;
//参数:	无
//返回值:	无
//*********************************************************
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:
					PrintUART0("KEY_CODE=0x01\n\r");
				  	break;	
				case 0x1b:
					PrintUART0("KEY_CODE=0x02\n\r");
				  	break;
				case 0x1c:
					PrintUART0("KEY_CODE=0x03\n\r");

				  	break;
				case 0x1d:
					PrintUART0("KEY_CODE=0xF1\n\r");

				  	break;
					
				case 0x2a:
					PrintUART0("KEY_CODE=0x04\n\r");

				  	break;	
				case 0x2b:
					PrintUART0("KEY_CODE=0x05\n\r");

				  	break;
				case 0x2c:
					PrintUART0("KEY_CODE=0x06\n\r");

				  	break;
				case 0x2d:
					PrintUART0("KEY_CODE=0xF2\n\r");

				  	break;
				case 0x3a:
					PrintUART0("KEY_CODE=0x07\n\r");

				  	break;	
				case 0x3b:
					PrintUART0("KEY_CODE=0x08\n\r");

				  	break;
				case 0x3c:
					PrintUART0("KEY_CODE=0x09\n\r");

				  	break;
				case 0x3d:
					PrintUART0("KEY_CODE=0xF3\n\r");

				  	break;
				case 0x4a:
					PrintUART0("KEY_CODE=确认\n\r");

				  	break;	
				case 0x4b:
					PrintUART0("KEY_CODE=0x00\n\r");

				  	break;
				case 0x4c:
					PrintUART0("KEY_CODE=取消\n\r");

				  	break;
				case 0x4d:
					PrintUART0("KEY_CODE=0xF4\n\r");

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

⌨️ 快捷键说明

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