OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4569|回复: 5

中断函数能不能调用函数(display)?

[复制链接]

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-10
在线时间
11 小时
发表于 2018-7-10 21:45:21 | 显示全部楼层 |阅读模式
2金钱
中断中是不是能不能有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[b];
   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;
}


最佳答案

查看完整内容[请看2#楼]

这个程序架构不好,定时器只做时间计数用就好,数码管显示要独立出来,对计数进行时间换算,并在相应的时间位上显示当前计数时间就好!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-4
在线时间
7 小时
发表于 2018-7-10 21:45:22 | 显示全部楼层
这个程序架构不好,定时器只做时间计数用就好,数码管显示要独立出来,对计数进行时间换算,并在相应的时间位上显示当前计数时间就好!
回复

使用道具 举报

13

主题

303

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2262
金钱
2262
注册时间
2015-2-3
在线时间
559 小时
发表于 2018-7-10 23:10:58 | 显示全部楼层
1.可以用delay  但是用了display之后你的程序很长一段时间是在中断里面的   这样的坏处是  “死在”中断里面(你的disply里面有很多的delay)  外面的程序得不到执行  效率低
2.你标题里面提到了  (想做一个以10ms为最小单位的秒表)--(小时)--(分)--(秒)--(100ms 和 10ms)   由于你的display函数用了很多delay  所以你的时间很难准确

STM32/LPC1788/51
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-4
在线时间
7 小时
发表于 2018-7-11 09:07:49 | 显示全部楼层
另外,10ms在数码管显示你可能根本看不出来显示了,太快了!
回复

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-10
在线时间
11 小时
 楼主| 发表于 2018-7-11 20:26:13 | 显示全部楼层
北极圈的黄昏 发表于 2018-7-10 23:10
1.可以用delay  但是用了display之后你的程序很长一段时间是在中断里面的   这样的坏处是  “死在”中断里 ...

是的,谢谢。
回复

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-10
在线时间
11 小时
 楼主| 发表于 2018-7-11 20:27:07 | 显示全部楼层
zcwang 发表于 2018-7-11 09:05
这个程序架构不好,定时器只做时间计数用就好,数码管显示要独立出来,对计数进行时间换算,并在相应的时间 ...

嗯,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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