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

📄 keypad.c

📁 s3c6400 ADS下官方测试程序
💻 C
字号:
/**************************************************************************************
* 
*	Project Name : S3C6400 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6400.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : keypad.c
*  
*	File Description : This file implements the API functons for KEYPAD
*
*	Author : Woojin.Kim
*	Dept. : AP Development Team
*	Created Date : 2007/01/22
*	Version : 0.1 
* 
*	History"
*	- Created(Woojin.Kim 2007/01/22)
*  
**************************************************************************************/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "keypad.h"

#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "sysc.h"
#include "gpio.h"
#include "intc.h"
#include "timer.h"





//////////
// Function Name : KEYPAD_SelectINT
// Function Description : This function selects Interrupt type
// Input : uSelect [1:Falling edge INT    2:Rising edge INT    3:Both edge INT]
// Output : NONE
// Version : v0.1

void KEYPAD_SelectINT(u8 ucSelect)	//1:Falling edge INT  2:Rising edge INT  3:Both edge INT
{
	u32 uTemp;

	uTemp = Inp32(rKEYIFCON);
	uTemp &= ~(0x3);
	uTemp |=(ucSelect & 0x3);
	Outp32(rKEYIFCON, uTemp);
	
}


//////////
// Function Name : KEYPAD_EnableDFFC
// Function Description : This function enables debouncing filter & filter clock
// Input : uEnDF [ 0: disable	1: enable]
// 		  uEnFC [ 0: disable	1: enable]
// Output : NONE
// Version : v0.1

void KEYPAD_EnableDFFC(u8 ucEnDF,u8 ucEnFC)
{
	u32 uTemp;

	uTemp = Inp32(rKEYIFCON);
	uTemp &= ~(0xc);
	uTemp |= ((ucEnDF<<2|ucEnFC<<3)&0xc);
	Outp32(rKEYIFCON,uTemp);

}


//////////
// Function Name : KEYPAD_EnableWakeup
// Function Description : This function enables Stop/Idle mode wakeup
// Input : uEnWakeup [ 0: disabe	1: Low lvl wake up		2: Rising Edge wake up		4.Filling Edge wake up]
// Output : NONE
// Version : v0.1

void KEYPAD_EnableWakeup(u8 ucEnWakeup)
{
	u32 uTemp;

	uTemp = Inp32(rKEYIFCON);
	uTemp &= ~(0x30);
	uTemp |= ((ucEnWakeup<<4)& 0x30 );

	Outp32(rKEYIFCON,uTemp);

}


//////////
// Function Name : KEYPAD_STSCLR
// Function Description : This function checks Interrupt status and clear register
// Input : P_INT [Pressed interrupt is cleared when write data is '1']
// 		  R_INT [Pressed interrupt is cleared when write data is '1']
// Output : NONE
// Version : v0.1

void KEYPAD_STSCLR(u8 ucP_INT, u8 ucR_INT)
{
	Outp32(rKEYIFSTSCLR, ucP_INT|ucR_INT<<8);
	
}


//////////
// Function Name : KEYPAD_COL
// Function Description : This function checks COL data output and enable tri-state buffer
// Input : COL [ column data output]
// 		  COLLength [0: tri-state buffer enable	1: disable]
// Output : NONE
// Version : v0.1

void KEYPAD_COL(u8 ucCOL,u8 ucCOLLength)
{
	Outp32(rKEYIFCOL,ucCOL|ucCOLLength<<8);
	
}


//////////
// Function Name : KEYPAD_ROW
// Function Description : This function reads ROW data input
// Input : NONE
// Output : rKEYIFROW value(u32)
// Version : v0.1

u32 KEYPAD_ROW(void)
{
	return Inp32(rKEYIFROW);
}


//////////
// Function Name : KEYPAD_FC
// Function Description : This function sets up Debouncing filter clock division
// Input : FC [FCLK = FLT_CLK/(FC+1)]
// Output : NONE
// Version : v0.1

void KEYPAD_FC(u32 uFC)
{
	Outp32(rKEYIFFC,uFC);

}


//////////
// Function Name : Isr_KEYPAD
// Function Description : This function is Interrupt Service Routine of KEYPAD
//									Following KEYPAD Scanning procedure
// Input : NONE
// Output : NONE
// Version : v0.1

