单片机外部中断(按键)

2025-10-16 15:36:18

1、首先搭建数码管硬件平台,及软件显示代码。

2、在上面的平台基础上 ,焊接两个按键,按键的一端接地。一个按键的一端接择闲到

P32引脚排败披上,一个按键的一端接到P33引脚上。如果有开发板会更好一些,硬件上会有消抖处理。虚兼

1、所谓的下降沿,即指P32引脚上一个周期是高电平,这个周期是低电平的话,如果开启中断的话就会响应中断。

2、中断初始化函数书写:

void INT_Init(void)

{

  IT0 =1 ;

  IT1 =1;  //下降沿触发方式

  EX0 = 1;

  EX1 = 1;  //启动外部中断0,1

  EA = 1;   //使能所有中断

}

函数分析:(1)、上面所使用的寄存器是可以位寻址的 ,具体的寄存器地址参                               数,可以查看数据手册(宏晶的比较详细)。

                 (2)、一般初始化代码的编写,先设置参数,然后在进行使能开启。

3、中断处理函数书写:

void  INT0_Text()  interrupt 0 using 0

{

EA = 0;

Delay10ms();

if(P32==0)

Dig_Index++;

EA = 1;

}

函数分析:(1)、INT0_Text() 中断函数的名字

                 (2)、interrupt 0 声明这个函数用的是0号中断,也就是外部中断                              0。这个的顺序是按照我们的中断源地址进行排序的

                              interrupt 是keil的关键字。

                 (3)、using 0 表示使用的寄存器组,也是一个关键字

                 (4)、进入中断处理函数,首先关闭中断,然后延时一段时间在检                              测一下引脚是否还保持低电平。 如果保持低电平就说明此次                             按键是有效按键,然后对Dig_Index进行自加一,然后退出                               中断处理函数。

4、整体处理函数:

#include"aconf.h"

int  Dig_Index ;

void main()

{

P0M0 = 0xff;

P0M1 = 0x00;

P2M0 = 0x00;

P2M1 = 0x00;

P3M0 = 0x00;

P3M1 = 0x00;

Dig_Index = 2;

INT_Init();

while(1)

{

  Dig_OutPut(Dig_Index);       

}

}

void INT_Init(void)

{

IT0 = 1;

IT1 = 1      ; 

EX0 = 1;

EX1 = 1;  

EA = 1;   

}

void  INT0_Text()  interrupt 0 using 0

{

EA = 0;

Delay10ms();

if(P32==0)

Dig_Index++;

EA = 1;

}

void  INT1_Text()  interrupt 2  using 2

{

EA = 0;

Delay10ms();

if(P33==0)

Dig_Index--;

EA = 1;

}

整体分析:(1)、头文件的包含,一遍调用其他文件的函数

                 (2)、int  Dig_Index ;定义一个全局变量,这个实验就是通过两个                             按键对这个变量增减后,然后通过数码管对这个数进行显示

                 (3)、中断初始化函数调用,启动中断。

                 (4)、数码管采用动态扫描的方式,所以调用显示函数要循环的调                              用。

关键点:在于延时消抖。

1、低电平触发需要实现的功能:(1)、单击增减一

                                            (2)、持续按键,快速增减。

2、中断函数初始化:

void INT_Init(void)

{

IT0 =0 ;

IT1 =0       ; 

EX0 = 1;

EX1 = 1;  

EA = 1;   

}

这个初始化函数,和下降沿的方式一样,只是将参数设置成低电平处理方式。

3、中断处理函数:

void  INT0_Text()  interrupt 0 using 0

{

EA = 0;

//判断按键是单次按键还是持续按键

if(P32 == 0)

Dig_Jndex++;

 else

Dig_Jndex=0;

//判断按键是单次按键还是持续按键

if(Dig_Jndex>=10)//持续按键处理

{

Delay1ms();

 Dig_Index++;

Dig_OutPut(Dig_Index);

}

else                  //单次按键

{

Delay100ms();

Dig_Index++;

Dig_OutPut(Dig_Index);

}

EA = 1;

}

函数分析:(1)、我们通过增加一个全局变量来判断按键的接通时间,

                             如果接通接近2秒的话 就是持续按键。否则是单次按键。

                 (2)、可以分析一下首先进入这个函数 Dig_Jndex就会自加1.

                             这个时候执行单次按键处理,这段代码加上显示函数,加上                              延时大约是150ms,我们需要执行10次后,才能定义此按键                              持续性按键。也就是大约2秒。

                 (3)、对于这个变量我们需要进行清0,函数在主函数里。

                 (4)、和下降沿处理函数对比发现这里增加了显示函数,如果不

                               增加,由于延时函数过多,而且低电平触发 是频繁触发,

                              会导致显示不正常。

关键点:在于如果判断按键的时间,以及处理显示卡顿闪烁等现象。

4、#include"aconf.h"

int  Dig_Index ;

int  Dig_Jndex ;

void main()

{

P0M0 = 0xff;

P0M1 = 0x00;

P2M0 = 0x00;

P2M1 = 0x00;

P3M0 = 0x00;

P3M1 = 0x00;

Dig_Index = 2;

INT_Init();

while(1)

{

if((P32 == 1)&&(P33 == 1))

{

Delay1ms();

if((P32 == 1)&&(P33 == 1))

Dig_Jndex=0;

}

  Dig_OutPut(Dig_Index);       

}

}

void INT_Init(void)

{

IT0 =0 ;

IT1 =0       ;  

EX0 = 1;

EX1 = 1; 

EA = 1;   

}

void  INT0_Text()  interrupt 0 using 0

{

EA = 0;

//P32 =  1;

//Delay1ms();

if(P32 == 0)

Dig_Jndex++;

  else

Dig_Jndex=0;

if(Dig_Jndex>=10)

{

Delay1ms();

 Dig_Index++;

Dig_OutPut(Dig_Index);

}

else

{

Delay100ms();

Dig_Index++;

Dig_OutPut(Dig_Index);

}

EA = 1;

}

void  INT1_Text()  interrupt 2  using 2

{

EA = 0;

if(P33 == 0)

Dig_Jndex++;

  else

Dig_Jndex=0;

if(Dig_Jndex>=10)

{

Delay1ms();

 Dig_Index--;

Dig_OutPut(Dig_Index);

}

else

{

Delay100ms();

Dig_Index--;

 

Dig_OutPut(Dig_Index);

}

EA = 1;

}

主函数:(1)、差别就是增加了对 按键类型 判断全局变量清零

              (2)、以及就是对于持续按键,显示的处理。

5、http://pan.baidu.com/s/1eSJXksU

源码的连接 (包含 数码管的驱动。)

6、实际运行效果

单片机外部中断(按键)

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