电子说
cc2530的第三次实验:按键中断控制流水灯
效果为按一次按键,流水灯亮一次
实验相关电路图:

实验相关寄存器:

初始化函数
//初始化LED灯
//设置P1SEL,通用为0,外设为1 11111100
P1SEL &=~0x03;
//设置P0SEL, 11101111
P0SEL &= ~0x10;
//设置P1DIR,输出为1,输入为0 00000011
P1DIR |= 0x03;
//设置P0DIR 00010000
P0DIR |= 0x10;
//初始化按钮和中断
//初始化按钮
//初始化P0SEL,通用为0 11111101
P0SEL&=~0x02;
//初始化P0DIR,输入为0 11111101
P0DIR&=~0x02;
//初始化中断
//设置引脚中断 1为中断使能 00000010
P0IEN |= 0x02;
//设置端口中断
IEN1=1;
//设置端口中断触发方式 1为中断使能
IEN1|=0x20;
//设置总中断
EA=1;
//清空标志位
P0IFG=0;
中断服务函数
//中断服务函数
#pragma vector = P0INT_VECTOR //这一行的P0INT_VECTOR是中断源的名称吗?
__interrupt void P0ISR(void)
{
//清除端口中断标志位
P0IFG=0;
//LED灯流水亮一遍
BLink();
//清除端口中断标志位
P0IF=0;
}
上面的代码一定要注意P0IFG一定要在P0IF之前清除,话说P0IF与P0IFG到底是干啥用的?他们之间什么关系,端口的标志寄存器?(记得查一下)
P0IFG是端口0中断状态标志,P0IF是cpu内中断标志寄存器,什么鬼,没弄明白啊,问一下老师吧!
全部代码
#includetypedef unsigned int uint; typedef unsigned char uchar; #define LED1 P1_0 #define LED2 P1_1 #define LED3 P0_4 #define BUTTON1 P0_1 uint time=300; //延迟函数 void Delay(uint time) { for(uint i=0;i
全部0条评论
快来发表一下你的评论吧 !