前些天弄了一个小开发板(布局和焊接都很垃圾,就不拿出来献丑了,呵呵),其中有一个电子表实验,书中按键查询程序是在中断里执行的,大概三百多行代码,仿真时,按键就是不能被响应。后来终于发现一个函数在中断里没有正确执行出的结果。最终发现,是ht1380的读函数没正确执行。读出的全是零。把它放到主函数里,一下就正确了,而且执行多少次都出正确结果,中断里语句执行时间远小于下次中断到来时间。我看了中断里不能执行的函数,这个读函数应该没有那种限制啊。
uchar read(){
uchar i,m;
for(i=0;i<8;i++){
iodata = 1;
m = m>>1;
if(iodata)
m = m|0x80;
sclk = 1;
_nop_();
_nop_();
sclk = 0;
}
return m;
}
uchar readbyte(uchar m){
rst = 0;
_nop_();
_nop_();
sclk = 0;
_nop_();
_nop_();
rst = 1;
write(m);
m = read();
_nop_();
_nop_();
rst = 0;
return m;
}
中断
void time0() interrupt 1 using 1{
TL0 = 37896%256;
TH0 = 37896/256;
disdata[0] = (readbyte(0x81))%16;
disdata[2] = (readbyte(0x83))%16;
disdata[4] = (readbyte(0x85))%16;
}
不管读时,分,还是秒,读哪个,哪个变零。
终于改用查询去读写,中断只进行显示。
不知小弟之言可否抛砖引玉啊,呵呵。。。
网友回复:既然可以仿真就在中断里面设个断点,看看到底怎么回事,怀疑根本没有进中断。还有显示别在中断里面,中断一般不宜做比较费时的工作,也就是说中断程序应该越简单越好。你如果想实现定时刷新,可以在中断里面置标志位,然后在中断外面显示,并把标志位清零。对于你这样的应用影响应该也不大,但这是一种比较好的习惯!