标题:
xep100按键中断跳出调试
[打印本页]
作者:
freewind20
时间:
2011-7-12 10:40
标题:
xep100按键中断跳出调试
写了一个按键中断的程序,一按按键就退出整个程序,想在中断后继续运行整个程序。
#define led PORTB
#define ledd DDRB
#define key_up PTIH_PTIH2
#define key_left PTIH_PTIH3
#define key_right PTIH_PTIH4
#define key_down PTIH_PTIH5
#define key_up_d DDRH_DDRH2
#define key_left_d DDRH_DDRH3
#define key_right_d DDRH_DDRH4
#define key_down_d DDRH_DDRH5
#define kb_p PTIH //输出端口
#define kb_d DDRH //输出方向
#define kb_pe PERH //上拉 下拉 电阻
#define kb_ps PPSH //上升沿 下降沿
#define kb_ie PIEH //中断使能
#define kb_if PIFH //中断标志
#define uchar unsigned char
#define uint unsigned int
uchar data=0x01;
uchar direction=1;
uchar time=5;
void delayms(uint xms);
void led_init(void);
void key_init(void);
void main(void) {
DisableInterrupts;
led_init();
key_init();
EnableInterrupts;
for(;;) {
delayms(time);
if(direction==1){
data=data<<1;
if(data==0)
data=0x01;
} else{
data=data>>1;
if(data==0)
data=0x80;
}
led=~data;
} /* loop forever */
/* please make sure that you never leave main */
}
/*延时函数*/
void delayms(uint xms){
uint ii,jj;
for(ii=xms;ii>0;ii--)
for(jj=40000;jj>0;jj--);
}
/*点亮led*/
void led_init(void){
ledd=0xff;
led=~data;
}
/*按键初始化*/
void key_init(void){
key_up_d=0;
key_left_d=0;
key_right_d=0;
key_down_d=0;
kb_ps=0x00; //下降沿
kb_ie=0xff; //中断禁止
kb_if=0xff; //清除中断标志
}
/*按键中断函数*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 25 key_interrupts(void){
//kb_if=0xff; //清除中断标志
//kb_ie=0x00;
/*if(key_up==0){
time-=1;
if(time==0)
time=1;
}
if(key_down==0){
time+=1;
if(time>10)
time=10;
}*/
if(key_left==0)
direction=0;
if(key_right==0)
direction=1;
//kb_ie=0xff;
asm {
pula;
rti;
}
}
#pragma CODE_SEG DEFAULT
作者:
freewind20
时间:
2011-7-12 10:45
中断后应该跳回程序中断的地方继续运行,为什么上面程序中断之后跳出了整个程序。
作者:
hanqi1236
时间:
2011-7-12 11:28
你是不是应该把中断标志给清了啊
作者:
freewind20
时间:
2011-7-12 11:33
楼上的说的很对,把中断标志给清除了,改成这样就不跳出了
/*按键中断函数*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 25 key_interrupts(void){
DisableInterrupts;
if(key_up==0){
time-=1;
if(time==0)
time=1;
}
if(key_down==0){
time+=1;
if(time>10)
time=10;
}
if(key_left==0)
direction=0;
if(key_right==0)
direction=1;
EnableInterrupts;
}
#pragma CODE_SEG DEFAULT
但是有一个新的问题就是中断后并没有回到原来的循环
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0