我是一个单片机初学者, 设计一个可变频率的方波。
INT0中断使a的值增加,我第一次按button还可以增加,后来就不会中断了,不知道为什么;附程序:
#include<p18f452.h>
#include<delays.h>
/********************
中断向量及中断服务函数申明
**********************/
void ADDa (void);
#pragma code inter_vector=0x08
void inter_vector (void)
{ _asm goto ADDa _endasm}
#pragma code
volatile int a=100;
rom near char lookup[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c
};
rom near char lookup1[]=
{0x03,0x02,0x01,0x00};
/***************************
引脚配置
***************************/
void PORT_Init (void)
{ADCON1=0X6F;
TRISC=0;
TRISD=0;
TRISB=0x01;
TRISE=0;
PORTEbits.RE0=0;
}
/*****************************
TMR0设置
******************************/
void TMR1_Init (void)
{T0CONbits.TMR0ON=0;
T0CONbits.T08BIT=0;
T0CONbits.T0CS=0;
TMR0H=(65536-1/2/(a)*10^6)/256;
TMR0L=(65536-1/2/(a)*10^6)%256;
T0CONbits.TMR0ON=1;
}
/**********************************
INT0和INT1中断设置
*********************************/
void INT0_1 (void)
{INTCONbits.GIE=1;
RCONbits.IPEN=1;
INTCONbits.INT0IE=1;
INTCONbits.INT0IF=0;
INTCON3bits.INT1IE=1;
INTCON2bits.INTEDG0=0;
INTCON2bits.RBPU=0;
}
/*********************************
中断服务函数
**********************************/
void ADDa (void)
{ a=a+1;
INTCONbits.INT0IF=0;
while(PORTBbits.RB0==0);
}
/********************
主函数 显示
***********************/
void main (void)
{ PORT_Init();
INT0_1();
TMR1_Init();
while (1)
{int count=0;
int c;
int b=a;
if(INTCONbits.TMR0IF==1)
{INTCONbits.TMR0IF=0;
TMR0H=(65536-a*1000000/2)/256;//计数初始化
TMR0L=(65536-a*1000000/2)%256;
if(PORTEbits.RE0==0) //电平翻转
PORTEbits.RE0=1;
else PORTEbits.RE0=0;
}
for(;count<=3;) //选通数码管
{PORTD=lookup1[count];
c=b%10; //显示频率
b=b/10;
PORTC=lookup[c];
Delay1KTCYx(20);
count++;
}
}
}
------解决方案--------------------------------------------------------
我忘了#pragma interrupt ADDa了 真是惭愧,看来要好好看书