OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 96|回复: 5

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

[复制链接]

  离线 

2

主题

4

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-7-10
在线时间
1 小时
发表于 6 天前 | 显示全部楼层 |阅读模式
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#楼]

这个程序架构不好,定时器只做时间计数用就好,数码管显示要独立出来,对计数进行时间换算,并在相应的时间位上显示当前计数时间就好!
回复

使用道具 举报

  离线 

0

主题

6

帖子

0

精华

新手上路

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

使用道具 举报

  离线 

8

主题

228

帖子

1

精华

高级会员

Rank: 4

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

STM32/LPC1788/51:
https://item.taobao.com/item.htm?id=564328903484
回复

使用道具 举报

  离线 

0

主题

6

帖子

0

精华

新手上路

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

使用道具 举报

  离线 

2

主题

4

帖子

0

精华

新手上路

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

是的,谢谢。
回复

使用道具 举报

  离线 

2

主题

4

帖子

0

精华

新手上路

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

嗯,谢谢。
回复

使用道具 举报

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

本版积分规则




关闭

"原子哥”推荐上一条 /1 下一条

QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-7-16 05:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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