前言
有的人问我,为什么我的博客没有讲有多少引脚,分别是什么之类的问题。我想说的是这些你都可以从官方手册上知道的,本博客只是告诉大家怎么使用罢了。让大家能够更好的理解。
接上一篇博客,如何使用中断方式控制灯的闪烁。
中断方式一般有以下几个步骤:设置优先级、使能、判断是否发生中断。
第一步,中断优先级的配置
已知IP1_X和IP0_X是设置优先级的,其中X是中断优先级组的组名。0的优先级别最低,3的优先级别最高。
比如:
IP1_IPG3=1;
IP0_IPG3=1;
第二步,中断使能寄存器的配置
由于通用IO配置输入就可以用于产生中断了。由于按键P0_3是P0口的。而P0口的中断使能寄存器是IEN1;
IEN1 |=1<<5;
由于IENx是将所有Px端口引脚都设置为中断方式,如果要单独设置某一引脚中断使能,除了设置IENx,还需要设置PxIEN。
PxIEN单独使能一个引脚的配置
比如说按键P0_3
P0IEN |=1<<3;
IEN1 |=1<<5;
第三步,设置中断的触发方式
0为输入上升沿触发,1为输入的下降沿触发
/*设置按键P0_3为下降沿触发中断*/
PICTL|=1<<0;
第四步,打开总中断
EA=1;
至此中断配置已经配置完,接下来需要判断是否发生中断。这时候就需要用到中断标志寄存器了。不要配置中断寄存器,发生中断时只需要判断该标志.
假如P0口有中断,但不需要确认是哪个引脚发生中断,只需要判断P0IFG是否大于0;
由于我们要确认P0_3口发生中断,就需要判断PxIFG相应的位是否置1;
if(P0IFG&(1<<3))
{}
是不是很简单呢?那么我们开始动手改造上个程序吧。
/*定义LED1*/
#define LED1 P0_1
/*定义按键*/
#define SW1 P0_3
void LEDinit()//LED的初始化
{
P0SEL&=~(1<<1);//配置通用IO
PODIR |=1<<1;//配置输出模式
}
void KEYinit()
{
P0IFG &=0x00;//P0中断标志清0
P0SEL &=~(1<<3);//配置通用IO
P0DIR &=~(1<<3);//配置输入模式
P0INP &=~(1<<3);//配置为上拉/下拉
P0IEN |=1<<3;//P0_3中断使能
PICIL |=1<<0;//下降沿触发
EA=1;//打开总中断
IEN1 |=1<<5; //端口0的中断使能
}
/*中断服务程序*/
#pragma vector=P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG>0)//最好使用判断条件为P0IFG&(1<<3)
{
P0IFG=0;//清中断标志
LED1=!LED1;
}
P0IFG=0;//清中断标志
}
void main()
{
/*LED的初始化*/
LEDinit();
LED1=0;
/*按键的初始化*/
KEYinit();
while(1)
{}
}
是不是很简单,学完了通用IO,下期博客我们介绍一下外设IO。
授人以鱼,不如授人以渔。下期见。