key.c

来自「UC/OS-II移植到s3c2440代码」· C语言 代码 · 共 199 行

C
199
字号
#include "config.h"
/********************************************************************************
**--------------File info--------------------------------------------------------
** File Name: key.c
** Create by: 陈伟峰
** Create Date:2009-5-2
** Description: S3C2440的键盘驱动程序,使用中断触发,有去抖动,无按键缓冲
** Hardware: key1~key4分别接到GPF4~GPF7(EINT0~EINT3),Key5接GPG11,key6接GPG3
********************************************************************************/
uint8 KeyNo;					//按键号码

//按键1的中断处理函数
void Key1Handle(void)
{
	ClearPending(BIT_EINT0);	//清除中断标志
/*	
	rINTMSK |=BIT_EINT0;				//屏蔽中断、不影响中断标志
	
	OSTimeDlyHMSM(0,0,0,60);	//延时40ms,去抖动

	if(rSRCPND&BIT_EINT0)	//查看中断源寄存器状态
	{
		rINTMSK &=~BIT_EINT0;
		KeyNo=KEY1;				//确认有按键按下,报告中断
	}
	else 
		KeyNo=NOKEY;			//无按键、抖动
	
	ClearPending(BIT_EINT0);	//清除中断标志
*/
	KeyNo=KEY1;
}

//按键2的中断处理函数
void Key2Handle(void)
{
	ClearPending(BIT_EINT1);	//清除中断标志
/*	
	rINTMSK |=BIT_EINT1;				//屏蔽中断、不影响中断标志
	
	OSTimeDlyHMSM(0,0,0,40);	//延时40ms,去抖动
	
	if(1==rSRCPND&BIT_EINT1)	//查看中断源寄存器状态
	{
		rINTMSK &=~BIT_EINT1;
		KeyNo=KEY2;				//确认有按键按下,报告中断
	}
	else 
		KeyNo=NOKEY;				//无按键、抖动
	
	ClearPending(BIT_EINT1);	//清除中断标志
*/
	KeyNo=KEY2;
}

//按键3的中断处理函数
void Key3Handle(void)
{
	ClearPending(BIT_EINT2);	//清除中断标志
/*	
	rINTMSK |=BIT_EINT2;				//屏蔽中断、不影响中断标志
	
	OSTimeDlyHMSM(0,0,0,40);	//延时40ms,去抖动
	
	if(1==rSRCPND&BIT_EINT2)	//查看中断源寄存器状态
	{
		rINTMSK &=~BIT_EINT2;
		KeyNo=KEY3;				//确认有按键按下,报告中断
	}
	else 
		KeyNo=NOKEY;				//无按键、抖动
	
	ClearPending(BIT_EINT2);	//清除中断标志
*/
	KeyNo=KEY3;
}

//按键4的中断处理函数
void Key4Handle(void)
{
	ClearPending(BIT_EINT3);	//清除中断标志
/*	
	rINTMSK |=BIT_EINT3;				//屏蔽中断、不影响中断标志
	
	OSTimeDlyHMSM(0,0,0,40);	//延时40ms,去抖动
	
	if(1==rSRCPND&BIT_EINT3)	//查看中断源寄存器状态
	{
		rINTMSK &=~BIT_EINT3;
		KeyNo=KEY4;				//确认有按键按下,报告中断
	}
	else 
		KeyNo=NOKEY;				//无按键、抖动
*/
	KeyNo=KEY4;
}

void Key8_23Handle(void)
{
/*
	if(rEINTPEND==(1<<11))
	{
		rEINTPEND=(1<<11);			//清除中断标志
		ClearPending(BIT_EINT8_23); //清除中断标志
		
		rINTMSK |=BIT_EINT8_23;			//屏蔽中断
		
		OSTimeDlyHMSM(0,0,0,40);    //延时40ms
		
		if(rEINTPEND==(1<<11))
		{
			rINTMSK |=~BIT_EINT8_23;
			ClearPending(BIT_EINT8_23); //清除中断标志
			rEINTPEND=(1<<11);			//清除中断标志
			KeyNo=KEY5;				//确认有按键按下,报告中断
		}
		else
		KeyNo=NOKEY;
	}
	else if(rEINTPEND==(1<<19))
	{
		rEINTPEND=(1<<19);			//清除中断标志
		rINTMSK |=~BIT_EINT8_23; //清除中断标志
		
		rINTMSK |=BIT_EINT8_23;				//中断屏蔽
		
		OSTimeDlyHMSM(0,0,0,40);	//延时40ms
		
		if(rEINTPEND==(1<<19))
		{
			rINTMSK |=~BIT_EINT8_23;
			rEINTPEND=(1<<19);			//清除中断标志
			ClearPending(BIT_EINT8_23); //清除中断标志
			KeyNo=KEY6;				//确认有按键按下,报告中断
		}
		else
		KeyNo=NOKEY;
	}
	else
	{
		rEINTPEND=(1<<19)|(1<<11);
		KeyNo=NOKEY;
	}
*/

    if(rEINTPEND==(1<<11))
    {
		rEINTPEND=(1<<11);
		KeyNo=KEY5;
    }
    else if(rEINTPEND==(1<<19))
    	{
			rEINTPEND=(1<<19);
			KeyNo=KEY6;
   		 }
    	else
    	{
			rEINTPEND=(1<<19)|(1<<11);
			KeyNo=NOKEY;
		}
    ClearPending(BIT_EINT8_23);
}


void KeyPortInit(void)
{
	//rGPFCON = rGPFCON|(~0xFFCC)|0x00AA;	// GPF[7:4]中断EINT[3:0]功能
	//rGPFUP = rGPFUP&(0x0F);				// GPF[7:4]禁止上拉
	
	//rGPGCON = (rGPGCON & 0xff3fff3f)|(1<<23)|(1<<7); //GPG11、GPG3 中断EINT19、EINT11功能
	//rGPGUP = rGPGUP&(0<11)|(0<3);			//GPG11、GPG3 禁止上拉
	
	rGPFCON = (rGPFCON & 0xffcc)|(1<<7)|(1<<5)|(1<<3)|(1<<1);		//PF0/1/2/3 = EINT0/1/2/3
    rGPGCON = (rGPGCON & 0xff3fff3f)|(1<<23)|(1<<7);	//PG3/11 = EINT11/19
	
	//下降沿触发
    rEXTINT0 = (rEXTINT0 & 0xFFFFBBBB | 0x2222); //EINT0/1/2/3=falling edge triggered
	rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x2<<12; //EINT11=falling edge triggered
	rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x2<<12; //EINT19=falling edge triggered
	
	//中断向量指向中断处理函数
	VICVectAddr[0]=(uint32)Key1Handle;
	VICVectAddr[1]=(uint32)Key2Handle;
	VICVectAddr[2]=(uint32)Key3Handle;
	VICVectAddr[3]=(uint32)Key4Handle;
	VICVectAddr[5]=(uint32)Key8_23Handle;
    
    //清除中断标志
    rEINTPEND = 0xffffff;
    rSRCPND = BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT8_23;
	rINTPND = BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT8_23;
	
	//开中断
	rEINTMASK=~( (1<<11)|(1<<19) );
	rINTMSK &=~(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT8_23);
	
	//设置为IRQ中断
	rINTMOD &=~(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT8_23);
}

⌨️ 快捷键说明

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