外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )

转帖: http://www.oschina.net/question/565065_115196?sort=time

实验目的: mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方式,当按下K1时,LED1亮;当按下K2时,LED2亮;当按下K3时,LED3亮;当按下K4时,LED4亮。

首先我们先了解一下 mini2440 按键和LED接口:

   

GPBCON 地址: 0x56000010 (LED 灯可以参考流水灯的随笔)

按键接口电路如图2所示,当按键没有按下时,GPGx引脚为高电平;当按键按下时,引脚电平变为低电平。

外部中断文件布局:

该工程有三个模块组成。

按键模块主要包含 button.c 和  button.h

LED模块包含led.c和led.h。

中断处理模块主要包含     interrupt.c、interrupt.h、isrservice.c和isrservice.h文件。其中,interrupt.h和interrupt.c文件主要包含中断初始化函数,isrservice.c和isrservice.h文件主要包含中断处理函数。

_______________________________________________________________________________________________________________________________________________________________________

main.c 文件

 1 #include"led.h"
 2 #include"button.h"
 3 #include"isrservice.h"
 4 #include"interrupt.h"
 5
 6
 7 int main()
 8 {
 9     Led_Init();            //初始化LED
10     KeyInt_Init();        //初始化按键
11     Irq_Init();            //初始化外部中断
12     while(1)            //循环,等待中断发生
13     {
14         ;
15     }
16 }

————————————————————————————————————————————————————————————————————————————————————————————————————————————————

led.h 文件

 1 #ifndef __LED_H__
 2 #define __LED_H__
 3
 4 #include<s3c2440.h>
 5 #define Led1_On()        {GPBDAT&=(~(1<<5));}
 6 #define    Led1_Off()        {GPBDAT|=(1<<5);}
 7 #define Led2_On()        {GPBDAT&=(~(1<<6));}
 8 #define    Led2_Off()        {GPBDAT|=(1<<6);}
 9 #define Led3_On()        {GPBDAT&=(~(1<<7));}
10 #define    Led3_Off()        {GPBDAT|=(1<<7);}
11 #define Led4_On()        {GPBDAT&=(~(1<<8));}
12 #define    Led4_Off()        {GPBDAT|=(1<<8);}
13 /****************************************************
14 * 函数名称:void Led_Init(void)
15 * 全局变量:无
16 * 参数说明:无
17 * 返 回 值;无
18 * 功    能:设置GPN5-8为输出功能,初始化4个LED灯灭
19 *****************************************************/
20 void Led_Init(void);
21
22 #endif

led.c 文件

 1 #include<s3c2440.h>
 2
 3 /****************************************************
 4 * 函数名称:void Led_Init(void)
 5 * 全局变量:无
 6 * 参数说明:无
 7 * 返 回 值;无
 8 * 功    能:设置GPB5-8为输出功能,初始化4个LED灯灭
 9 *****************************************************/
10 void Led_Init(void)
11 {
12         GPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));
13         GPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));//设置GPB5-8口为输出功能
14         GPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8));//上拉电阻使能
15         GPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8);//令GPBDAT5-8均为高电平,即令4个led灯全灭
16 }

________________________________________________________________________________________________________________________________________________________________________________________________________

button.h 文件

 1 #ifndef __BUTTON_H__
 2 #define __BUTTON_H__
 3
 4 /****************************************************
 5 * 函数名称:void KeyInt_Init()
 6 * 全局变量:无
 7 * 参数说明:无
 8 * 返 回 值;无
 9 * 功    能:设置GPG0、3、5、6、7、11为外部中断输入功能
10 *****************************************************/
11 void KeyInt_Init(void);
12
13 #endif

button.c 文件

 1 /************************************************
 2 * mini2440板子上六个按键对应的GPIO和中断
 3 *      按键    GPIO  中    断
 4 *       K1   GPG0   EINT8
 5 *       K2   GPG3   EINT11
 6 *       K3   GPG5   EINT13
 7 *       K4   GPG6   EINT14
 8 *       K5   GPG7   EINT15
 9 *       K6   GPG11  EINT19
10 ************************************************/
11
12 #include<s3c2440.h>
13 #include"button.h"
14
15 #define    KEY1_C    (3<<0)
16 #define    KEY2_C    (3<<6)
17 #define    KEY3_C    (3<<10)
18 #define    KEY4_C    (3<<12)
19
20 #define    KEY1    (2<<0)
21 #define    KEY2    (2<<6)
22 #define    KEY3    (2<<10)
23 #define    KEY4    (2<<12)
24
25 /****************************************************
26 * 函数名称:void KeyInt_Init()
27 * 全局变量:无
28 * 参数说明:无
29 * 返 回 值;无
30 * 功    能:设置GPG0、3、5、6、7、11为外部中断输入功能
31 *****************************************************/
32 void KeyInt_Init(void)
33 {
34     GPGCON&=~(KEY1_C|KEY2_C|KEY3_C|KEY4_C);
35     GPGCON|=KEY1|KEY2|KEY3|KEY4;    //将GPG0、3、5、6、7、11设为输入功能
36     GPGUP&=~((1<<0)|(1<<3)|(1<<5)|(1<<6));
37     GPGDAT|=(1<<0)|(1<<3)|(1<<5)|(1<<6);        //因为按下按键后,相应的GPIO口为0,所以初始化为高电平
38 }

