/*
此程序很简单,主要用到的是外部中断和电源管理
实验目的:通过按键触发外部中断,使单片机跳出休眠状态,LED
闪烁5
次
主讲
王加辉
*/
#include
#define LED1 P1_0/*
定义端口*/
#define LED2 P1_1
void init_led()/*
此函数初始化LED
灯*/
{
P1SEL&=~0X03;/*P1SEL
是P1
功能选择寄存器,主要用来设置P1I/O
各个端口为普通I/O
口或者是作为外设功能接口。
在这里我们只要P1_0
和P1_1
口为普通的I/O
口即可*/
P1DIR|=0X03;/*P1DIR
是P1
放向寄存器,主要功能是设置P1
各个口为输入口还是输出口,
LED
为输出设备,所以此处我们需要P1_0
和P1_1
口为输出口*/
P1INP&=~0X03;/*P1INP
是P1
输入模式寄存器,主要是设置P1
各个口的上拉是开还是关,此处无所谓开还是关*/
/*
因为P1SEL
和P1INP
在复位后默认为0
,所以我们可以不用配置,只要配置P1DIR
寄存器即可*/
LED1=LED2=1;/*
关闭所有LED
灯*/
}
void init_interrupt()/*
外部中断初始化函数*/
{
P0IEN|=0X10;/*P0
口中断掩码寄存器,主要是用来设置P0
口各个端口中断的开关,
因为我们这里用的键盘连的是P0.4
,所以我们要开P0.4
的中断*/
PICTL|=0X01;/*PICTL
是P
口中断控制寄存器,其主要功能请各位自己查看cc2530
数据手册,
这里我们主要设置P0
口的中断触发方式为下降沿触发*/
P0IE=1;/*P0IE
是IEN1
寄存器的第6
位,是用来设置P0
口的中断使能,即设置P0
口的中断开关*/
P0IFG=0X00;/*P0
口各个端口的中断标志寄存器,中断发生是相应位会自动置一,中断发生后需要软件手动清零*/
EA=1; /*
开总中断*/
}
void delay_ms(int ti)/*
延时函数*/
{
int i,j;
for(i=0;i<ti;i++)< div="" style="word-wrap: break-word;">
for(j=0;j<524;j++);
}
void sleep_select(int temp)/*
电源管理函数,我们这里比较简单,只设置了PM3*/
{
if(temp<4)/*
根据temp
的值来改变供电模式*/
{
SLEEPCMD|=temp;/*
设置供电模式*/
delay_ms(10);/*
延迟等待至少3ms*/
PCON=0X01;/*
强行进入所选的电源模式*/
}
else
PCON=0x00;/*
回到主动模式,即唤醒单片机*/
}
void main()
{
int x=0;
init_led();/*
初始化LED*/
init_interrupt();/*
初始化外部中断*/
while(1)
{
for(x=0;x<10;x++)/*LED
灯闪烁5
次*/
{
LED2=LED1=~LED1;
delay_ms(200);
}
sleep_select(3);/*
进入电源管理函数,设置电源方式为PM3*/
}
}
#pragma vector=P0INT_VECTOR/*
中断源*/
__interrupt void P0_ISR(void)/*
中断子程序*/
{
sleep_select(4);/*
进入电源管理函数,唤醒单片机*/
P0IFG=0;/*
清中断标志位*/
P0IF=0;/*
清中断标志位,P0IF
在P0IFG
中有,在IRCON
中也有,大家可以查看手册*/
}
/*
因为电源管理的资料我也没有word
文档,字比较多,不好打出来,
详细请大家参考cc2530
数据手册里的53
页:电源管理简介,里面讲的很详细*/
/*
祝大家学的愉快*/