打印

救助,大家过来看看

[复制链接]
2185|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
茫海千寻|  楼主 | 2011-4-26 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 茫海千寻 于 2011-4-26 21:56 编辑

刚写的一个简单中断函数,有些问题请教,是不是下面的程序写的有不足啊,有时候中断处理完后,不能接着原来的数据显示直接就又从零开始了!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit BEEP=P3^6;
uchar table[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
               0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

delay(uint x)
{
   uint a,b;
   for(a=x;x>0;x--)
     for(b=110;b>0;b--)        ;
}

main()
{
   uchar i;
   EA=1;
   EX0=1;
   IT0=1;
   while(1)
   {
    P2=0xfe;     //数码管位选
    for(i=0;i<10;i++)
     {
       P0=table;    //数码管段选
        delay(300);
      }
    }
}
void int0() interrupt 0
{
           BEEP=0;
         delay(50);
         BEEP=1;
}

相关帖子

沙发
Metalor| | 2011-4-26 18:26 | 只看该作者
P0=table; // 数码管段选

这句有问题

使用特权

评论回复
板凳
茫海千寻|  楼主 | 2011-4-26 20:19 | 只看该作者
那个地方本来是对的P0=table[i];不知道怎么一帖上面就成那样了。兄弟还能帮忙看出其他问题吗?

使用特权

评论回复
地板
sysdriver| | 2011-4-26 21:08 | 只看该作者
可能是“可重入函数”的问题,假如主函数中在delay(300)时发生中断,而中断又调用delay(50),嘿嘿。。。

可以这样去解决
delay(uint x) 改成 void delay(unit x) reentrant,但是,这样的程序结构很不好,不推荐这样弄,中断的时候弄个标记位,在主函数中处理好了。

使用特权

评论回复
5
茫海千寻|  楼主 | 2011-4-26 21:28 | 只看该作者
4# sysdriver 小弟初学可能有些愚钝,还是不明白楼上所说。即使delay()函数的变量值出错,那也应该延时混乱,和数码管显示的有关变量并没有关系,但为什么数码管的显示会被清零?

使用特权

评论回复
6
云的追寻| | 2011-4-26 21:46 | 只看该作者
{
       P0=table;   // 数码管段选/////////////////这里写错了///////////P0=table[a];
      delay(300);
     }

使用特权

评论回复
7
茫海千寻|  楼主 | 2011-4-26 21:50 | 只看该作者
本帖最后由 茫海千寻 于 2011-4-26 21:59 编辑

6# 云的追寻
那个地方本来是对的,不知道怎么一帖上面就成那样了。后来试了几次也没改过来,兄弟还能帮忙看出其他问题吗?

使用特权

评论回复
8
wang_2003| | 2011-4-27 09:04 | 只看该作者
那就是执行中断前没有保存现场呗,我觉得,所以会从零开始显示的

使用特权

评论回复
9
joyme| | 2011-4-27 09:25 | 只看该作者
你的INT0是什么样的信号,中断里不能放这种延时函数

使用特权

评论回复
10
ctxm2010| | 2011-4-27 09:46 | 只看该作者
改放个中断标志位,呵呵

使用特权

评论回复
11
sysdriver| | 2011-4-27 13:14 | 只看该作者
4# sysdriver 小弟初学可能有些愚钝,还是不明白楼上所说。即使delay()函数的变量值出错,那也应该延时混乱,和数码管显示的有关变量并没有关系,但为什么数码管的显示会被清零? ...
茫海千寻 发表于 2011-4-26 21:28

试过了吗?没试过就发问不好啊.因为,C编译器采用的是变量覆盖技术,所以延时的变量可能和显示的变量是重叠的也说不定.,要发现问题,其实也简单,进去DEGUG就行了.要么就打开反汇编查看.要找问题,总得一个个排除,总要一个个来试的.

使用特权

评论回复
12
xwj| | 2011-4-27 13:18 | 只看该作者
毛病,中断里延什么时。

——当然,这不是问题的主要原因,最好还是你自己去仿真、跟踪下程序

使用特权

评论回复
13
shiwilson| | 2011-4-27 13:32 | 只看该作者
延时函数的delay前最好加void , LZ的数码管是从0显示到9?   一维数组定义的是0~F,但这并不重要
中断服务程序最好这样写
void int0() interrupt 0
{
           BEEP=~BEEP;
         
}

使用特权

评论回复
14
zjswuyunbo| | 2011-4-27 13:48 | 只看该作者
delay(uint x) 改成 void delay(unit x) reentrant

使用特权

评论回复
15
茫海千寻|  楼主 | 2011-5-5 16:44 | 只看该作者
8# wang_2003 我开始也这么想的,但是有时候中断后也能正确的接着显示。

使用特权

评论回复
16
茫海千寻|  楼主 | 2011-5-5 16:48 | 只看该作者
9# joyme 我把里面的延时函数去了,但又有新的问题的了,将触发方式改为低电平触发,问题:按住中断键不松手,数码管并不停下不动,而是显示改变数字的速度慢了。

使用特权

评论回复
17
茫海千寻|  楼主 | 2011-5-5 16:51 | 只看该作者
我单独为中断函数写了一个延时函数,显示还是出错!

使用特权

评论回复
18
茫海千寻|  楼主 | 2011-5-5 21:19 | 只看该作者
谢谢大家的帮助啊,我今天换了一个片子AT89s52的,还是原来的程序没有改动可以正确的显示,现在开始对STC的片子产生怀疑了!

使用特权

评论回复
19
茫海千寻|  楼主 | 2011-5-5 21:25 | 只看该作者
另外还有一个问题请教一下大家,
问题:
中断方式为低电平触发,按住中断按键不松手正常现象应该是数码管显示停止改变,而我现在的情况是,数码管仍然按中断前的该变,只不过改变速度比以前的慢了!
这是什么原因导致???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

19

帖子

1

粉丝