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 + -
显示快捷键?