cc2530的第三次实验,按键中断控制流水灯

时间:2023-03-08 23:57:37
cc2530的第三次实验,按键中断控制流水灯

cc2530的第三次实验:按键中断控制流水灯

效果为按一次按键,流水灯亮一次

实验相关电路图:

cc2530的第三次实验,按键中断控制流水灯

实验相关寄存器:

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内中断标志寄存器,什么鬼,没弄明白啊,问一下老师吧!

全部代码


#include <ioCC2530.h> typedef 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<time;i++)
for(uint j=0;j<1070;j++);
} //初始化函数
void Init(void)
{
//初始化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|=0x20;
//设置端口中断触发方式 1为下降沿触发
PICTL|=0x01;
//设置总中断
EA=1;
//清空标志位
P0IFG=0; } void BLink()
{
Delay(time);
LED1=0;
LED2=1;
LED3=1;
Delay(time);
LED1=0;
LED2=0;
LED3=1;
Delay(time);
LED1=0;
LED2=0;
LED3=0;
Delay(time);
LED1=1;
LED2=1;
LED3=1; } //中断服务函数
#pragma vector = P0INT_VECTOR //这一行的P0INT_VECTOR是中断源的名称吗?
__interrupt void P0ISR(void)
{
//清除端口中断标志位
P0IFG=0; //LED灯流水亮一遍
BLink(); //清除端口中断标志位
P0IF=0; } //主函数
void main()
{ Init();
LED3=0;
while(1)
{
//LED3=0;
} //return ; }

这个实验的难点以及重点主要是在初始化中断这个过程,

初始化引脚的寄存器P0IEN|=0x02;

设置端口中断的寄存器IEN1|=0x20;

设置端口中断触发方式PICTL|=0x01;

设置总中断EA=1

清空标志位:P0IFG=0;