在本次学习中,主要通过外部中断来控制LED的亮灭。
首先,先查看相关电路图。由图可知,当CC2530端口1的1号引脚输出低电平时,LED3将被点亮,当按键31按下时,端口1的1号引脚将为低电平,抬起时为高电平。
![](https://img-blog.csdnimg.cn/653ccc68423a4e95a8d22b492a4f2410.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcml0aW5n44CB,size_20,color_FFFFFF,t_70,g_se,x_16)
1、 端口1功能选择寄存器(P1SEL)。这是一个8位的寄存器,对应端口1的8个引脚,将相应位设为0,表示将相应引脚设置为普通的I/O口,若设置为1,则将相关引脚设为外设I/O,默认值都为0
![](https://img-blog.csdnimg.cn/ed1685fd346d43238fd90b18805d2c83.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcml0aW5n44CB,size_20,color_FFFFFF,t_70,g_se,x_16)
2、打开总中断EA,EA是非常重要的中断位,位于IEN0.EA,将其设置为1,否则,没有中断使能
3、设置触发方式,把P1这一组配置成下降沿触发,这里配置为 P1IEN |=0X02
![](https://img-blog.csdnimg.cn/b212c681b823493e9ce199b16337d143.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcml0aW5n44CB,size_20,color_FFFFFF,t_70,g_se,x_16)
4、使能寄存器相应的中断使能位,p1对应的中断使能位位于LEN2寄存器
![](https://img-blog.csdnimg.cn/e4deae775d424aec8761dc25ff7bcfc7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcml0aW5n44CB,size_20,color_FFFFFF,t_70,g_se,x_16)
5、中断处理函数,使用按键挂载在P1端口,所以我们得使用中断1的中断服务函数。
#pragma vector=P1INT_VECTOR
__interrupt void fsdfas()
通过中断标志位去判断按键是否按下,由于按键为机械按键,需要消抖,需要用到延时函数,延时的时间按实际需求设置,通过按键按下,中断标志位(P1IFG)对应的位置1,通过判断中断标志位是否为1去控制LED灯的状态。
中断标志位和中断标志(P1IF)在使用完需要清除标志位,否则一直执行中断服务函数
#include<iocc2530.h>
void delay()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<30;j++);
}
void LED_Init()
{
P0SEL &=~0X10;
P0DIR |=0X10;//配置P1_0位输出
}
void NVIC_Init()
{
EA=1;//打开总=中断
PICTL |=0x02;//把P0这一组配置成下降沿触发///
IEN2 |=0x10;//设置寄存器相应的位使能
P1IEN |=0X02;//设置引脚的中断使能
}
void main()
{
LED_Init();
NVIC_Init();
while(1);
}
#pragma vector=P1INT_VECTOR
__interrupt void fsdfas()
{
if(P1IFG & 0X02)
{
delay();
if(0==P1_1)
{
P0_4 ^=1;//异或操作
}
}
P1IFG=0;
IEN2|=0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)