按键中断
- 格式:doc
- 大小:18.00 KB
- 文档页数:3
实验二按键中断实验一、实验目的了解中断的含义二、实验内容板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。
三、实验仪器、设备计算机、开发板、keil软件四、硬件设计在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示键盘部分如下图所示:例程所用到的列扫描线:PC5,PC2,PC3。
例程所用到的行扫描线(EXTI中断线):PE2。
五、实验要求和步骤开发板上有3个蓝色状态指示灯V6(LED1),V7(LED2),V8(LED3),通过对应的按键K1-K3,控制LED的亮灭,将PE2引脚配置为外部中断,当其上出现下降沿时产生一个中断,根据扫描PC5,PC2,PC3来判别是哪个按键按下。
首先我们了解一下什么是外部中断/事件控制器(EXTI)。
外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。
每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。
每个输入线都可以被独立的屏蔽。
挂起寄存器保持着状态线的中断要求。
EXTI控制器的主要特性如下:每个中断/事件都有独立的触发和屏蔽每个中断线都有专用的状态位支持多达19 个中断/事件请求检测脉冲宽度低于APB2 时种宽度的外部信号如要产生中断,中断线必须事先配置好并被激活。
这是根据需要的边沿检测通过设置2个触发寄存器,和在中断屏蔽寄存器的相应位写“1”到来允许中断请求。
当需要的边沿在外部中断线上发生时,将产生一个中断请求,对应的挂起位也随之被置1。
通过写“1”到挂起寄存器,可以清除该中断请求。
为产生事件触发,事件连接线必须事先配置好并被激活。
这是根据需要的边沿检测通过设置2个触发寄存器,和在事件屏蔽寄存器的相应位写“1”到来允许事件请求。
当需要的边沿在事件连线上发生时,将产生一个事件请求脉冲,对应的挂起位不被置1。
嵌入式中断按键实验报告本实验的目的是学习如何在嵌入式系统中使用中断来处理按键输入。
通过该实验,我们可以掌握如何配置和使用中断,以及如何编写中断服务程序来处理按键输入。
实验材料:1. 嵌入式开发板2. 按键模块3. 电源适配器实验步骤:1. 将按键模块连接到嵌入式开发板的GPIO引脚上,确保连接正确。
2. 打开开发板的开关,给开发板供电。
3. 在开发板上配置GPIO引脚作为中断输入,并使能中断。
4. 编写中断服务程序来处理按键输入。
当按键被按下时,中断服务程序将被调用,并执行相应的操作。
5. 在主程序中初始化中断服务程序,并进入一个无限循环。
在该循环中,可以进行其他的操作,并等待按键中断的发生。
实验结果:在实验中,我们成功地配置并使用了中断来处理按键输入。
当按键被按下时,中断服务程序被调用,并执行了相应的操作。
讨论与分析:通过该实验,我们学习到了中断的基本原理和使用方法。
中断是一种非常重要的机制,可以使嵌入式系统更高效地响应外部事件。
在实际的嵌入式应用中,按键输入是非常常见的操作,使用中断可以很好地处理按键输入,提高系统的响应速度和可靠性。
然而,中断也存在一些问题。
首先,中断处理需要一定的时间,在高速的系统中,中断的处理时间可能会影响到系统的性能。
另外,当系统存在多个中断源时,中断处理的优先级和调度也需要仔细设计,以确保系统的正常运行。
总结:通过本实验,我们成功地学习了嵌入式系统中使用中断处理按键输入的方法。
中断是一种重要的机制,可以使系统更高效地响应外部事件。
通过合理地设计和使用中断,可以提高系统的性能和可靠性。
在实际的嵌入式应用中,我们应该根据具体的需求和系统条件来选择最合适的中断处理方法,并进行适当的优化和调试。
总结按键输入外部中断请求信号存在的问题与解决方法外部中断是嵌入式系统中常见的一种事件响应机制,可以通过外部设备发出的中断信号来触发处理器执行相应的中断服务程序。
在实际的应用中,按键输入作为一种常见的外部中断源,经常被应用于用户交互和控制系统中。
然而,按键输入外部中断请求信号也会带来一些问题,包括抖动、冲突以及消隐等,并且需要针对这些问题采取相应的解决方法。
按键输入外部中断请求信号存在的问题主要包括抖动、冲突和消隐,下面将逐一介绍这些问题及解决方法。
一、抖动问题按键抖动是指在按下或释放按键的瞬间,由于机械结构的弹性特性或者接触点的不良接触,会导致按键信号在短时间内多次震动,造成中断信号的多次触发,使得系统产生误操作或者多次中断的情况。
解决按键抖动问题的方法主要包括软件滤波和硬件滤波。
1、软件滤波软件滤波是通过在中断服务程序中增加延时、状态检测等手段来解决按键抖动问题的方法。
通过在中断服务程序中增加延时等操作,可以排除由于按键抖动造成的多次中断信号的干扰,确保系统的稳定性和可靠性。
然而,软件滤波需要占用处理器的执行时间和资源,容易影响系统的实时性和响应速度。
2、硬件滤波硬件滤波是采用电路设计来解决按键抖动问题的方法。
通过在按键输入信号的引脚上接入RC滤波电路、反嵌二极管等元件,可以有效地减少按键抖动造成的中断信号的干扰,确保系统对按键输入信号的正确响应。
相比于软件滤波,硬件滤波可以减轻处理器的负担,提高系统的实时性和响应速度。
二、冲突问题按键冲突是指在多个按键同时按下或释放的情况下,会产生错误的中断信号或者无法正确识别所触发的按键,导致系统的误操作或功能执行异常。
解决按键冲突问题的方法主要包括硬件防抖和编码解码电路。
1、硬件防抖硬件防抖是通过在按键输入信号的引脚上接入双稳态触发器或者滤波电路等元件来解决按键冲突问题的方法。
通过这些电路设计,可以确保在多个按键同时按下或释放的情况下,系统可以正确识别并执行相应的中断服务程序,确保系统的稳定性和可靠性。
单片机中断实现按键一、引言在嵌入式系统中,往往需要通过外部输入设备如按键来与系统进行交互。
为了能够及时响应按键操作,避免忙等的情况发生,通常会使用中断技术来实现按键的检测和处理。
本文将介绍如何使用中断来实现按键检测,并具体以8051单片机作为示例进行说明。
二、中断基础知识在单片机中,中断是一种由硬件触发的特殊事件,当一些中断条件满足时,单片机会暂停当前任务,跳转到中断服务程序中执行对应的处理代码,待中断处理结束后再返回到原来的任务中。
中断的触发方式一般有两种:外部触发中断和内部触发中断。
对于按键这种外部输入设备,一般通过外部触发中断来实现。
三、实现原理1、按键电路:按键通常由一个导电片和两个触点组成,平时靠两个触点之间的弹簧将导电片与触点隔开,当按下按键时,弹簧压缩,导电片与触点接触形成通路。
为了能够检测按键操作,需要将按键引脚连接到单片机的外部中断引脚上。
2、中断设置:在单片机的程序中,需要设置好相应的中断向量表和中断服务程序。
中断向量表是一个存放中断服务程序地址的表格,当中断触发时,单片机会根据中断号从中断向量表中找到相应的中断服务程序地址并跳转到该地址执行对应代码。
3、中断触发条件:在按键电路中,按键的两个触点状态变化(从断开到接通或从接通到断开)时会产生干扰信号,为了避免干扰,通常会使用软件消抖技术。
当按键被按下,并经过一段时间的消抖后,会产生一个稳定的按键信号,此时可以检测到按键变化,并触发相应的中断。
四、实现步骤1、硬件连接:将按键引脚连接到单片机的外部中断引脚上。
2、中断设置:在单片机的程序中,需要设置中断的相关寄存器,包括中断向量表和中断控制寄存器。
中断向量表保存中断服务程序的入口地址,中断控制寄存器用于设置中断触发条件和中断优先级等参数。
3、中断服务程序:编写中断服务程序,在按键中断触发时执行对应的处理代码。
中断服务程序一般需要包括中断触发条件的判断和处理代码的执行。
4、主程序:在主程序中调用中断服务程序,并添加相应的处理代码,实现按键操作的具体功能。
一、实验目的1. 熟悉单片机中断系统的工作原理和中断响应过程。
2. 掌握使用外部中断实现单个按键控制的实验方法。
3. 学习通过编程设置中断源、中断优先级和中断服务程序。
二、实验原理单片机的中断系统允许CPU在执行程序的过程中,暂停当前程序的执行,转而处理由外部事件引起的中断请求。
在本实验中,我们使用外部中断0(INT0)来实现单个按键的控制。
当按键按下时,通过外部中断0引脚(P3.2)向CPU发送中断请求。
CPU响应中断后,暂停当前程序的执行,转而执行外部中断0的中断服务程序(ISR)。
在中断服务程序中,我们可以根据按键的状态来执行相应的操作,例如点亮或熄灭LED灯。
三、实验设备1. 单片机开发板(如STC89C52)2. 按键3. LED灯4. 连接线5. 仿真软件(如Keil uVision)四、实验步骤1. 硬件连接:- 将按键的一个引脚连接到单片机的P3.2引脚(外部中断0)。
- 将按键的另一个引脚连接到地(GND)。
- 将LED灯的正极连接到单片机的P1.0引脚,负极连接到地(GND)。
2. 编写程序:- 使用Keil uVision软件编写程序。
- 初始化外部中断0,设置中断优先级和中断服务程序。
- 编写中断服务程序,根据按键状态控制LED灯的亮灭。
3. 编译程序:- 使用Keil uVision软件编译程序,生成可执行文件。
4. 下载程序:- 将编译好的程序下载到单片机开发板上。
5. 运行程序:- 观察按键按下时LED灯的亮灭状态,验证中断功能是否正常。
五、实验代码```c#include <reg52.h>#define LED P1_0#define BUTTON P3_2void main(void) {EA = 1; // 开启总中断EX0 = 1; // 开启外部中断0IT0 = 1; // 设置外部中断0为下降沿触发while (1) {// 主循环,等待中断}}void ext0_isr(void) interrupt 0 {LED = !LED; // 切换LED灯状态}```六、实验结果与分析1. 实验结果:- 按键按下时,LED灯亮;按键释放时,LED灯灭。
STM32按键中断(HAL库版)
本文将介绍如何使用STM32F4的IO口作为中断触发源,通过串口显示按键被按下的日志。
一、运用到的资源、工具:
1.1开发板芯片STM32F407,PI9作为外部中断源、USART3串口向屏幕传输信息
1.2编译工具:MDK-ARM V5(keil5)
1.3辅助工具:STM32CubeMX
二、硬件设计
2.1原理图:
三、软件设计
3.1STM32cubeMX配置工程文件
选择Key1作为外部中断源、选择中断触发方式为下降沿触发、并设置中断优先级分组选择优先级
使能USART3串口配置为异步通信
最后生成工程文件
3.2串口输出重定向(重写fputc函数)
int fputc(int ch, FILE *p)
{
while(!(USART3->SR & (1 << 7)));USART3->DR = ch;
return ch;
}
3.3在中断回调函数中,打印KEY1 DOWN\n
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_9)
{
HAL_Delay(40);
if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_9) == 0)
{
printf("KEY1 DOWN\n");
}
}
}
四、代码及运行结果
4.1运行结果按下KEY1、打印一次KEY1 DOWN。
《嵌入式系统》课程实验报告学生姓名:所在班级:指导教师:记分及评价:一、实验名称按键中断实验二、实验目的通过实验掌握S3C2410X的中断控制寄存器的使用;通过实验掌握S3C2410X处理器的中断响应过程;通过实验掌握ARM处理器的中断方式和中断处理过程;通过实验掌握ARM处理器中断处理的软件编程方法。
三、实验内容编写程序,当用户在实验箱按下KEY1键或KEY2键时在中断服务子程序中将相关信息打印到串口中,显示在超级终端上。
四、实验原理在本实验平台的主板上设计了两个外部按键,电路原理图如下:EXINT0和EXINT1信号作为CPLD芯片的输入信号。
CPLD内部逻辑图:五、实验结果超级终端上显示以下信息:按下KEY1键或KEY2键,超级终端上显示以下信息。
六、练习题编写程序实现:按下KEY1或KEY2后点亮实验系统的LEDs一段时间后熄灭。
任务:按下KEY1键后LED1点亮一段时间后熄灭;按下KEY2键后点亮LED2一段时间后熄灭。
#define rCPLDIntControl (*(volatile unsigned char*)0x22600000)#define rCPLDIntStatus (*(volatile unsigned char*)0x22200000)#define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000)void __irq int_int(void){unsigned char Status;int i;Status = rCPLDIntStatus;Status = ~(Status & 0x6);if(Status & 0x2){uart_printf(" Eint0 interrupt occurred.\n");rCPLDLEDADDR = (rCPLDLEDADDR | 0xFF )& 0xFE;for(i = 0; i < 100000; i++);rCPLDLEDADDR = rCPLDLEDADDR | 0xFF ;}else if(Status & 0x4){uart_printf(" EINT1 interrupt occurred.\n");rCPLDLEDADDR =(rCPLDLEDADDR | 0xFF) & 0xFD;for(i = 0; i < 100000; i++);rCPLDLEDADDR = rCPLDLEDADDR | 0xFF ;}rEINTPEND=(1<<9);ClearPending(BIT_EINT8_23);}。
南通大学实验报告院系:计算机科学与技术姓名:课程名称:接口技术成绩:学号:1213022013指导教师:李跃华同组实验者:实验日期:2014-5-7实验名称:键盘中断实验一.实验目的1.熟练运用CodeWarrior 嵌入式开发系统环境、C 语言、调试方式。
2.复习串行通信接口(SCI)的内容。
3.加强键盘中断基本原理及编程原理的理解。
4.理解“行扫描”法的原理并能进行键值识别和键值编码二.实验内容键盘的c 语言编程:1)初始化,先按IO 口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输入口的键盘功能初始化相应的寄存器。
2)定义键值表3)扫描一次,读取键值4)获得键盘定义值行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。
这样就可以确定是哪一行哪一列交点的键被按下。
2. 软件设计三程序流程图四编程1.内核定时器中断void tpm0_isr(void){static uint_32 TPMCounter = 0; //计时器uint_8 value; //键盘变量static uint_8 LEDindex=0; //位选口声明uint_8 LEDDataBuffer[4]; //LED显示缓冲区uint_8 i;//LED缓冲区赋值LEDDataBuffer[0]='0';LEDDataBuffer[1]='2';LEDDataBuffer[2]='3';LEDDataBuffer[3]='5';//LCD显示缓冲区,其中.表示按下的数字uint_8 kbv[32]="The keyboard you just input is .";if((TPM_SC_REG(TPM0_BASE_PTR) & TPM_SC_TOF_MASK) == TPM_SC_TOF_MASK) {TPMCounter++;}BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_P TR)); //中断置标志位写1清0//处理LED部分LEDindex++;//位选位+1if (LEDindex>=4) LEDindex=0; //大于4位选口置0i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0');//转码LEDshow1(LEDindex,i);//显示LEDif(TPMCounter>100){TPMCounter = 0;//键盘得到扫描值value = KBScanN(2);//扫描键值,存于value中if(KBDef(value) != 0xff) //发送键值{//修改.成为按键值kbv[31] = KBDef(value);//通过LCD显示出来LCDShow(kbv);uart_send_string(UART_2,kbv);//键盘发送信息}}}2.程序的入口int main(void){//1.声明主函数使用的局部变量uint_8 * g_DispalyInit;//2.关总中断enter_critical();//3.初始化底层模块uart_init (UART_1,BUSCLK, 9600); //串口1初始化, 总线时钟24000Khz,波特率9600LEDInit();//LED初始化LCDInit();//LCD初始化KBInit(); //键盘初始化tpm_init(TPM0,TPM_CLKSRC_PLL,1000);//初始化TPM模块,1ms中断一次//4.缓冲区赋值g_DispalyInit = (uint_8 *)"Wait Receiving..Soochow 2013.01.";//5.开中断tpm_enable_int(0);init_critical();//6.lcd显示初始字符LCDShow(g_DispalyInit);//================================= ================================== ========for(;;){}//============================================return 0;}四.实验小结在这次实验中主要让我们熟悉掌握gpio口通信的知识,在熟悉代码的前提下在主函数里初始化波特率何在中断函数里添加一个接收函数就可以。
简谈单片机检测按键原理和中断按键检测的办法单片机检测按键原理首先说一下独立键盘检测,在单片机外围电路中,通常用到的按键都是机械弹性开关,当开关闭合时,线路导通,开关断开时,线路断开。
单片机检测按键的原理:按键的一端接地,另一端与单片机的某个I/O口相连,开始先给I/O赋一高电平,然后让单片机不断检测该I/O口是否变为低电平,当按键闭合时,相当于I/O口与地相连,就会变为低电平。
在单片机检测按键是否被按下时,电压的实际波形与理想波形时有一点=定差别的,波形在按下和释放瞬间都有抖动现象,抖动时间的长短和按键的机械特性有关。
所以单片机在检测键盘是否被按下都要加上去抖操作,所以在编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时。
独立键盘与单片机连接时每一个按键都需要一个I/O口,会过多占用I/O口资源。
所以就引出了矩阵键盘。
矩阵键盘的连接方式,每一行将每个按键的一端连接在一起构成行线,每一列将按键的另一端连接在一起构成列线。
这样的话,16个按键排成4行4列就只要8根线。
它的按键检测,简单点说,就是先送一列低电平,其余均为高电平,然后轮流检测,确认行列。
这里就要提到另外一个东西,switch-case语句又称开关语句,它是一个专门用于处理多分支结构的条件选择语句。
使用switch语句可直接处理多个分支。
按键检测是初学单片机的同学玩的前几个例程,按键的种类有许多(普通按钮,矩阵键盘等等),按键检测的方法也有许多。
对于普通按钮当然你会说设计一个外围电路通过GPIO 口读一下还不简单,或许你说通过外部中断做边沿检测,对于矩阵键盘来说,往往你会通过行列分别扫描的方法做按键检测,通常我们会加一个按键防抖(经典的方法是通过延时二次确认的方法进行按键防抖,还有就是按键释放的时候你可能会通过while语句去防抖,也就是按键如果一直按下,让程序一直死在while里),这些都是初学者常用的方法,但是如果是一个大的程序,往往是不允许你有这么多延时和死循环的。
河南机电高等专科学校《嵌入式系统开发》课程实验报告系部:电子通信工程系班级:电信1##姓名: ######学号: 120######实验三按键实验(中断方式)一.实验简介在实验一的基础上,使用按键控制流水灯。
二.实验目的熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。
三.实验内容实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。
下载代码到目标板,查看运行结果。
四.实验设备硬件部分:PC计算机(宿主机)、STM32实验板。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤1在实验一代码的基础上,编写中断初始化代码2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序3编写中断服务程序4编译代码,下载到实验板5.单步调试6记录实验过程,撰写实验报告六.实验结果及测试中断方式的按键式实验,是通过配置外部中断寄存器和中断嵌套(NVIC)控制器来实现按键按下控制LED灯亮灭。
通过按键中断打断主函数,执行LED1取反一次。
主函数初始化中断配置和LED配置,点亮LED1后一直等待中断,每中断一次,LED1取反一次。
int main(void){LED_GPIO_Config();LED1_ON;CLI();SEI();EXTI_PA0_Config();while(1){}}中断嵌套控制寄存器的配置为中断嵌套分组1;抢占优先级0;响应优先级0 代码如下:void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}外部中断按键的配置源码如下:配置PA0位中断线,并使能AFIO时钟void EXTI_PA0_Config(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);NVIC_Configuration();GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}产生中断后程序进入中断服务子程序,将LED1取反,并软件清除标志位,中断服务子程序如下:void EXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0) != RESET){LED1_TOGGLE;EXTI_ClearITPendingBit(EXTI_Line0);}}七.实验总结通过这次实验,课程知识的实用性很强,因此实验就显得非常重要,刚开始做实验的时候,由于自己的理论知识基础不好,在实验过程遇到了许多的难题,也使我感到理论知识的重要性。
按键中断的基本原理是什么按键中断的基本原理是一种硬件和软件交互的机制,用于处理输入设备(如键盘)的按键事件。
当用户按下或释放按键时,输入设备会产生一个电信号,这个信号会通过硬件电路传递给中央处理器(CPU)。
CPU会识别这个信号,并触发一个中断请求,通知操作系统有一个按键事件需要处理。
按键中断是一种异步事件,其工作原理如下:首先,输入设备(如键盘)与计算机主板上的键盘控制器相连。
键盘控制器是一个专门的硬件电路,负责接收和转换来自键盘的电信号,并将其发送给中央处理器。
当用户按下键盘上的一个按键时,该按键对应的电路会发出一个电信号。
这个信号通过键盘控制器传递给中央处理器,引发一个中断请求。
中央处理器收到中断请求后,会暂停当前正在执行的任务,并保存当前的状态。
然后,CPU会跳转到一个预先定义好的中断处理程序,该程序负责处理接收到的中断请求。
中断处理程序会根据中断类型来判断是哪个输入设备触发了中断。
对于按键中断,程序会读取键盘控制器的状态,并从中获取被按下的按键的信息,如键值、按键状态等。
接下来,中断处理程序会将获取到的按键信息传递给操作系统的相关模块进行处理。
操作系统可以通过查找按键的映射表,将按键的物理码(即键值)转换为对应的字符或命令。
然后,操作系统可以根据按键的状态(按下或释放)执行相应的操作,比如打印字符、执行命令等。
在处理完按键事件后,中断处理程序会返回到中断被触发前的状态,并恢复CPU 执行之前的任务。
按键中断的基本原理是利用中断请求机制实现的。
中断请求是一种特殊的信号,可以打断CPU的正常执行流程,引发特定的中断处理程序。
通过按键中断,CPU可以及时响应用户的输入,而不需要依赖轮询等方式来主动查询键盘状态。
这种异步的事件驱动方式可以提高系统的响应速度和效率,同时也可以减少CPU的负担,使其能够处理其他任务。
stm32 之中断按键初始化(注意事项)之前做终端按键的时候都是只做了一个,没有做多个,昨天在把所有按键都设置成中断模式的时候遇到问题,于是乎还跟一个网上的哥们进行了热议,后来还是我发现了问题!最终把问题给解决了!我的按键的GPIO连接有点奇葩,他不是连续的,这可能就是竞赛板故意设置的难度吧!首先管脚初始化:[cpp]view plaincopyprint?1. GPIO_InitTypeDef key;2.3. RCC->APB2ENR |= ((1<<0)|(1<<2)|(1<<3));4.5. key.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;6. key.GPIO_Mode = GPIO_Mode_IPD;7. GPIO_Init(GPIOA, &key);8.9. key.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;10. key.GPIO_Mode = GPIO_Mode_IPD;11. GPIO_Init(GPIOB, &key);全部设置成输入模式,AFIO再时钟使能的时候不要忘记了!这里我就不多说了!然后就是中断组设置:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC初始化:[cpp]view plaincopyprint?1. key_nvic.NVIC_IRQChannel = EXTI0_IRQn;2. key_nvic.NVIC_IRQChannelCmd = ENABLE;3. key_nvic.NVIC_IRQChannelPreemptionPriority = 0;4. key_nvic.NVIC_IRQChannelSubPriority = 1;5. NVIC_Init(&key_nvic);重点都不在这,值得注意的是下面:我第一次在配置EXTI Line的时候这样配置!GPIO_EXTILineConfig(GPIO_PortSourceGPIOA|GPIO_PortSourceGPIOB,\ GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource8); 大致一看,貌似很正常啊!但是问题就出在这!我们跳转到GPIO_PinSourcex和GPIO_PortSourceGPIOx哪里看看:[cpp]view plaincopyprint?1. #define GPIO_PortSourceGPIOA ((uint8_t)0x00)2. #define GPIO_PortSourceGPIOB ((uint8_t)0x01)3. #define GPIO_PortSourceGPIOC ((uint8_t)0x02)4. #define GPIO_PortSourceGPIOD ((uint8_t)0x03)5. #define GPIO_PortSourceGPIOE ((uint8_t)0x04)6. #define GPIO_PortSourceGPIOF ((uint8_t)0x05)7. #define GPIO_PortSourceGPIOG ((uint8_t)0x06)[cpp]view plaincopyprint?1. #define GPIO_PinSource0 ((uint8_t)0x00)2. #define GPIO_PinSource1 ((uint8_t)0x01)3. #define GPIO_PinSource2 ((uint8_t)0x02)4. #define GPIO_PinSource3 ((uint8_t)0x03)5. #define GPIO_PinSource4 ((uint8_t)0x04)6. #define GPIO_PinSource5 ((uint8_t)0x05)7. #define GPIO_PinSource6 ((uint8_t)0x06)8. #define GPIO_PinSource7 ((uint8_t)0x07)9. #define GPIO_PinSource8 ((uint8_t)0x08)10. #define GPIO_PinSource9 ((uint8_t)0x09)11. #define GPIO_PinSource10 ((uint8_t)0x0A)12. #define GPIO_PinSource11 ((uint8_t)0x0B)13. #define GPIO_PinSource12 ((uint8_t)0x0C)14. #define GPIO_PinSource13 ((uint8_t)0x0D)15. #define GPIO_PinSource14 ((uint8_t)0x0E)16. #define GPIO_PinSource15 ((uint8_t)0x0F)我们来计算下:GPIO_PortSourceGPIOA | GPIO_PortSourceGPIOB = 0x00 | 0x01 = 0x01 =GPIO_PortSourceGPIOBGPIO_PinSource0 | GPIO_PinSource1 | GPIO_PinSource2 | GPIO_PinSource8 = 0x00 | 0x01 | 0x02 | 0x08 = 0x0b = GPIO_PinSource11所以我最后初始化后的中断就成为:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);最终让我事与愿违了。
按键和中断1.8.1.什么是按键1.8.1.1、按键的物理特性(1)、平时没⼈按的时候,弹簧把按键按钮弹开。
此时内部断开的。
(2)、有⼈按下的时候,⼿的⼒量克服弹簧的弹⼒,将按钮按下,此时内部保持接通(闭合)状态;如果⼿拿开,则弹簧作⽤下按钮⼜弹开,同时内部⼜断开。
(3)、⼀般的按键都有4个引脚,这4个引脚成2对:其中⼀对是常开触点(像上⾯描述的不按则断开,按下则闭合);⼀对是常闭触点(平时不按时是闭合的,按下后是断开的)1.8.1.2、按键的电学原理(结合原理图分析)(1)硬件接法: SW5:GPH0_2 SW6:GPH0_3 SW78910:GPH2_0123(2)按键的电路连接分析:平时按钮没有按下时,按钮内部断开,GPIO引脚处电压为⾼电平;当有⼈按下按钮时,按钮内部导通,外部VDD 经过电阻和按钮连接到地,形成回路,此时GPIO引脚处电压就变成了低电平。
此时VDD电压全部分压在了电阻上(这个电阻就叫分压电阻,这个电阻不能太⼩,因为电阻的功率是U*U/R)(3)总结:按键的⼯作⽅法:其实就是按键的按下与弹开,分别对应GPIO的两种电平状态(按下则GPIO为低电平,弹开则GPIO为⾼电平)。
此时SoC内部可以通过检测这个GPIO的电平⾼低来判断按键有没有被按下,这个判断结果即可作为SoC的输⼊信号。
1.8.1.3、按键属于输⼊类设备(1)按键⼀般⽤来做输⼊设备(由⼈向SoC发送信息的设备,叫输⼊设备),由⼈向SoC发送按键信号(按键信号有2种:按下信号和弹开信号)。
(2)有些设备就是单纯的输⼊设备,譬如按键、触摸屏等;有些设备就是单纯的输出设备,譬如LCD;还有⼀些设备是既能输⼊⼜能输出的,叫输⼊输出设备(IO),譬如串⼝。
1.8.1.4、按键的2种响应⽅法(1)SoC处理按键有2种思路:轮询⽅式和中断⽅式。
(2)轮询⽅式,就是SoC主动的每隔⼀段时间去读取(按键所对应的)GPIO的电平⾼低,以此获得按键信息;缺点在于CPU要⼀直注意按键事件,会影响CPU做其他事情。
204.键盘上的prtsc,scrlk,pause键作⽤⼀、pause功能键 pause功能键即pause break功能键,它⼜被叫做是中断暂停键,它的位置在键盘的中央,位于字母键的右边,数字键的左边,它的下⾯是insert键、home键、pgup键、delete键等等,与它相连接的按键有prtsc SysRq键、scroll lock键。
pause break键的功能是实现程序在执⾏过程当中的暂停操作或者是中⽌操作。
pause break中断暂停功能键在我们⽇常使⽤计算机的过程当中,作⽤不是很⼤,因为pause break中断暂停功能键可以中断的程序是有限的,可以使⽤它中断暂停的程序必须是特定的。
同时将pause break中断暂停功能键和win按键按下,这时的功能是将系统属性窗⼝打开。
⼆、prtsc SysRq功能键: prtsc SysRq功能键也被叫做是印屏幕或者是打屏键,它的功能是打印整个计算机屏幕的形状,和截屏产⽣的效果⼀样,将prtsc SysRq功能键按下以后就会将计算机的整个屏幕形状都保存到剪切板当中,使⽤快捷键ctrl+v就可以将它粘贴。
alt+PrtSc SysRq的作⽤是截取当前窗⼝的形状并保存到剪切板当中,同样使⽤Ctrl+v即可将其粘贴。
三、scroll lock功能键: scroll lock功能键⼜叫做屏幕锁定键,可以运⽤于excel表格的制作当中,将scroll lock功能键按下以后,使⽤上下键可以将光标锁定,同时还能翻动页⾯,但是不按下此键,就不能移动页⾯,⽽只是将光标锁定⽽ 键盘功能键介绍:print、scroll lock、pause组合键PrtSc SysRq/print screen sysrp 1.PrtSc SysRq/print screen sysrp,⼜称印屏幕/打屏键,主要是作⽤是可以将电脑整个屏幕形状打印出来,,就是截屏的作⽤,按下可将电脑整个屏幕放置到剪切⾯板,按ctrl+v可粘贴出来!例如粘贴到qq聊天窗⼝、画图软件等。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LED PORTB
#define LED_dir DDRB
#define KEY1 PTIH_PTIH3
#define KEY2 PTIH_PTIH2
#define KEY3 PTIH_PTIH1
#define KEY4 PTIH_PTIH0
#define KEY1_dir DDRH_DDRH3
#define KEY2_dir DDRH_DDRH2
#define KEY3_dir DDRH_DDRH1
#define KEY4_dir DDRH_DDRH0
unsigned char data=0x01;
unsigned char direction=1; //设置灯亮的方向,0向左,1向右。
unsigned char time=5; //设置灯闪的速度。
/*************************************************************/ /* 延时函数*/ /*************************************************************/ void delay(unsigned int n)
{
unsigned int i,j;
for(j=0;j<n;j++)
for(i=0;i<40000;i++)
;
}
/*************************************************************/ /* 初始化LED灯*/ /*************************************************************/ void init_led(void)
{
LED_dir=0xff; //设置为输出
LED=~data; //点亮LED1
}
/*************************************************************/ /* 初始化按键*/ /*************************************************************/ void init_key(void)
{
KEY1_dir =0; //设置为输入
KEY2_dir=0;
KEY3_dir=0;
KEY4_dir=0;
PPSH = 0x00; //极性选择寄存器,选择下降沿;
PIFH = 0x0f; //对PIFH的每一位写1来清除标志位;
PIEH = 0x0f; //中断使能寄存器;
}
/*************************************************************/
/* 按键中断函数*/
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PTH_inter(void)
{
if(PIFH != 0) //判断中断标志
{
PIFH = 0xff; //清除中断标志
if(KEY1 == 0) //按键1按下
{
time-=1;
if(time==0)
time=1;
}
if(KEY2 == 0)
{
time+=1;
if(time>10)
time=10;
}
if(KEY3 == 0)
direction=0;
if(KEY4 == 0)
direction=1;
}
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数*/
/*************************************************************/ void main(void) {
DisableInterrupts;
init_led();
init_key();
EnableInterrupts;
for(;;)
{
delay(time);
if(direction==1)
{
data=data<<1; //左移一位
if(data==0)
data=0x01;
}
else
{
data=data>>1; //右移一位
if(data==0)
data=0x80;
}
LED = ~data;
}
}。