________________________________________________________________________________________________________________________________________________________________________________________________________

interrupt.h 文件

 1 #ifndef    __INTERRUPT_H__
 2 #define    __INTERRUPT_H__
 3
 4
 5 /****************************************************
 6 * 函数名称:void Irq_Init(void)
 7 * 全局变量:无
 8 * 参数说明:无
 9 * 返 回 值;无
10 * 功    能:将Led1-4按键对应的中断屏蔽位置设为无效
11 *****************************************************/
12 void Irq_Init(void);
13
14 #endif

interrupt.c 文件

 1 /************************************************
 2 * mini2440板子上六个按键对应的GPIO和中断
 3 *      按键    GPIO  中    断
 4 *       K1   GPG0   EINT8
 5 *       K2   GPG3   EINT11
 6 *       K3   GPG5   EINT13
 7 *       K4   GPG6   EINT14
 8 *       K5   GPG7   EINT15
 9 *       K6   GPG11  EINT19
10 ************************************************/
11
12 #include<s3c2440.h>
13 #include"interrupt.h"
14
15
16 /****************************************************
17 * 函数名称:void Irq_Init(void)
18 * 全局变量:无
19 * 参数说明:无
20 * 返 回 值;无
21 * 功    能:将Led1-4按键对应的中断屏蔽位置设为无效
22 *****************************************************/
23 void Irq_Init(void)
24 {
25     //对于EINT8,EINT11,EINT13,EINT14,需要在EINTMASK寄存器使能它们
26     EINTMASK&=(~(1<<8))&(~(1<<11))&(~(1<<13))&(~(1<<14));
27     //这4个外部中断的优先级是相同的,EINT8_23都接仲裁器的REQ1引脚
28     //所以不用像韦东山程序里那样再设置优先级了
29
30     //EINT8,EINT11,EINT13,EINT14使能
31     INTMSK&=(~(1<<5));
32 }

_____________________________________________________________________________________________________________________________________________________________________________________________________

irservice.h 文件

 1 #ifndef    __ISRSERVICE_H__
 2 #define __ISRSERVICE_H__
 3
 4 /****************************************************
 5 * 函数名称:void __irq IRQ_Handler(void)
 6 * 全局变量:无
 7 * 参数说明:无
 8 * 返 回 值;无
 9 * 功    能:中断服务函数,必须加__irq
10 *****************************************************/
11 void __irq IRQ_Handler(void);
12
13 #endif

isrservice.c 文件

 1 #include<s3c2440.h>
 2 #include"isrservice.h"
 3 #include"led.h"
 4
 5  void delay(void);
 6 /****************************************************
 7 * 函数名称:void __irq IRQ_Handler(void)
 8 * 全局变量:无
 9 * 参数说明:无
10 * 返 回 值;无
11 * 功    能:中断服务函数,必须加__irq
12 *****************************************************/
13 void __irq IRQ_Handler(void)
14 {
15     unsigned long oft=INTOFFSET;
16     unsigned long val;
17
18
19     val=EINTPEND;    //EINT寄存器,它的位x为1时,表示EINT已经发生(x为4——23)。
20     if(val&(1<<8))                //K1被按下,LED1被点亮
21     {
22         Led1_On();delay();Led1_Off();
23     }
24
25     if(val&(1<<11))                //K2被按下,LED2被点亮
26     {
27         Led2_On();delay();Led2_Off();
28     }
29
30     if(val&(1<<13))                //K3被按下,LED3被点亮
31     {
32         Led3_On();delay();Led3_Off();
33     }
34     if(val&(1<<14))                //K4被按下,LED4被点亮
35     {
36         Led4_On();delay();Led4_Off();
37     }
38         //清除中断
39     if(oft==5)
40         EINTPEND=(1<<8)|(1<<11)|(1<<13)|(1<<14);    //清除EINTPEND寄存器,往某位写入1即可清楚此位
41     SRCPND=1<<oft;                            //清除SRCPND寄存器,往某位写入1即可清楚此位
42     INTPND=1<<oft;                        //清除INTPND寄存器,往某位写入1即可清楚此位
43     //注意:清除顺序很重要:先是EINTPEND,然后是SRCPND,最后是INTPND
44 }
45 /****************************************************
46 * 函数名称:static void delay(void)
47 * 全局变量:无
48 * 参数说明:无
49 * 返 回 值;无
50 * 功    能:延时函数,前边加static是为了限制该函数只在
51 *           本文件中使用
52 *****************************************************/
53 static void delay(void)
54 {
55     int i,j;
56     for(i=0;i<100;i++)
57         for(j=0;j<10;j++);
58 }

