您的位置:首页 > 运维架构 > Linux

中断-按键控制LED灯

2017-07-25 15:56 811 查看

三个按键分别控制三个LED灯

完整项目请去我的资源下载页xjp的资源
初始化函数:
/*
* init.c: 进行一些初始化
*/

#include "s3c24xx.h"

/*
* LED1,LED2,LED4对应GPF4、GPF5、GPF6
*/
#define	GPF4_out	(1<<(4*2))			//定义为01 输出
#define	GPF5_out	(1<<(5*2))
#define	GPF6_out	(1<<(6*2))

#define	GPF4_msk	(3<<(4*2))			//定义为11
#define	GPF5_msk	(3<<(5*2))
#define	GPF6_msk	(3<<(6*2))

/*
* S2,S3,S4对应GPF0、GPF2、GPG3
EINT0    EINT2	EINT11
*/
#define GPF0_eint     (0x2<<(0*2))		//10
#define GPF2_eint     (0x2<<(2*2))
#define GPG3_eint     (0x2<<(3*2))		//3*2:    2 代表一个节点站两位

#define GPF0_msk    (3<<(0*2))		//11
#define GPF2_msk    (3<<(2*2))
#define GPG3_msk    (3<<(3*2))

/*
* 关闭WATCHDOG,否则CPU会不断重启
*操作WTCON寄存器
*/
void disable_watch_dog(void)
{
WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可
}

void init_led(void)
{
// LED1,LED2,LED4对应的3根引脚设为输出
GPFCON &= ~(GPF0_msk|GPF2_msk|GPG3_msk);//先清零
GPFCON |=(GPF4_out|GPF5_out|GPF6_out);//后置位
}

/*
* 初始化GPIO引脚为外部中断
* GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)
*/
void init_irq( )
{
// S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
GPFCON &= ~(GPF0_msk|GPF2_msk);//
GPFCON |=    (GPF0_eint|GPF2_eint);

// S4对应的引脚设为中断引脚EINT11
GPGCON &= ~GPG3_msk;
GPGCON |=	GPG3_eint;

// 对于EINT11,需要在EINTMASK寄存器中使能它
EINTMASK &= ~(1<<11);//【11】位清零
EINTMASK |=    (0<<11);//【11】位写零

//EINTMASK[11]中写零,等价于
//EINTMASK &= ~(1<<11);

/*
* 设定优先级:
* ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2
* 仲裁器1、6无需设置
* 最终:
* EINT0 > EINT2 > EINT11即K2 > K3 > K4
* 在PRIORITY中设置
*/

//PRIORITY 复位值为0x7f          0111 1111
// ARB_SEL0 = 00b,[8:7]=00      ARB_MODE0 = 0  [0]=0
PRIORITY &= ~((3<<7)|(1<<0));

// EINT0、EINT2、EINT8_23使能,在INTMSK中设置
INTMSK   &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));
}
中断函数
#include "s3c24xx.h"

void EINT_Handle()
{
unsigned long oft = INTOFFSET;//读取中断偏移量
unsigned long val;

switch( oft )
{
// S2被按下,LED1点亮,再次按下,LED1熄灭
case 0: //EINT0
{
GPFDAT |= (0x7<<4);   // 所有LED熄灭
GPFDAT &= ~(1<<4);      // LED1点亮
break;
}
// S3被按下,LED2点亮,再次按下,LED2熄灭
case 2://EINT2
{
GPFDAT |= (0x7<<4);   // 所有LED熄灭
GPFDAT &= ~(1<<5);      // LED2点亮
break;
}
// K4被按下,LED3点亮,再次按下,LED3熄灭
case 5://EINT11
{
GPFDAT |= (0x7<<4);   // 所有LED熄灭
GPFDAT &= ~(1<<6);      // LED4点亮
break;
}

default:
break;
}

//清中断
if( oft == 5 )
EINTPEND = (1<<11);   // EINT8_23合用IRQ5
SRCPND = 1<<oft;
INTPND = 1<<oft;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 嵌入式 中断