国嵌实验:key_interrupt(按键中断),采用中断方式当KEY1 按下时,LED亮灭一次
2011-09-25 22:26
423 查看
#define GLOBAL_CLK1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
void key_init(void);
static void __irq key_handler(void);
/*************************************************
延时函数
**************************************************/
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
/*************************************************
LED初始化
**************************************************/
void Led1_init(void)
{
rGPBCON &= ~(3<<10);
rGPBCON |= (1<<10);
}
/*************************************************
点亮LED
**************************************************/
void Led1_run(void)
{
rGPBDAT &=~(1<<5); /*LED亮还是灭?*/
delay(1000);
rGPBDAT |=(1<<5);
delay(1000);
}
/*************************************************
主函数
**************************************************/
void Main(void)
{
MMU_Init();
Led1_init();
key_init();
while(1);
}
/*************************************************
按键初始化
**************************************************/
void key_init(void)
{
rGPGCON &= ~(0x3<<0);
rGPGCON |= (0x2<<0);//GPG0 [1:0]--->10 = EINT[8] 设置GPG0为中断模式
rEXTINT1 &= ~(0xf<<0); //EINT8 [2:0] ----> 000 = Low level
//FLTEN8 [3] ------->0 = Filter Disable
rEINTPEND |= (1<<8); //EINT8 [8] It is cleard by writing “1”
rEINTMASK &= ~(1<<8); //EINT8 [8]--------> 0 = enable interrupt 允许EINT8中断
/*设置ISR*/
pISR_EINT8_23=(U32)key_handler;//将中断服务函数的地址传给对应的中断向量表位置
EnableIrq(BIT_EINT8_23);
//#define EnableIrq(bit)rINTMSK &= ~(bit)
//EINT8_23 [5] ---->0 = Service available, 1 = Masked
}
/*************************************************
按键中断处理函数
**************************************************/
static void __irq key_handler(void)
{
/*判断是否是按键K1产生的中断*/
if(rINTPND==BIT_EINT8_23) //INTPND:EINT8_23 [5] 0 = Not requested, 1 = Requested
{
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8))
rEINTPEND |= 1<< 8;//清EINT8中断
Led1_run();
}
}
在2440addr.h头文件中:
#define BIT_EINT8_23 (0x1<<5)
__inline void ClearPending(int bit)
{
register i;
rSRCPND = bit;//清EINT8_23中断
rINTPND = bit;//清EINT8_23中断
i = rINTPND;
}
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
void key_init(void);
static void __irq key_handler(void);
/*************************************************
延时函数
**************************************************/
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
/*************************************************
LED初始化
**************************************************/
void Led1_init(void)
{
rGPBCON &= ~(3<<10);
rGPBCON |= (1<<10);
}
/*************************************************
点亮LED
**************************************************/
void Led1_run(void)
{
rGPBDAT &=~(1<<5); /*LED亮还是灭?*/
delay(1000);
rGPBDAT |=(1<<5);
delay(1000);
}
/*************************************************
主函数
**************************************************/
void Main(void)
{
MMU_Init();
Led1_init();
key_init();
while(1);
}
/*************************************************
按键初始化
**************************************************/
void key_init(void)
{
rGPGCON &= ~(0x3<<0);
rGPGCON |= (0x2<<0);//GPG0 [1:0]--->10 = EINT[8] 设置GPG0为中断模式
rEXTINT1 &= ~(0xf<<0); //EINT8 [2:0] ----> 000 = Low level
//FLTEN8 [3] ------->0 = Filter Disable
rEINTPEND |= (1<<8); //EINT8 [8] It is cleard by writing “1”
rEINTMASK &= ~(1<<8); //EINT8 [8]--------> 0 = enable interrupt 允许EINT8中断
/*设置ISR*/
pISR_EINT8_23=(U32)key_handler;//将中断服务函数的地址传给对应的中断向量表位置
EnableIrq(BIT_EINT8_23);
//#define EnableIrq(bit)rINTMSK &= ~(bit)
//EINT8_23 [5] ---->0 = Service available, 1 = Masked
}
/*************************************************
按键中断处理函数
**************************************************/
static void __irq key_handler(void)
{
/*判断是否是按键K1产生的中断*/
if(rINTPND==BIT_EINT8_23) //INTPND:EINT8_23 [5] 0 = Not requested, 1 = Requested
{
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8))
rEINTPEND |= 1<< 8;//清EINT8中断
Led1_run();
}
}
在2440addr.h头文件中:
#define BIT_EINT8_23 (0x1<<5)
__inline void ClearPending(int bit)
{
register i;
rSRCPND = bit;//清EINT8_23中断
rINTPND = bit;//清EINT8_23中断
i = rINTPND;
}
相关文章推荐
- 国嵌实验:key_poll,采用查询的方式一旦按键再松开,LED亮灭一次
- 第三个实验 通过中断方式让按键控股按键控制LED
- stm32 按键(中断)控制LED的亮灭,按一次亮,再按一次灭;
- 2013-10-07 实验之按键中断控制Led
- ARM裸机——FS2410按键控制LED(中断方式)
- java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
- ARM9 S3C2440按键中断方式点亮LED的汇编程序
- Mini2440 裸机实验之LED程序、按键、中断
- 按键控制蜂鸣器--采用中断方式(3)
- mini2440 按键中断LED 实验
- 开两个中断,一个周期5ms,另一个周期10s;5毫秒中断中采样AD按键,根据不同的电压让不同的LED灯闪烁;10s中断让一个LED灯每20s闪烁一次
- 从ARM裸机看驱动之按键中断方式控制LED(二)
- STM32中关于检测按键的一些问题(关于采用传统的延时消抖方式和采用中断方式)
- 按键中断,点亮LED实验
- TI CC2530基础实验(GPIO通用I/O中断操作——按键控制灯的亮灭)
- mini2440 KEY按键设备驱动(中断模式和查询模式)源代码--(宋宝华框架)
- 基于linux操作系统下s5pv210板子的按键中断实验
- 《C++第十二周实验报告2-1》--分别定义Teacher(教师)类和Cadre(干部采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)
- 嵌入式S3C2440开发板LED灯和按键(去抖)驱动实验
- 数据报的接收过程详解---从网卡到L3层(非NAPI,即接收数据采用中断方式)