void __irq Isr_KEYPAD(void)
{
	u8 aDat_row[8];
	u32 uIcnt=0;


	KEYPAD_STSCLR(0xff,0xff);

	INTC_Disable(NUM_KEYPAD);


while(1)
{


	KEYPAD_COL(0x7f,0);	
//	rKEYIFCOL=0x1f;
	DelayfrTimer(micro,1000);
//   	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[7]=((KEYPAD_ROW())&0xff);
	if(aDat_row[7]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[1]=0;
		aDat_row[2]=0;
		aDat_row[3]=0;
		aDat_row[4]=0;
		aDat_row[5]=0;
		aDat_row[6]=0;		
		break;
	}


	KEYPAD_COL(0xbf,0);	
//	rKEYIFCOL=0x1f;
	DelayfrTimer(micro,1000);
//   	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[6]=((KEYPAD_ROW())&0xff);
	if(aDat_row[6]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[1]=0;
		aDat_row[2]=0;
		aDat_row[3]=0;
		aDat_row[4]=0;
		aDat_row[5]=0;
		aDat_row[7]=0;		
		break;
	}



	KEYPAD_COL(0xdf,0);	
//	rKEYIFCOL=0x1f;
	DelayfrTimer(micro,1000);
//   	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[5]=((KEYPAD_ROW())&0xff);
	if(aDat_row[5]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[1]=0;
		aDat_row[2]=0;
		aDat_row[3]=0;
		aDat_row[4]=0;
		aDat_row[6]=0;
		aDat_row[7]=0;		
		break;
	}

	KEYPAD_COL(0xef,0);
//	rKEYIFCOL=0x2f;
	DelayfrTimer(micro,1000);
//	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[4]=((KEYPAD_ROW())&0xff);
	if(aDat_row[4]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[1]=0;
		aDat_row[2]=0;
		aDat_row[3]=0;
		aDat_row[5]=0;
		aDat_row[6]=0;
		aDat_row[7]=0;		
		break;
	}

	KEYPAD_COL(0xf7,0);
//	rKEYIFCOL=0x37; 
	DelayfrTimer(micro,1000);
//	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[3]=((KEYPAD_ROW())&0xff);
	if(aDat_row[3]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[1]=0;
		aDat_row[2]=0;
		aDat_row[4]=0;
		aDat_row[5]=0;
		aDat_row[6]=0;
		aDat_row[7]=0;		
		break;
	}
	
	KEYPAD_COL(0xfb,0);
//	rKEYIFCOL=0x3b;
	DelayfrTimer(micro,1000);
//	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[2]=((KEYPAD_ROW())&0xff);
	if(aDat_row[2]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[1]=0;
		aDat_row[3]=0;
		aDat_row[4]=0;
		aDat_row[5]=0;
		aDat_row[6]=0;
		aDat_row[7]=0;		
		break;
	}

	KEYPAD_COL(0xfd,0);
//   	rKEYIFCOL=0x3d;
	DelayfrTimer(micro,1000);
//	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
	aDat_row[1]=((KEYPAD_ROW())&0xff);
	if(aDat_row[1]!=0xff) 
	{
		aDat_row[0]=0;
		aDat_row[2]=0;
		aDat_row[3]=0;
		aDat_row[4]=0;
		aDat_row[5]=0;
		aDat_row[6]=0;
		aDat_row[7]=0;
		break;
	}

	KEYPAD_COL(0xfe,0);
//	rKEYIFCOL=0x3e;
	DelayfrTimer(micro,1000);
//	Delay(10);  //delay(100)=10msec, delay(10)=1msec 
	aDat_row[0]=((KEYPAD_ROW())&0xff);
	if(aDat_row[0]!=0xff) 
	{
		aDat_row[1]=0;
		aDat_row[2]=0;
		aDat_row[3]=0;
		aDat_row[4]=0;
		aDat_row[5]=0;
		aDat_row[6]=0;
		aDat_row[7]=0;		
		break;
	}


}


    //printf("row0:%x,row1:%x,row2:%x,row3:%x,row4:%x,row5:%x\n",
    //aDat_row[0],aDat_row[1],aDat_row[2],aDat_row[3],aDat_row[4],aDat_row[5]);

	for(uIcnt=0;uIcnt<9;uIcnt++)
	{
		if(aDat_row[uIcnt]==0xfe)
		{
			printf("[1,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0xfd)
		{
			printf("[2,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0xfb)
		{
			printf("[3,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0xf7)
		{
			printf("[4,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0xef)
		{
			printf("[5,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0xdf)
		{
			printf("[6,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0xbf)
		{
			printf("[7,%d]\n",uIcnt+1);
		}
		else if(aDat_row[uIcnt]==0x7f)
		{
			printf("[8,%d]\n",uIcnt+1);
		}		
	}


	KEYPAD_COL(0,0);
//	rKEYIFCOL=0x0;

//	Outp32(rKEYIFCON,uRestore_keycon);
	
	INTC_Enable(NUM_KEYPAD);
	INTC_ClearVectAddr();
 }


//////////
// Function Name : KEYPAD_Init
// Function Description : This function sets up KEYPAD GPIO(HOST I/F)
// Input : NONE
// Output : NONE
// Version : v0.1

void KEYPAD_Init(void)
{
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_8,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_9,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_10,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_11,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_12,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_13,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_14,3);
	GPIO_SetFunctionEach(eGPIO_K,eGPIO_15,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_0,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_1,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_2,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_3,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_4,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_5,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_6,3);
	GPIO_SetFunctionEach(eGPIO_L,eGPIO_7,3);	
//	rGPGCON=0xaaaaaa;
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_8,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_9,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_10,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_11,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_12,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_13,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_14,0);
	GPIO_SetPullUpDownEach(eGPIO_K,eGPIO_15,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_0,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_1,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_2,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_3,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_4,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_5,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_6,0);
	GPIO_SetPullUpDownEach(eGPIO_L,eGPIO_7,0);
	

//	rGPGPU=0xfff;

	printf("[KEY_PAD Test]\n");
//	printf("GPGCON=0x%x\n",rGPGCON);
}


//////////
// Function Name : KEYPAD_Init
// Function Description : This function sets up KEYPAD GPIO (MMC1&EINT)
// Input : NONE
// Output : NONE
// Version : v0.1

void KEYPAD_Init2(void)
{
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_0,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_1,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_2,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_3,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_4,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_5,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_6,4);
	GPIO_SetFunctionEach(eGPIO_H,eGPIO_7,4);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_0,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_1,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_2,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_3,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_4,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_5,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_6,3);
	GPIO_SetFunctionEach(eGPIO_N,eGPIO_7,3);	
//	rGPGCON=0xaaaaaa;
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_0,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_1,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_2,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_3,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_4,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_5,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_6,0);
	GPIO_SetPullUpDownEach(eGPIO_H,eGPIO_7,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_0,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_1,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_2,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_3,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_4,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_5,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_6,0);
	GPIO_SetPullUpDownEach(eGPIO_N,eGPIO_7,0);
	

//	rGPGPU=0xfff;

	printf("[KEY_PAD Test]\n");
//	printf("GPGCON=0x%x\n",rGPGCON);
}




/*
void KeyPad_SW_Test(void)
{
	uint32 IntType, FilterClk;

	IntType = 1;
	printf("\nInput the KeyPad Interrupt Type : ");
	printf("\n1 : Falling Edge[D],    2 : Rising Edge,    3 : Both Edge \n");
	IntType = GetIntNum(); 
	if( (IntType<1) || (IntType>3) )
		IntType = 1;	//Default Falling Edge Type

	FilterClk = 0;
	printf("\nInput the KeyPad Filter source Clock : ");
	printf("\n0 : RTC Clcok[D],     1 : OSCIN Clock\n");
	FilterClk = GetIntNum(); 
	if( FilterClk>1 )
		FilterClk = 0;	//Default Falling Edge Type

    	//FC_EN[3], DF_EN[2], INT_F_EN[0]
	rKEYIFCON=(FilterClk<<3)|(1<<2)|(IntType<<0);

	if(FilterClk == 0)
		rKEYIFFC=0x2;	//32KHz, 62.5us
	else
		rKEYIFFC=FIN*62500000/1000000;	//FIN, 62.5us
		
	//printf("rKEYIFCON=0x%x\n",rKEYIFCON);

	Key_pad_SWInit();

	//rKEYIFCOL=0x0;
	Key_Column_Output(0);

	rVECTADDR_KEYPAD = (int)Key_SWISR;
	INT_Enable0(BIT_KEYPAD);

	printf("\nPress Any KeyPad .......\n");
	
	while(!Uart_GetKey());

	INT_Disable0(BIT_KEYPAD);
}




void __irq Key_SWISR(void)
{
	unsigned short dat_row[6];
	int i=0,j=0;
	uint32 restore_keycon;

	restore_keycon = rKEYIFCON;
	rKEYIFCON=0x0;	
	rKEYIFSTSCLR=0x3; //Interrupt pending clear
	INT_Disable0(BIT_KEYPAD);

	while(1)
	{
		//rKEYIFCOL=0x1f;
		Key_Column_Output(0x1f);
	    	Delay(10);	//delay(100)=10msec, delay(10)=1msec 
		dat_row[5]=(rKEYIFROW&0x3f);
		if(dat_row[5]!=0x3f) 
		{
			dat_row[0]=0;
			dat_row[1]=0;
			dat_row[2]=0;
			dat_row[3]=0;
			dat_row[4]=0;
			break;
		}

		//rKEYIFCOL=0x2f;
		Key_Column_Output(0x2f);
		Delay(10);	//delay(100)=10msec, delay(10)=1msec 
		dat_row[4]=(rKEYIFROW&0x3f);
		if(dat_row[4]!=0x3f) 
		{
			dat_row[0]=0;
			dat_row[1]=0;
			dat_row[2]=0;
			dat_row[3]=0;
			dat_row[5]=0;
			break;
		}

		//rKEYIFCOL=0x37; 
		Key_Column_Output(0x37);
		Delay(10);	//delay(100)=10msec, delay(10)=1msec 
		dat_row[3]=(rKEYIFROW&0x3f);
		if(dat_row[3]!=0x3f) 
		{
			dat_row[0]=0;
			dat_row[1]=0;
			dat_row[2]=0;
			dat_row[4]=0;
			dat_row[5]=0;
			break;
		}
		
		//rKEYIFCOL=0x3b;
		Key_Column_Output(0x3B);
		Delay(10);	//delay(100)=10msec, delay(10)=1msec 
		dat_row[2]=(rKEYIFROW&0x3f);
		if(dat_row[2]!=0x3f) 
		{
			dat_row[0]=0;
			dat_row[1]=0;
			dat_row[4]=0;
			dat_row[3]=0;
			dat_row[5]=0;
			break;
		}

		//rKEYIFCOL=0x3e;
		Key_Column_Output(0x3E);
		Delay(10);  //delay(100)=10msec, delay(10)=1msec 
		dat_row[0]=(rKEYIFROW&0x3f);
		if(dat_row[0]!=0x3f) 
		{
			dat_row[4]=0;
			dat_row[1]=0;
			dat_row[2]=0;
			dat_row[3]=0;
			dat_row[5]=0;
			break;
		}

	    	//rKEYIFCOL=0x3d;
	    	Key_Column_Output(0x3D);
		Delay(10);	//delay(100)=10msec, delay(10)=1msec 
		dat_row[1]=(rKEYIFROW&0x3f);
		if(dat_row[1]!=0x3f) 
		{
			dat_row[0]=0;
			dat_row[4]=0;
			dat_row[2]=0;
			dat_row[3]=0;
			dat_row[5]=0;
			break;
		}
	}


	for(i=0;i<7;i++)
	{
		if(dat_row[i]==0x3e)
		{
			printf("[1,%d]\n",i+1);
		}
		else if(dat_row[i]==0x3d)
		{
			printf("[2,%d]\n",i+1);
		}
		else if(dat_row[i]==0x3b)
		{
			printf("[3,%d]\n",i+1);
		}
		else if(dat_row[i]==0x37)
		{
			printf("[4,%d]\n",i+1);
		}
		else if(dat_row[i]==0x2f)
		{
			printf("[5,%d]\n",i+1);
		}
		else if(dat_row[i]==0x1f)
		{
			printf("[6,%d]\n",i+1);
		}
	}

	Key_Column_Output(0);
	rKEYIFCON=restore_keycon;

	INT_Enable0(BIT_KEYPAD);
	Write_VECTADDR(0x0);
 }

void Key_Column_Output(uint32 Col_data)
{
	rGPGDAT = (rGPGDAT & ~0xFC0) | (Col_data<<6);
}



void Key_pad_SWInit(void)
{
	rGPGCON=0x555aaa;		// Row : HW,  Column : SW
	rGPGPU=0xfff;

}
*/

⌨️ 快捷键说明

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