AVR单片机外部中断0、1、2详解

合集下载

AVR外设汇总之中断

AVR外设汇总之中断
中断 //PD2 位发生下降沿,触发的中断函数 ISR(INT0_vect) { } //PD3 位发生下降沿,触发的中断函数 ISR(INT1_vect) { } int main(void){ //设置 PD2、PD3 为输出 DDRD=_BV(PD2)|_BV(PD3); //置 PD2、PD3 位都为高电平 PORTD=0xFF; //ISC01 位置 1,表示设置 INT0(PD2)为下降沿中断 //ISC11 位置 1,表示设置 INT1(PD3)降沿触发一个外部中断 INT0 INT1 //INT0 位置 1,表示打开 INT0 的外部中断使能 //INT1 位置 1,表示打开 INT1 的外部中断使能 GICR= _BV(INT0)|_BV(INT1); sei();//cli();打开/关闭全局中断 while(){ //设置 PD2 位为输出 DDRD|=_BV(PD2); //置 PD2 位为低电平产生一个下降沿,触发 INT0 的中断函数 PORTD&=~_BV(PD2); _delay_ms(1); //置 PD2 位为高电平 PORTD|=_BV(PD2); //置 PD2 位为输入,等待硬件中断(全局等待 SW18 按键被按下) DDRD&=~_BV(PD2); //设置 PD3 位为输出 DDRD|=_BV(PD3); //置 PD3 位为低电平产生一个下降沿,触发 INT1 的中断函数 PORTD&=~_BV(PD3); _delay_ms(1); //置 PD3 位为高电平 PORTD|=_BV(PD3); //置 PD3 位为输入,等待硬件中断(全局等待 SW17 按键被按下) DDRD&=~_BV(PD3); } }

单片机外部中断

单片机外部中断

0003H 0013H来自五、外部中断应用实例例:利用外部中断INT0控制流水灯。具体 要求:单片机得电后,LED灯从左向右顺 序点亮;当产生外部中断后,全部LED灯 开始闪烁,闪烁3次后,中断停止,流水 灯继续流水。
(1)硬件接线图如下图所示:
VCC
R1
100
R2
100
R3
100
R4
100
R5
100
D2
D3
D4
D5
D6
D7
D8
18
XTAL2
9
RST
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51
K1
(2)参考程序如下:

ORG 0000H ; 复位入口 LJMP QQ ;转到初始化程序 ORG 0003H ;外部中断1入口地址 LJMP EXT0 ; 转移到中断处理程序 QQ:MOV A,#0FEH ;把数据11111110送进累加器A HH: SETB IT0 ;外部中断触发方式选择 SETB EX0 ;允许外部中断 SETB EA ;允许总中断 MOV P0,A ;把A的数据送到P0口,点亮一个LED ACALL YY ;调用延时子程序 RR A ;A的数据左移一位 LJMP HH ;转移到HH






EXT0: MOV P0,#0FFH ACALL YY MOV P0,#00H ACALL YY MOV P0,#0FFH ACALL YY MOV P0,#00H ACALL YY MOV P0,#0FFH ACALL YY MOV P0,#00H ACALL YY RETI

单片机外部中断详解及程序

单片机外部中断详解及程序

单片机外部中断详解及程序单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。

比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。

在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。

如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。

但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。

因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。

实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。

下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。

电路结构和接线不变,仅把程序改为下面的形式。

#include ;unsigned int t=500; //定义一个全局变量t,并设定初始值为500次//===========延时子函数,在8MHz晶振时约1ms=============void delay_ms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//============主函数==================================void main( void ){DDRB = 0xFF; //设置端口B为输出方向PORTB = 0xFF; //设置端口B的输出为全高电平DDRD = 0x00; //设置端口D为输入方向PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态MCUCR = 0x0A; //设定INT0、INT1为下降沿触发GICR = 0xC0; //使能INT0、INT1中断SREG = 0x80; //使能总中断while(1){PORTB = 0x55; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个msPORTB = 0xAA; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个ms}}//============中断函数(外部0)==========================#pragma vector = INT0_vect__interrupt void INT0_Server(void){t = 100; //设定t的值为100次}//============中断函数(外部1)==========================#pragma vector = INT1_vect__interrupt void INT1_Server(void){t = 500; //设定t的值为500次}把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。

