前些天弄了一个小开发板(布局和焊接都很垃圾,就不拿出来献丑了,呵呵),其中有一个电子表实验,书中按键查询程序是在中断里执行的,大概三百多行代码,仿真时,按键就是不能被响应。后来终于发现一个函数在中断里没有正确执行出的结果。最终发现,是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;
}
 
不管读时,分,还是秒,读哪个,哪个变零。
终于改用查询去读写,中断只进行显示。
不知小弟之言可否抛砖引玉啊,呵呵。。。
 
网友回复:既然可以仿真就在中断里面设个断点,看看到底怎么回事,怀疑根本没有进中断。还有显示别在中断里面,中断一般不宜做比较费时的工作,也就是说中断程序应该越简单越好。你如果想实现定时刷新,可以在中断里面置标志位,然后在中断外面显示,并把标志位清零。对于你这样的应用影响应该也不大,但这是一种比较好的习惯!