直接上代码::::
这个程序是测试按键产生中断然后跑马灯的启停(暂停和跑马)
第一次产生中断(按键按下)进入中断执行事件
第二次...
第..次...
#include <iocc2530.h>
/*
Description:本程序是测试按键产生时跑马灯的暂停和启动程序
time:2019-2-27
Auther: Bactiy
*/
// 宏定义按键、LED
#define led P1_0
#define led1 P1_1
#define led2 P1_3
#define led3 P1_4
#define key P1_2
unsigned char veil=0; // 中断执行的标志位
// 延时函数
void delay(unsigned int i)
{
unsigned int j;
unsigned int b;
for(j=0;j<i;j++)
{
for(b=0;b<240;b++)
{
while(veil);//第一次产生中断则跑马灯暂停,再次产生中断veil值会变为0
}
}
}
// 按键初始化
void keyinit()
{
P1IEN|=0X04; //使能P1_2产生中断(按键的引脚)
PICTL|=0X02; //下降沿产生中断
IEN2|=0X10; //使能P1端口产生中断
P1IFG=0X00; //中断标志位
EA=1; //总中断
}
// LED初始化
void ledinit()
{
P1SEL&=~0x1B;//P1SEL用于配置端口的模式为普通还是外设--这里定义为普通模式
P1DIR|=0X1B;//P1DIR用于配置端口为输入模式还是输出模式--这里定义为输出模式
/*led=0;
led1=0;
led2=0;
led3=0;*/
P1 = 0x00;//等同于以上四行 初始化LED的状态
}
// 中断服务函数
#pragma vector= P1INT_VECTOR
__interrupt void P1_ISR(void )
{
if(P1IFG&0x04) //如果P1_2引脚产生中断
{
if(veil==0) //第一次产生中断(按键按下)改变
{
veil=1;
}
else
{
veil=0;
}
}
P1IFG=0; //清中断位(这个是具体的位---例P1_1、P1_2、P1_3)
P1IF=0; //清中断位(这个是端口---例P0、P1、P2)
}
// 主函数
void main()
{
ledinit();
keyinit();
while(1)
{
led=1;
delay(300);
led=0;
delay(300);
led1=1;
delay(300);
led1=0;
delay(300);
led2=1;
delay(300);
led2=0;
delay(300);
led3=1;
delay(300);
led3=0;
delay(300);
}
}