AVR单片机中断

AVR单片机中断

AVR 单片机中断
关于AVR 中断:
系统在正常运行主程序时,如果突然有一个重要的任务要马上处理,那幺系统就要保存现在的工作,然后再去处理这个任务,执行这个重要任务完毕以后再返回原来的主程序继续运行,这就是中断。

主程序一旦进入中断服务程序,那幺AVR 芯片将自动的关闭全局中断,
在这个期间不再执行其它的中断请求,直到中断程序结束以后芯片才自动的重新开放全局中断。

(注意,在这个期间某些中断请求可能会被丢弃,某些请求会留下中断请求标致,一旦当前的中断执行完毕,这个有中断标致的请求就有可能马上得到响应,如INT0 的下降沿触发就会留下中断请求标致,而
低电平触发就不会流下中断请求标致)。

如果你想在执行中断服务程序时响应另外一个更重要的中断,那幺就要在中断服务程序中加入一条打开全局中断的语句。

使用ICC 快速建立中断服务程序程序文件
使用ICCAVR Application Builder 进行如下图所示的设置。

可以设置是否使用中断,上升延,下降延,低电平,任意的逻辑电平变化。

AVR笔记:外部中断

AVR笔记:外部中断

A VR学习笔记之【外部中断】【一】Mega16共有三个外部中断,外部中断相比定时器而言它的寄存器比较少,因此相对比较简单。

我们现在只关心需要用的部分,其他的暂且放弃不管。

和外部中断相关的特殊功能寄存器有:①MCU控制寄存器(MCUCR)在上面八位的寄存器中,白色的部分使我们要关心的,灰色部分就不用管了。

资料上对后面四位(第四位)的作用有介绍。

ISC11与ISC10控制中断1的触发方式。

下表为ISC10/11的值对应触发方式:SC11与ISC10控制中断0的触发方式。

下表为ISC00/01的值对应触发方式:我们在使用外部中断0和1的时候,其触发方式的设置便是通过以上ISC的不同值实现的。

至于INT2下面有介绍。

②MCU控制与状态寄存器(MCUCSR)这个寄存器只有一个BIT与外部中断相关。

ISC2,我们通过和INT0/1的对比可以发现ISC的后缀数字命名只有规律的,这会方便我们记忆。

同时在说明文档上说了很长一段关于ISC2的说明:他的意思说早了,他也就是想说:ISC=0的话INT2是下降沿出发中断,ISC=1是上升沿出发。

这才是应该说明的最重要的点。

他后面还说了:(1)如果你让ISC=0那么外部的低电平必须保持到当前正在运行的指令运行结束才会出发,换一句意思就是,如果外部时间过短,有可能导致INT2不被触发。

(2)他又说明,如果改变ISC2的值的话有可能触发中断,导致误判,因此如果你想改变其中断触发方式的话,首先把通用中断控制寄存器(GICR)里面控制INT2的中断开关关了,这样便不会触发中断了。

③通用中断控制寄存器(GICR)他就是个中断开关。

前面三位依次赋值便会打开响应中断。

当然总中断开关也要打开才行(SREG|=BIT(7))。

④通用中断标志寄存器(GIFR)他就是一个中断标志,我们也就是说在中断发生的时候中断对用的标志会变为1,此时程序会自动转到中断程序子函数。

然后有硬件自动清零,以等待下一次的中断发生。

外部中断0功能的使用方法过程

外部中断0功能的使用方法过程

外部中断0功能的使用方法过程
嘿呀!今天咱们就来好好聊聊这个“外部中断0 功能的使用方法过程”呢!
首先呀,咱们得搞清楚啥是外部中断0 功能?哎呀呀,简单来说呢,它就是能让我们的系统在正常运行的时候,突然因为外部的某些信号或者事件,打断当前的任务,去处理更紧急更重要的事情哇!
那怎么开始使用这个神奇的功能呢?1. 准备工作可不能少呀!得先设置好相关的硬件连接,确保外部信号能准确无误地传进来呢。

