发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
请问中断函数中不能有display(a,b,c,d...)函数吗?
141 定时器 中断 函数 数码管
分享
中断中是不是能不能有display(a,b,c,d...)函数啊,我用的定时器中断,但是display没有用,a,b,c,d...是全局变量。(想做一个以10ms为最小单位的秒表)--(小时)--(分)--(秒)--(100ms 和 10ms)
如下:数码管没有显示
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;//数码管段选
sbit wela = P2^7;//数码管段选
char a0,b0,c0,d0,e0,f0,g0,h0;
unsigned long num=0;
//共阴数码管段选表0-9
unsigned char code table[10]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);                 
}
void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)
{
   dula=0;
   P0=table[a];
   dula=1;
   dula=0;
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(2);
   P0=table;
   dula=1;
   dula=0;
   P0=0xfd;
   wela=1;
   wela=0;
   delay(2);
   P0=table[c];
   dula=1;
   dula=0;
   P0=0xfb;
   wela=1;
   wela=0;
   delay(2);
   P0=table[d];
   dula=1;
   dula=0;
   P0=0xf7;
   wela=1;
   wela=0;
   delay(2);
   P0=table[e];
   dula=1;
   dula=0;
   P0=0xef;
   wela=1;
   wela=0;
   delay(2);
   P0=table[f];
   dula=1;
   dula=0;
   P0=0xdf;
   wela=1;
   wela=0;
   delay(2);
   P0=table[g];
   dula=1;
   dula=0;
   P0=0xbf;
   wela=1;
   wela=0;
   delay(2);
   P0=table[h];
   dula=1;
   dula=0;
   P0=0x7f;
   wela=1;
   wela=0;
   delay(2);
}
void time0() interrupt 1
{
                TH0=0xff;
                TL0=0xff;
          display(a0,b0,c0,d0,e0,f0,g0,h0);
}
//定时器0初始化
void timer0Init()
{
        TR0 = 1;         //启动定时器0
        TMOD = 0X01; //定时器工作模式1,16位定时器计数模式
        TH0 = 0xff;
        TL0 = 0xff;//达不到啊!!!!!!
}
void main()//main函数自身会循环
{        
        timer0Init();//定时器0初始化
        while(1)
{
                  IF(e0==6&&g0==9&&h0==9&&c0!=6) num=num+3901;
                        else if(e0==6&&g0==9&&h0==9&&c0==6&&(a0!=2&&b0!=4)) num=num+393901;
                        else if(e0==6&&g0==9&&h0==9&&c0==6&&(a0==2&&b0==4)) num=0;
                        else num++;
}
a0=num/10000000;b0=num%10000000/1000000;c0=num%1000000/100000;d0=num%100000/10000;e0=num%10000/1000;f0=num%1000/100;g0=num%100/10;h0=num%10;
}
0
2019-10-12 08:10:23   评论 分享淘帖 邀请回答
6个回答
这个程序架构不好,定时器只做时间计数用就好,数码管显示要独立出来,对计数进行时间换算,并在相应的时间位上显示当前计数时间就好!
2019-10-12 10:12:50 评论

举报

1.可以用delay  但是用了display之后你的程序很长一段时间是在中断里面的   这样的坏处是  “死在”中断里面(你的disply里面有很多的delay)  外面的程序得不到执行  效率低
2.你标题里面提到了  (想做一个以10ms为最小单位的秒表)--(小时)--(分)--(秒)--(100ms 和 10ms)   由于你的display函数用了很多delay  所以你的时间很难准确
2019-10-12 10:26:15 评论

举报

另外,10ms在数码管显示你可能根本看不出来显示了,太快了!
2019-10-12 10:32:09 评论

举报

2019-10-12 10:37:48 评论

举报

2019-10-12 10:48:40 评论

举报

定时中断只要计数就可以了,别的就不要做了,display放到主程序中即可
2019-10-12 14:28:08 评论

举报

只有小组成员才能发言,加入小组>>

861个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表