10楼分析得有理,不过细节上有出入
" 问题一般出在255跳变的256的时候
关键在if(count > 250)这句.
可能被中断捣乱为count=0~~~(实际为256)"
看看 keil C 对 if(count > 250) 的编译结果:
SETB C R MOV A,count+01H ;------(1) SUBB A,#00H R MOV A,count ;------(2) SUBB A,#0FAH R xJLT ?C0546
假如在指令 (1) 后和 (2) 前发生中断,并且,中断将 count 值 由260 更新为 251, 这里执行情况是 count = 0, count+01H =4 (好象count = 4)的情况.
于是, 2楼的问题就出现了. 这样的问题很头痛,因为即使用DEBUG 仿真器调试, 也不会发现 count = 4 的情况!
不过,突然我想,如果这样写中断服务,能不能解决问题?
#pragma vector = TIMER1_COMPA_vect __interrupt void my_interrupt_routine(void) //定时中断 { count--; //count = 251~260 if(count < 251) { count = 260; } flag = 1; }
当然: main()的初始化也得变动一下.
|
|