2. 接下来,在软件编程方面,要配置好中断的触发条件和优先级,这可重要啦!要是设置不好,那可就乱套啦!
3. 还有还有,得编写中断服务程序,这就像是给外部中断0 功能安排了一个专门的“办公室”,它进来了,就在这里处理事情。

在实际操作的时候,要注意好多细节哟!比如说,中断响应的时间得控制好,要是太慢了,那可就耽误大事啦!还有哇,在中断服务程序里,处理的任务不能太复杂,不然会影响整个系统的运行效率呢!
哎呀呀,这外部中断0 功能用好了,那可真是能让我们的系统变得更加灵活和高效哇!比如说在一些实时监测的系统中,一旦发现异常情况,就能马上做出反应,是不是很厉害呀?
总之呢,掌握外部中断0 功能的使用方法过程不是一件轻松的事情,需要我们细心、耐心,不断地尝试和改进呢!哇,相信只要咱们用心去学,去实践,一定能把它玩转,让它为我们的工作和学习带来更多的便利哟!。

AVR学习笔记二、基本输入和外部中断实验

AVR学习笔记二、基本输入和外部中断实验

A VR学习笔记二、基本输入和外部中断实验-------基于LT_Mini_M162.1 利用按键控制发光二极管的亮灭2.1.1 实例功能在“点亮发光二极管”和“让发光二极管动起来”这两个例子中,都是通过单片机程序来控制发光二极管的亮灭。

如果想要控制发光二极管的亮灭,只有通过打开或者关闭电源来实现控制。

那么怎样实现人工参与控制呢?在有些应用场合,需要单片机对人工的开关信号作出相应的响应和处理,通过控制电源的通断会影响到单片机系统中的其他功能,所以通过控制电源的方法并不明智。

能不能通过按动一个按键来实现发光二极管的亮灭呢?当然可以,前面已经讲过,A VR单片机的I/O口都是双向的,也就是既能当作输出控制端口,也能当作输入检测端口。

既然我们可以通过控制端口输出不同的高低电平使发光二极管实现点亮和熄灭;那么为什么不能通过监测端口输入电平的状态来进行相应的处理呢。

在本例中,通过介绍利用按键开关控制发光二极管的亮灭来了解A VR单片机的端口检测外部信号的功能和方法。

本例中有3个功能模块,描述如下:●单片机系统:检测外界的按键开关信号,根据按键的开关状态控制发光二极管的亮灭状态。

●外围电路:首先是产生信号的按键电路,包括对按键去抖动电路的介绍;然后是发光二极管的控制电路。

●软件程序:通过读取AVR单片机相应端口的状态,编写相应的程序控制发光二极管的亮灭。

本例的目的在于希望读者完成本例后,能完成相关电路的设计和相应程序的编写,从而掌握以下知识点:◆了解AVR单片机端口输入功能,掌握使用AVR单片机端口输入功能检测外部信号的原理。

◆熟悉单片机端口输入输出功能的综合使用。

◆掌握AVR单片机按键的硬件去抖动的电路设计和原理。

◆掌握AVR单片机端口输入输出程序的编写。

◆掌握AVR单片机按键软件去抖动功能的实现。

2.1.2 器件和原理本例主要介绍A VR单片机外围电路中按键去抖电路的设计,分别介绍相应的软件和硬件解决方案。

AVR单片机外部中断0、1、2详解

AVR单片机外部中断0、1、2详解

AVR单片机外部中断0、1、2 详解中断基本包含:1.中断源2.中断向量(中断入口地址)3.中断优先级4.中断函数除此之外,在单片机中,中断的执行或者中断的触发必须符合以下的规则:中断触发|执行= 全局中断使能位AND 中断源使能位AND 中断源标志位单片机内部中断的触发必须完成,全局中断使能,中断源使能,中断源标志位置一等条件。

除此之外,如果是外部中断0,1,2(INT0,1,2),必须设置引脚触发的规则。

最后呢,就是需要在程序里建立处理中断的中断函数。