总共 10个文件(包括初始化的 s3c2440.s 文件)

当然 我们调试的时候 ,把 .sct 文件改了一下,才能在 norflash 里面运行

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_ROM1 0x00000000 0x0200000  {    ; load region size_region
  ER_ROM1 0x00000000 0x0200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM1 0x30000000 0x04000000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM1 0x40000000 0x00001000  {
   .ANY (+RW +ZI)
  }
}

可以测试了,但是 只有 三个按键可以控制灯 亮灭,所以自己需要思考修改,现在看自己的了。

时间: 2024-08-24 04:51:16

外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )的相关文章

中断——按键控制LED状态

程序功能:按键控制LED状态,中断实现. 现象描述:当按下k键时,LED0总会闪烁,从而影响其他LED. 注意:用杜邦线把P3.2引脚(INT0)与开关K引脚相连. 程序: ORG 0000H LJMP MAIN ORG 0003H ;外部中断0入口 LJMP INT0 ORG 0200H MAIN:SETB EA ;开启总中断 SETB EX0 ;开启外部中断 0,即P3.2引脚 CLR IT0 ;设置成 低电平触发方式 SJMP $ ;主程序只等待中断 INT0:DEC P1 ;外部中断 0

CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. 程序代码 THE END 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 由上图可知,Zigbee模块的SW1按钮连接在P1.2端口上,当SW1导通,P1.2电平从3.3V被拉低接地.所以P1.2输入模式为下拉输入. 1.2 CC2530相关寄存器 寄存器名称 寄存器作用 寄存器描述 P

4、按键控制LED

1.GPIO初始化中增加按键时钟初始化使能 2.GPIO初始化中增加按键引脚配置 3.查看引脚状态函数:GPIO_ReadInputDataBit 4.例程代码 1 /************************************************************************************************************************************* 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数

基于Arduino的按键控制LED实验

I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用.按键开关大家都应该比较了解,属于开关量(数字量)元件,按下时为闭合(导通)状态.完成本实验要 用到的元件如下: 按键开关*1 红色M5 直插LED*1 220Ω电阻*1 10K

四、按键控制LED灯亮灭

材料: 1.SAGOO UNO 1块: 2.按键模块 1块: 3.杜邦线若干. 步骤: 1.按照下图连接按键模块和UNO: SAGOO UNO引脚                                      按键模块引脚 3V3  <------------------------------------>    V(电源) GND <------------------------------------>    G(电源) Pin2  <----------

CC2530 按键控制LED

原理图分析 当按键没有按下的时候是高电平:按下的时候VCC通过10K的限流电阻接地是低电平.要知道引脚的状态,需要把引脚配置为输入模式,然后读取引脚的状态即可. 寄存器分析 P0SEL配置为输入/输出模式(0为IO模式,1为外设模式). P0DIR 配置引脚为输入模式(0为输入,1为输出) P0INP配置为上拉或者下拉模式(0为上拉或下拉模式,1为三态模式) P2INP的高三位决定整个P0,P1,P2端口是上拉还是下拉. 编写测试 #include <ioCC2530.h> void main

tq2440裸机程序. 按键控制LED灯.

http://blog.csdn.net/w_ww_w/article/details/8211538 http://blog.csdn.net/shengnan_wu/article/details/8168795

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

MSP430F149学习之路——按键与LED

代码 1 /*********************************** 2 程序功能:用按键控制LED状态 3 缺点:按键按下后无法改变LED灯的状态,可以利用板上的复位键^~^ 4 *************************************/ 5 #include <msp430x14x.h> 6 7 int k,i=0; 8 void int_clk(); 9 void led(int n); 10 void main() 11 { 12 WDTCTL = WD