当前位置:首页 > 按键中断
  • MSP430按键中断

    #include typedef unsigned char uchar; typedef unsigned int uint; #define keyin (P1IN & 0X0F) #define wei_h P5OUT |= BIT5 #define wei_l P5OUT &= BIT5 #define duan_l P6OUT &= ~BIT6 #define duan_h P6OUT |= BIT6 uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar num = 0; void delay(int z) { int i,j; for(i=z;i>0;i--) for(j=112;j>0;j--); } void display(uchar dat) { P4OUT = table[dat]; duan_h; duan_l; P4OUT = 0x00; wei_h; wei_l; } void main( void ) { uchar temp,keyval; // P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; P1DIR = 0XF0; int num = 0; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; while(1) { if(keyin != 0x0f) { delay(5); if(keyin != 0x0f) { temp = keyin; while(keyin != 0x0f);//松手检测 switch(temp) { /* 1 case 0x0e: keyval = 1;display(keyval);break; case 0x0d: keyval = 2;display(keyval);break; case 0x0b: keyval = 3;display(keyval);break; case 0x07: keyval = 4;display(keyval);break; default: keyval = 8;display(keyval);break; */ /* 2 case 0x0d: num++;if(num==16)num=0;display(num);break; case 0x0b: num--;if(num==0)num=15;display(num);break;*/ } } } } }

    时间:2019-01-02 关键词: MSP430 按键中断

  • STM32实验4:按键中断

    端口配置#include"stm32f10x.h"//PA13PA15voidKEY_Init(void){GPIO_InitTypeDefGPIO_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能外设置时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//PA15上拉输入GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);//将PA15设置为中断输入EXTI_InitStructure.EXTI_Line=EXTI_Line15;//中断线EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断请求EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能中断EXTI_Init(&EXTI_InitStructure);NVIC_Configuration();//设置中断优先级NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}1234567891011121314151617181920212223242526272829中断服务函数voidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line15)==1)//按键是否按下{LED0=!LED0;}EXTI_ClearITPendingBit(EXTI_Line15);//清除中断标识}12345678主函数#include"stm32f10x.h"intmain(void){SystemInit();//系统时钟初始化为72MSYSCLK_FREQ_72MHzdelay_init(72);LED_Init();KEY_Init();while(1){;}}123456789101112知识点1.STM32的所有GPIO都可以用作外部中断源的输入端2.STM32的中断向量具有两个属性,一个为抢占属性,一个为响应属性,其属性编号越小,表明它的优先级别越高。高抢占优先级可以打断低抢占优先级。当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级别高的中断。3.NVIC优先级组有5种分配方式。4.STM32的所有GPIO都引入到EXTI中断线上。5.可以配置成上升沿触发,下降沿触发和双边沿触发三种触发方式。6.当GPIO用作EXTI外部中断或者使用重映射功能时,必须开启AFIO,同时也要开启外设时钟。7.stm32f10x_it.c文件是专门用来存放中断服务函数的,中断服务函数的名字必须要与启动文件startup_stm32f10x_hd.s中的中断向量表定义一致。8.NVIC_InitStructure.NVIC_IRQChannel的值可以在stm32f10x.h中搜寻。

    时间:2018-12-06 关键词: STM32 按键中断

  • 按键中断总结

    一、RCC初始化 /**************************************************************************** * Function Name : RCC_Configuration * Description : Sets System clock frequency to 72MHz and configure HCLK, PCLK2 * and PCLK1 prescalers. * Input : None * Output : None * Return : None ****************************************************************************/ void RCC_Configuration(void) {     /* Deinitialize the RCC registers */     RCC_DeInit();          /* Enable the HSE */         RCC_HSEConfig(RCC_HSE_ON);          /* Wait till HSE is ready and if Time out is reached exit */     HSEStartUpStatus = RCC_WaitForHSEStartUp();     if(HSEStartUpStatus == SUCCESS)     {         /* Add here PLL ans system clock config */                  /* Enable The Prefetch Buffer */         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);                  /* Configure Tthe Latency cycle: Set 0 Latency cycles */         FLASH_SetLatency(FLASH_Latency_2);                  /* Configure HCLK such as HCLK = SYSCLK */         RCC_HCLKConfig(RCC_SYSCLK_Div1);                  /* PCLK2 = HCLK */         RCC_PCLK2Config(RCC_HCLK_Div1);                  /* PCLK1 = HCLK/2 */         RCC_PCLK1Config(RCC_HCLK_Div2);                  /* Select HSE as system clock source*/         RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);                  /* PLLCLK = 8MHz * 9 = 72MHz */         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);                  /* ADCCLK = PCLK/4 */         RCC_ADCCLKConfig(RCC_PCLK2_Div4);                  /* Enable PLL */         RCC_PLLCmd(ENABLE);                  /* Wait till PLL is ready */         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);                  /* Select PLL as system clock source */         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till HSE is used as system clock source */         while(RCC_GetSYSCLKSource() != 0x08)         {                      }     }     else     {         /* If HSE fails to start-up. */         while(1)         {         }     } } 相比之前的时钟初始化,多初始化了ADCCLK。 二、GPIO初始化 /**************************************************************************** * Function Name : GPIO_Configuration * Description : * Input : None * Output : None * Return : None ****************************************************************************/ void GPIO_Configuration(void) {     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOB, &GPIO_InitStructure);          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOB, &GPIO_InitStructure);     } 使用PB8作为推挽输出,PB6为浮空输入。 三、NVIC初始化 /**************************************************************************** * Function Name : NVIC_Configuration * Description : Configures Vector Table base location. * Input : None * Output : None * Return : None ****************************************************************************/ void NVIC_Configuration(void) {     NVIC_InitTypeDef NVIC_InitStructure; #ifdef VET_TAB_RAM     /* Set the Vector Table base location at 0x2000 0000 */     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else     /* Set the Vector Table base location at 0x8000 0000 */     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);          NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     NVIC_Init(&NVIC_InitStructure);     } 因位PB6位输入,也就是外部中断源。所以初始化EXTI9_5_IRQn作为外部中断源 四、EXTI初始化 /**************************************************************************** * Function Name : EXTI_PE6_Config * Description : * Input : None * Output : None * Return : None ****************************************************************************/ void EXTI_PE6_Config(void) {     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);          EXTI_InitStructure.EXTI_Line = EXTI_Line6;     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     EXTI_InitStructure.EXTI_LineCmd = ENABLE;     EXTI_Init(&EXTI_InitStructure);          EXTI_GenerateSWInterrupt(EXTI_Line6); } 设置了外部中断源,把GPIOB6作为中断源。外部中断线是6,结合原理图使用下降沿触发。EXTI_GenerateSWInterrupt是触发一次软件中断。同时需要编写中断函数在stm32f10x_it.c中: /******************************************************************************* * Function Name : EXTI9_5_IRQHandler * Description : This function handles External lines 9 to 5 interrupt request. * Input : None * Output : None * Return : None *******************************************************************************/ void EXTI9_5_IRQHandler(void) {     if(EXTI_GetITStatus(EXTI_Line6) != RESET)     {         GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8)));                  EXTI_ClearITPendingBit(EXTI_Line6);     } } 五、main函数 /**************************************************************************** * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None ****************************************************************************/ int main(void) {     RCC_Configuration();          NVIC_Configuration();          GPIO_Configuration();          EXTI_PE6_Config();          while(1)     {     }     }                                   

    时间:2018-11-26 关键词: rcc初始化 按键中断

  • 按键中断---那些年我们一起玩mini2440(arm9)裸机

    ARM中断控制系统按键驱动程序设计一.Arm中断控制系统1.查询方式程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化。特点:实现简单;但CPU利用率很低,不适合多任务的系统。2.中断方式当事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,查看这个寄存器,如果所关注的事件发生了,则中断当前程序,跳转到一个固定的地址处理这个事件,处理完后返回到被中断的程序中继续运行。特点:实现相对复杂,但效率较高,是常用的方法。中断处理流程:(1)中断控制器汇集各类外设发出的中断信号,然后通知CPU;(2)CPU保存当前程序的运行环境,然后调用中断服务程序(ISR)来处理中断;(3)在ISR中通过读取外设的相关寄存器来识别中断的类型,并进行相应的处理。(4)清除中断:通过读写在相关中断控制寄存器和外设相关寄存器来实现;(5)恢复被中断程序的执行环境,继续执行被中断的程序。简化版:1.汇集中断信号,通知CPU;2.CPU保存当前运行环境,调用中断服务程序ISR3.ISR读取寄存器识别中断类型4.清中断5.恢复中断程序的执行环境;速记版:会(汇集)C(CPU)I(IRS)请(清中断)回复(恢复);S3c2440支持60个中断源,含子中断源SUBSRCPND(用于标明子中断源有没有发生中断)【发生中断被置1,清除子中断写入1】SUBSRCPND寄存器用来表明子中断(如:INT_RXD0)是否发生。S3C2440有15个子中断,SUBSRCPND中每一位对应一个子中断,当这些子中断发生时,相应的位置被置1.清除子中断只需向SUBSRCPND寄存器中相应位写入1.INTSUBMSK(屏蔽SUBSRCPND的中断,置1时屏蔽子中断)INTSUBMSK寄存器用来屏蔽SUBSRCPND寄存器所标的中断。INTSUBMSK寄存器中某位被设为1时,相应的子中断被屏蔽。设为0时,表示子中断被允许。SRCPND(用于标明中断源有没有发生中断)【发生中断被置1,清除(子)中断写入1】SRCPND中某一位用来标明一个(或一类)中断是否已经发生。例如:SRCPND寄存器中的子中断INT_RXD0发生了,且没有被INTSUBMSK屏蔽,则SRCPND的INT_UART0位被置1. SRCPND寄存器的清除与SUBSRCPND寄存器相似,若想清除某一位,往此位写入1.INTMSK(被置1时,中断屏蔽;置0时,中断允许)INTMSK寄存器用来屏蔽SRCPND所表示的中断。INTMSK某位被置为1时,对应的中断被屏蔽;设置为0时,相应中断被允许。INTMSK只能屏蔽设为IRQ的中断,不能屏蔽设为FIQ的中断。INTMODE(置1时,FIQ模式;置0时,IRQ模式)当INTMODE寄存器中某位被设置为1时,它所对应的中断源会被设置为FIQ模式,即此时中断发生时,CPU将进入快速中断模式,这通常用来处理特别紧急的中断。当该位被置为0时,表示为IRQ模式。FIQ & IRQ(1)IRQ模式下,中断处理程序需要自己保存R8到R12这几个寄存器,退出中断处理时需要自己恢复这几个寄存器,而FIQ模式由于这几个寄存器都有back寄存器(fiq_r8….),模式切换时CPU自动保存这些值到back寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快。(2)FIQ比IRQ有高的优先级,优先处理FIQ。#defineGLOBAL_CLK1#include#include#include"def.h"#include"option.h"#include"2440addr.h"#include"2440lib.h"#include"2440slib.h"#include"mmu.h"#include"profile.h"#include"memtest.h"voidkey_init(void);staticvoid__irqkey_handler(void);voidbeep_init(void);voidbeep_run(void);/*************************************************Functionname:delayParameter:timesDescription:延时函数Return:voidArgument:voidAutor&date:Daniel**************************************************/voiddelay(inttimes){inti,j;for(i=0;i

    时间:2018-11-12 关键词: mini2440 按键中断

  • MSP430按键中断Ⅱ

    #include typedef unsigned char uchar; typedef unsigned int uint; #define keyin (P1IN & 0X0F) #define wei_h P5OUT |= BIT5 #define wei_l P5OUT &= BIT5 #define duan_l P6OUT &= ~BIT6 #define duan_h P6OUT |= BIT6 uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //uchar num = 0; uint keyval=0; void delay(int z) { int i,j; for(i=z;i>0;i--) for(j=112;j>0;j--); } void display(uchar dat) { P4OUT = table[dat]; duan_h; duan_l; P4OUT = 0x00; wei_h; wei_l; } void main( void ) { // uint temp,keyval; P1IES = 0X0F; //下降沿触发 P1IE = 0X0F; P1DIR = 0XF0; P1OUT = 0X00; // P1DIR = 0XFF;P1OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0X00; P5DIR = 0XFF;P5OUT = 0XF7; P6DIR = 0XFF; _EINT(); // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; while(1) { LPM1; } } #pragma vector = PORT1_VECTOR __interrupt void PORT1_ISR(void) { if(P1IFG & 0X0F) { switch(P1IFG) { case 0x01: if(keyin == 0x0e) { delay(20); if(keyin == 0x0e) { while(keyin != 0x0f) keyval = 1; display(keyval); P1IFG = 0; //必须软件清除 return; } } case 0x02: if(keyin == 0x0d) { delay(20); if(keyin == 0x0d) { while(keyin != 0x0f) keyval = 1; display(keyval); P1IFG = 0; //必须软件清除 return; } } case 0x03: if(keyin == 0x0b) { delay(20); if(keyin == 0x0b) { while(keyin != 0x0f) keyval = 1; display(keyval); P1IFG = 0; //必须软件清除 return; } } case 0x04: if(keyin == 0x07) { delay(20); if(keyin == 0x07) { while(keyin != 0x0f) keyval = 1; display(keyval); P1IFG = 0; //必须软件清除 return; } } } } }

    时间:2018-10-30 关键词: MSP430 按键中断

  • STM32按键扫描/按键中断/外部中断

    接触STM32有一段时间了,也算是简单入了门,但由于一些原因,今天才来写本应该是入门级的按键相关程序,分为扫描模式和中断模式MCU:STM32F334C81.扫描模式首先配置按键引脚为上拉输入模式,根据原理图按键接PA0,按键没有按下的时候引脚输入为低电平0,按键按下输入高电平1,松开又回到低电平0然后在死循环中不断读取相应引脚的输入状态,并根据返回结果判断按键是否按下,做出相应处理下面的代码完成的功能是:按键第一次按下,点亮灯,再按一次,熄灭,重复。#include"Userkey.h"u8flag=0;voidkey_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);}voidkey_scanmode(void){key_GPIO_Config();while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){flag=~flag;if(flag)//第1?3?5,,次按下{GPIO_SetBits(GPIOB,GPIO_Pin_6);}else//第2?4?6,,,次按下{GPIO_ResetBits(GPIOB,GPIO_Pin_6);}}}}2.中断模式第一步和上面相同,将接按键的引脚配置为上拉输入,然后配置相应中断,PA0对应外部中断0功能:按键按下,点亮LED并向串口发送按键按下到PC,按键松开,关掉LED并发送按键松开voidkey_interruptmode(void){EXTI_InitTypeDefEXTI_InitStructure;NVIC_InitTypeDefNVIC_InitStruct;key_GPIO_Config();NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStruct);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);EXTI_ClearITPendingBit(EXTI_Line0);EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;EXTI_Init(&EXTI_InitStructure);}voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))//按键按下{GPIO_SetBits(GPIOB,GPIO_Pin_6);printf("按键按下n");//串口打印状态}else//按键松开{GPIO_ResetBits(GPIOB,GPIO_Pin_6);printf("按键松开n");}}EXTI_ClearITPendingBit(EXTI_Line0);}注:如果要实现和1一样的功能,将EXTI_Trigger改为上升沿或者下降沿,再改一下中断处理函数即可

    时间:2018-08-03 关键词: STM32 外部中断 按键扫描 按键中断

  • 使用STM32CubeMX开发三:按键中断实验

    硬件平台:stm32F407Zet6软件平台:stm32cubeMX 4.7+MDK5.14电路连接:PE8-LED0、PE9-LED1、PE10-LED2、PE11-LED3、PE12-KEY0、PE13-KEY1、PE14-KEY2、PE15-KEY3第一步、使用stm32cubeMX创建工程,选择相应的芯片,配置RCC、SYS、引脚和时钟如下图所示:注意,由于按键上有上拉电阻,这里选择中断模式的时候,我们选择下降沿触发中断。第二步,配置输出Keil工程第三步、编写程序下载验证STM32CubeMx把代码都生成了,查找函数,分析调用的过程,添加应用层代码就行首先在stm32f4xx_it.c文件中查找,所有的中断函数都是放在这个文件中的,代码如下:voidEXTI15_10_IRQHandler(void){HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15); }可以看出,这四个按键的中断触发后首先会调用这个函数,这个函数有调用HAL_GPIO_EXTI_IRQHandler,再看一下这个函数的原型voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin){if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=RESET){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}}__weakvoidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){}根据程序可以知道,当中断发生的时候会调用HAL_GPIO_EXTI_Callback();程序中只给出了一个虚函数,需要重新实现它,在main.c添加如下代码,来重新实现这个函数,来完成功能:voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){switch(GPIO_Pin){caseGPIO_PIN_12:LED0_Toggle();break;caseGPIO_PIN_13:LED1_Toggle();break;caseGPIO_PIN_14:LED2_Toggle();break;caseGPIO_PIN_15:LED3_Toggle();break;default:break;}}这样就实现了当按键中断发生的时候就反转灯的状态。

    时间:2018-08-02 关键词: stm32cubemx 按键中断

发布文章

技术子站

更多

项目外包