在编程的时候的步骤大致如下:(无视INT2)1. 初始化PD2,PD3 为输入状态。

DDRD|=BIT(2)|BIT(3);2. 设置INT0,1 引脚触发的规则,实验中为低电平触发。

MCUCR=0xF0;3. 设置INT0,1 中断源使能位为逻辑1。

GICR|BIT(7)|BIT(6);4. 清除INT0,1 的中断标志位(软件写入,逻辑1 为清除)。

GIFR|=BIT(7);BIT(6);5. 全局中断允许位使能。

SREG|=BIT(7);6. 编辑中断处理函数。

/*ATmega16提供3个外部中断,分别由INT0、INT1和INT2引脚触发。

需要注意的是,如果将ATmega16设置为允许外部中断,则即使把INT0、INT1和INT2引脚设置为输出方式,外部中断仍然会被触发。

外部中断可选择采用上升沿触发、下降沿触发和低电平触发(INT2中断只能采用沿触发方式。

*/#include;#include;#include &quot;smg.h&quot;/*1.状态寄存器SREGbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0I T H S V N Z CI:全局中断使能位。

在I置位后,单独的中断使能由不同的中断寄存器控制。

若I为0,则禁止中断。

MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能Bit 7 6 5 4 3 2 1 0SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVR单片机外部中断0、1、2 详解中断基本包含:1.中断源2.中断向量(中断入口地址)3.中断优先级4.中断函数除此之外,在单片机中,中断的执行或者中断的触发必须符合以下的规则:中断触发|执行= 全局中断使能位AND 中断源使能位AND 中断源标志位单片机内部中断的触发必须完成,全局中断使能,中断源使能,中断源标志位置一等条件。

除此之外,如果是外部中断0,1,2(INT0,1,2),必须设置引脚触发的规则。

最后呢,就是需要在程序里建立处理中断的中断函数。

在编程的时候的步骤大致如下:(无视INT2)1. 初始化PD2,PD3 为输入状态。

DDRD|=BIT(2)|BIT(3);2. 设置INT0,1 引脚触发的规则,实验中为低电平触发。

MCUCR=0xF0;3. 设置INT0,1 中断源使能位为逻辑1。

GICR|BIT(7)|BIT(6);4. 清除INT0,1 的中断标志位(软件写入,逻辑1 为清除)。

GIFR|=BIT(7);BIT(6);5. 全局中断允许位使能。

SREG|=BIT(7);6. 编辑中断处理函数。

/*ATmega16提供3个外部中断,分别由INT0、INT1和INT2引脚触发。

需要注意的是,如果将ATmega16设置为允许外部中断,则即使把INT0、INT1和INT2引脚设置为输出方式,外部中断仍然会被触发。

外部中断可选择采用上升沿触发、下降沿触发和低电平触发(INT2中断只能采用沿触发方式。

*/#include;#include;#include &quot;smg.h&quot;/*1.状态寄存器SREGbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0I T H S V N Z CI:全局中断使能位。

在I置位后,单独的中断使能由不同的中断寄存器控制。

若I为0,则禁止中断。

MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能Bit 7 6 5 4 3 2 1 0SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。

在检测边沿前MCU 首先采样 INT1 引脚上的电平。

如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。

如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。

SE:MCU休眠使能位SM1~SM0:MCU休眠模式选择SM2 SM1 SM0 休眠模式0 0 0 空闲0 0 1 ADC 噪声抑制模式0 1 0 掉电模式0 1 1 省电模式1 0 0 保留1 0 1 保留1 1 0 Standby(1) 模式1 1 1 扩展Standby(1) 模式ISC11 ISC10 说明0 0 INT1 为低电平时产生中断请求0 1 INT1 引脚上任意的逻辑电平变化都将引发中断1 0 INT1 的下降沿产生异步中断请求1 1 INT1 的上升沿产生异步中断请求外部中断 0 由引脚 INT0 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。

在检测边沿前MCU 首先采样 INT0 引脚上的电平。

如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。

