电子说
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条评论
快来发表一下你的评论吧 !