c语言中断函数作用,进一步理解中断函数
1.另一个外部中断
前面两讲都是围绕外部中断0(P3.2的功能)来讲解,这里我们也还有一个外部中断1(P3.3的功能)。P3.3要想实现上一讲的功能只需杜邦线接下面的IO端口即可
代码就是把“EX0”改为“EX1”,“IT0”改为“IT1”。
interrupt后面的0要改为2,函数名我们改为“EXTI1_IRQHandler()”#include
#include //详见第六章第8讲
void main()
{
IT1 = 1; //下降沿触发模式
EX1 = 1;
EA = 1;
LED_Init();//初始化LED硬件模块
while(1);
}
void EXTI1_IRQHandler() interrupt 2
{
LED2=!LED2;
}
再次提醒,杜邦线的一头接的是P3.3。
至于interrupt后面的数字为什么要为2,大家先熟悉这张图了解一下先
更多中断知识的概念参考《手把手教你学51单片机》文档6.5节。
2.按键触发中断
我们每次要把P3.2和P3.3外部拉低或释放,都需要拔插杜邦线,这样太麻烦,我们可以用按键来取代这些拔插动作,按键按下不放就相当于一直拉低,跟杜邦线一直插着GND一个效果,松开按键就跟杜邦线没插GND一样。
可是P3.2和P3.3没有直接相连的按键,不过没关系,我们把杜邦线这样接,让P3.3和P2.3一起相连,K4的按键动作可以使P2.3和P3.3同步电平
我们要用到按键,所以别忘了初始化按键模块。#include
#include //详见第六章第8讲
void main()
{
IT1 = 1; //下降沿触发模式
EX1 = 1;
EA = 1;
LED_Init();//初始化LED硬件模块
KEY_Init();//初始化按键功能模块
while(1);
}
void EXTI1_IRQHandler() interrupt 2
{
LED2=!LED2;
}
3.去抖动
按键似乎没能很灵敏的按一下松手LED2就跳变一次亮或灭的效果,那是因为我们没有延时消抖,一个按键动作就存在好几个下降沿了,导致中断函数被执行了几遍。
在中断函数中加延时就可以消除这种失灵现象了,不过在以后编程里不能在中断函数里使用延时,这样会使程序的执行效率大打折扣,我们本次只是作为测试代码才在中断函数里用延时。#include
#include //详见第六章第8讲
void main()
{
IT1 = 1; //下降沿触发模式
EX1 = 1;
EA = 1;
LED_Init();//初始化LED硬件模块
KEY_Init();//初始化按键功能模块
while(1);
}
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
delay_ms(50);//去抖动
if(INT1==0) //P3.3是否还处于低电平的稳定接触状态,INT1已在“#include ”中定义好了
{
LED2=!LED2;
}
}
这样就可以达到按下松手一次,LED2的状态只能取反一次的灵敏效果。如果我们一直按着不放,LED2也只是跳变一次而已,有点像不支持连按功能,这是因为“IT1=1;”的原因。
要是改为“IT1=0;”,这样K4按键就有种支持连按的感觉从而LED2就会不停闪烁了。按键按下一直不放就会不停地进入中断函数。#include
#include //详见第六章第8讲
void main()
{
IT1 = 0; //低电平状态下触发
EX1 = 1;
EA = 1;
LED_Init();//初始化LED硬件模块
KEY_Init();//初始化按键功能模块
while(1);
}
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
delay_ms(50);//去抖动
if(INT1==0) //P3.3是否还处于低电平的稳定接触状态
{
LED2=!LED2;
}
}
c语言中断函数作用,进一步理解中断函数相关推荐
- C++工作笔记-对友元函数的进一步理解
这里在GitHub上看redis相关的代码发现的.再次记录下. 友元的特点就是他是普通函数,并不是成员函数.他可以调用这个类的私有成员. 这里有个实际用法: 如上的redisAsyncCommand函 ...
- python关于函数作用的描述_Python函数的概念和使用
函数 为了便于程序的维护和更好的实现模块化,好的程序都会分解为很多函数. 可以这么说,对于任何的编程语言,函数都是一个非常重要的概念. python 不仅简化了函数的定义过程,而且还大量借鉴了其他函数 ...
- C++工作笔记-对纯虚函数的进一步理解(作用)
对纯虚函数的理论不再说明. 本篇博文是为了说明他这个功能 代码如下: #include <iostream> #include <QString> #include <Q ...
- c语言fwrite函数作用,C 库函数 - fwrite()函数
fwrite()函数是c语言标准库中的一个文件处理函数,fwrite库调用与fread有相似的接口,它从指定的数据缓冲区里取出数据记录,并把它们写到输出流中,它的返回值是成功写入的记录个数.它有什么作 ...
- 【深度学习框架】Tensorflow Session.run()函数的进一步理解
在tensorflow中session.run()用来将数据传入计算图,计算并返回出给定变量/placeholder的结果. 在看论文代码的时候遇到一段复杂的feed_dict, 本文记录了对sess ...
- c语言怎么快速读出函数作用,读文件fread函数的用法
与fwrite是一对,读文件的函数fread的函数原型如下:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) fread ...
- socket编程——进一步理解accept函数
在前面的文章<TCP套接字编程--常用函数小结>中,我们分析了socket的常用函数,其他的函数,我们还比较容易理解,但是accept函数的意义容易被忽略.我们来总结下使用要点: 1)ac ...
- c语言rewind函数作用,C 文件 rewind() 函数
C 文件 rewind() 函数 rewind()函数将文件指针设置在流的开头.如果必须多次使用流,这很有用. 语法: void rewind(FILE *stream) 文件:file.txtthi ...
- abs在c 语言中的作用是什么,abs()函数以及C ++中的示例
C ++abs()函数 abs()函数是cmath标头的库函数,用于查找给定数字的绝对值,它接受一个数字并返回绝对值. 注意: abs()函数也在头文件中声明,但它与整数值兼容,在C ++ 11中,a ...
- C++工作笔记-对二级指针的进一步理解(函数的参数使用二级指针,从而操作原数据)
二级指针不仅仅可以表示一个二维表(在邻接表里面用得比较多)! 当参数是一级指针的时候得到了是指向了同一个地址! 但参数是二级指针却有不同的效果! 如下代码: main.cpp #include< ...
最新文章
- LeetCode 860.柠檬水找零(C++)
- mysql 磁盘组_AIX使用LV创建ASM磁盘组
- IT人经常围观精品站点推荐
- 嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX
- 第二章 数据的表示和运算 2.1.5 汉明(海明)校验码 [计算机组成原理笔记]
- 【训练过程】1) Create Training File(创建训练文件)
- asp.net 开发知识小结【转】
- redis缓存失效及解决方案
- 【答辩问题】计算机专业本科毕业设计答辩自述2
- 在win7在结构cocos2d-x v3.2rc0开发环境(For Android)
- (转载)Memcached预定义常量
- 2T架构师学习资料干货分享
- 在Python里安装Jieba中文分词组件
- Multisim仿真—恒流源电路(二)
- ABBYY FineReader 15 安装教程
- Ansible9:变量之Fact
- MAC电脑DNS劫持解决方法
- 学习笔记(3):PS教程-【和东东一起学PS】Photoshop 2020小白到高手(任务驱动式基础+实战教学)-【免费试看】PS软件的必要首选项设置
- maven报错:Failed to execute goal on project ...: Could not resolve dependencies for project ...
- 华视电子web读取身份证信息