如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成ISC01 ISC00 说明0 0 INT0 为低电平时产生中断请求0 1 INT0 引脚上任意的逻辑电平变化都将引发中断1 0 INT0 的下降沿产生异步中断请求1 1 INT0 的上升沿产生异步中断请求*//*MCU 控制与状态寄存器-MCUCSR-Bit 7 6 5 4 3 2 1 0JTD ISC2 &ndash; JTRF WDRF BORF EXTRF PORF * Bit 6 &ndash; ISC2: 中断 2 触发方式控制异步外中断 2 由外部引脚 INT2 激活,如果 SREG 寄存器的 I 标志和 GICR 寄存器相应的中断屏蔽位置位的话。

若 ISC2 写 0 , INT2 的下降沿激活中断。

若 ISC2 写 1 , INT2 的上升沿激活中断。

INT2 的边沿触发方式是异步的。

只要 INT2 引脚上产生宽度大于50ns(1s=1000ms,1 ms=1000&mu;s,1&mu;s=1000ns ) 所示数据的脉冲就会引发中断。

若选择了低电平中断,低电平必须保持到当前指令完成,然后才会产生中断。

而且只要将引脚拉低,就会引发中断请求。

改变 ISC2 时有可能发生中断。

因此建议首先在寄存器 GICR 里清除相应的中断使能位 INT2 ,然后再改变ISC2。

最后,不要忘记在重新使能中断之前通过对 GIFR 寄存器的相应中断标志位 INTF2 写 '1&rsquo;使其清零。

*//*通用中断控制寄存器- GICRBit 7 6 5 4 3 2 1 0INT1 INT0 INT2 &ndash; &ndash; &ndash; IVSEL IVCE* Bit 7 &ndash; INT1: 使能外部中断请求 1 当 INT1 为 '1&rsquo; ,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器&ndash; MCUCR的中断敏感电平控制1位 1/0 (ISC11与ISC10)决定中断是由上升沿、下降沿,还是 INT1 电平触发的。

只要使能,即使 INT1 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。

* Bit 6 &ndash; INT0: 使能外部中断请求 0 当 INT0 为 '1&rsquo; ,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器&ndash; MCUCR的中断敏感电平控制0位 1/0 (ISC01与ISC00)决定中断是由上升沿、下降沿,还是 INT0 电平触发的。

只要使能,即使 INT0 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。

* Bit 5 &ndash; INT2: 使能外部中断请求 2 当 INT2 为 '1&rsquo; ,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器&ndash; MCUCR 的中断敏感电平控制2位 1/0 (ISC2与ISC2)决定中断是由上升沿、下降沿,还是 INT2 电平触发的。

只要使能,即使 INT2 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生*//*通用中断标志寄存器- GIFRBit 7 6 5 4 3 2 1 0INTF1 INTF0 INTF2 &ndash; &ndash; &ndash; &ndash; &ndash;* Bit 7 &ndash; INTF1: 外部中断标志 1INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。

如果SREG 的位I以及GICR寄存器相应的中断使能位INT1为&rdquo;1&rdquo; ,MCU即跳转到相应的中断向量。

进入中断服务程序之后该标志自动清零。

此外,标志位也可以通过写入 &rdquo;0&rdquo; 来清零。

* Bit 6 &ndash; INTF0: 外部中断标志 0INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。

如果SREG 的位I以及GICR寄存器相应的中断使能位INT0为&rdquo;1&rdquo; ,MCU即跳转到相应的中断向量。

进入中断服务程序之后该标志自动清零。

此外,标志位也可以通过写入 &rdquo;0&rdquo; 来清零。

* Bit 5 &ndash; INTF2: 外部中断标志 2INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。

如果SREG 的位I以及GICR寄存器相应的中断使能位INT2为&rdquo;1&rdquo; ,MCU即跳转到相应的中断向量。

进入中断服务程序之后该标志自动清零。

此外,标志位也可以通过写入 &rdquo;0&rdquo; 来清零。

注意,当INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。

