合泰杯——合泰单片机工程4之外部中断

合泰杯——合泰单片机工程4之外部中断


前言

继上一次的按键输入工程,这一次我们来利用按键来进行外部中断实验,当按键按下时,单片机去执行中断函数的程序,也就是点亮或者熄灭LED灯,LED灯我使用的是LED2。来看一下程序如何进行编程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、中断初始化函数

  • 先来看一下头文件,也就是exti.h,头文件没有啥的,像上一个例程的一样,加了条件编译和引入的单片机的头文件,及声明了中断初始化函数和中断函数
#ifndef __EXTI_H
#define __EXTI_H	
#include "HT66F2390.h"

void Exti_Init(void);   //中断初始化函数
DEFINE_ISR(ISR_Int0,0x04);

#endif
  • 再来看一下exti.c文件
#include "exti.h"
#include "LED.h"

/*
中断初始化函数
*/

void Exti_Init(void)
{
	_emi =1 ; //开启总中断
	_int0e =1 ;//开启外部中断0中断
	_integ = 0b00000010; //外部中断0为下降沿触发模式
	_pac1 =1;    //pa1引脚设置为输入模式
	_papu1 =1;   //设置为上拉模式
	_int0ps = 0;	   //技术手册第109页,中断0的输入引脚选择pa1
}

/*
外部中断0函数,中断的向量为0x04,此函数在HT66F2390.h中被定义
*/
DEFINE_ISR(ISR_Int0,0x04)   //ISR_Int0是中断函数名字   中断向量为何是0x04,请查看技术手册213页的那张图
{
   LED2 = ~ LED2;	     //触发中断,LED2取反
   _int0f =0;            //清除中断请求
}

中断初始化中要先开启总中断,然后再开启外部中断,之后是设置中断的触发方式,及设置相应的引脚和输入、上拉模式。也就是技术手册中这一段话。
在这里插入图片描述

  1. 开启总中断,直接使能EMI位,它跟外部中断0的控制位一样,是包含在INCT0寄存器里面的,不过也可以直接对位进行书写,也就是设置_emi=1.
    在这里插入图片描述
  2. 开启外部中断0,如下图,_int0e =1 是使能外部中断0.
    在这里插入图片描述
  3. 外部中断0的触发方式选择。这里我选用的是下降沿的触发方式,按键一开始是拉高的,当按下去的一瞬间是接低的,也就是电平下降(下降沿),松开时电平上升(上升沿)。所以说要有按键按下时立即反应,所以设置的是下降沿。我程序的书写时直接操作寄存器的,用二进制的写位,也就是程序中看到的那样_integ = 0b00000010。
    在这里插入图片描述
  4. 外部中断0的引脚选择。这个要看技术手册输入\输出的那一章,也就是109页,此寄存器的第0位是设置引脚选择的,我们还是跟按键输入的那一章一样,选择pa1引脚,同样设置为输入模式,及设置上拉模式。
    在这里插入图片描述

二、中断函数

代码如下(示例):

/*
外部中断0函数,中断的向量为0x04,此函数在HT66F2390.h中被定义
*/
DEFINE_ISR(ISR_Int0,0x04)   //ISR_Int0是中断函数名字   中断向量为何是0x04,请查看技术手册213页的那张图
{
   LED2 = ~ LED2;	     //触发中断,LED2取反
   _int0f =0;            //清除中断请求
}

外部中断函数都有一个固定的格式的,有中断名及中断向量。同样我们在HT-3000的工具那一栏选择V3代码生成器那生成的中断函数好像跟我们写的不太一样。
在这里插入图片描述
因为在合泰单片机的头文件中,也就是HT66F2390.h中有这样进行宏定义。这就是为什么使用我写的那个格式。
在这里插入图片描述
接下来来看中断向量的选择,中断向量的我们中断程序的地址,也是就进去中断函数的入口也就是下面的这张图。
在这里插入图片描述
每次进入中断函数执行完程序要清楚中断标志位,不然会一直执行中断函数的,不会退出来。相应的寄存器如下图。
在这里插入图片描述

主函数

我主函数里面就加了一个LED1闪烁来判断系统是否正常运行。

#include "HT66F2390.h"
#include "delay.h"
#include "LED.h"
#include "exti.h"

void main()
{
	LED_Init();    //LED初始化
	Exti_Init();    //中断函数初始化
	while(1)
	{
		LED1 =1;  //判断系统是否运行
		delay(1);
		LED1 =0;
	}
}

总结

技术手册还是有用的,要多多研究啊。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yijianpeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值