这会导致INTF2标志设置信号的逻辑变化*///外部中断0向量端口#pragma interrupt_handler INTER_0:iv_INT0//外部中断1向量端口#pragma interrupt_handler INTER_1:iv_INT1//外部中断2向量端口#pragma interrupt_handler INTER_2:iv_INT2void INTER_init_0(unsigned char a)//a取值0-3 {switch(a){case0:MCUCR&=~(1<<ISC01);MCUCR&=~(1<<ISC00);break;//INT0 为低电平时产生中断请求case1:MCUCR&=~(1<<ISC01);MCUCR|=1<<ISC00;break;//INT0 引脚上任意的逻辑电平变化都将引发中断case2:MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//INT0 的下降沿产生异步中断请求case3:MCUCR|=1<<ISC01;MCUCR|=1<<ISC00;break;//INT0 的上升沿产生异步中断请求default :MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//设置错误时,下降沿产生异步中断请求}}void INTER_init_1(unsigned char a)//a取值0-3 {switch(a){case0:MCUCR&=~(1<<ISC11);MCUCR&=~(1<<ISC10);break;//I NT1 为低电平时产生中断请求case1:MCUCR&=~(1<<ISC11);MCUCR|=1<<ISC10;break;//INT1 引脚上任意的逻辑电平变化都将引发中断case2:MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//INT1 的下降沿产生异步中断请求case 3:MCUCR|=(1<<ISC11)|(1<<ISC10);break;//INT1 的上升沿产生异步中断请求default :MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//设置错误时,下降沿产生异步中断请求}}void INTER_init_2(unsigned char a){if(a)MCUCSR|=(1<<ISC2);//上升沿触发;elseMCUCSR&=~(1<<ISC2);//下降沿触发;}void INTER_0(void){show(2,1);//add your code here!}void INTER_1(void){show(1,0);//add your code here!}void INTER_2(void){// show(3,2);//add your code here!}void InterruptInit(void){PORTD |= (1 << PD2)|(1 << PD3); //INT0、INT1端口输出高电平DDRD &= ~(1 << PD2)&~(1 << PD3); //方向:输入PORTB = (1 << PB3); //INT2端口输出高电平DDRB &= ~(1 << PB3); //方向:输入GICR |= (1 << INT0)|(1 << INT1)|(1<<INT2);//使能INT0,INT1GIFR&=~(1<<INTF0)&~(1<<INTF1)&~(1<<INTF2);//清零中断标志SREG|=0x80;//使能全局中断}///////////////////////////////////////////////////////////////////#include &quot;smg.h&quot;#pragma data:code//共阳数码管断码表consttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xb6,0xff}; //**********1ms基准延时程序**********************************void delay(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<1141;j++);}}//***********系统初始化************************* void SmgInit(void){DDRA|=BIT(PA2);//设置PA2为输出DDRB=0XFF;//设置PB口为输出PORTA|=BIT(PA2);//PA2=1,使能控制LED的74HC573 PORTB|=0XFF;//PB口输出1111 1111,使得所有的LED 熄灭PORTA&=~BIT(PA2);//PA2=0,禁止控制LED的573,使控制LED的数据锁存DDRA|=BIT(PA3);//设置PA3(smgd_lk)为输出DDRA|=BIT(PA4);//设置PA4(SMGB_LK)为输出DDRA|=BIT(PA6);//设置蜂鸣器控制口为输出PORTA&=~BIT(PA6);//关闭蜂鸣器}//***********数码管动态扫描程序*************************void show(uchar data,uchar bit){PORTA|=BIT(3);//PA3=1,使能控制数码管数据的74HC573PORTB=table[data];//送数码管断码数据PORTA&=~BIT(3);//关闭控制数码管数据的573,使得数码管数据锁存PORTB=0X00;//PB口输出0000 0000PORTA|=BIT(4);//PA4=1,使能控制数码管数据口的573 PORTB|=BIT(bit);//数码管位选PORTA&=~BIT(4);//数码管位选锁存delay(1);//稍微延时}///////////////////////////////////////////////// //////////////////////////////#include &quot;smg.h&quot;#include &quot;interrupt.h&quot;void main(void){// unsigned char i;SmgInit();InterruptInit();INTER_init_0(2);INTER_init_1(2);INTER_init_2(0);while(1) {;}}。

相关文档
最新文档