AVR单片机中,为什么把数码管显示程序放到中断中就不能显示了,?还有为什么数码管显示程序一定要加延时

voidmain(){timer1_init();DDRB=0XFF;DDRD=0Xff;PORTB=0Xff;PORTD=0XFF;//PORTD&=~BIT(1);w... void main()
{
timer1_init();

DDRB=0XFF;
DDRD=0Xff;

PORTB=0Xff;
PORTD=0XFF;
//PORTD&=~BIT(1);

while(1)
{

//smg_dis(gao,di);

/*PORTB=0xff;
PORTD=0xfe ;
PORTB=0x00;
delayus(5);
PORTB=0xff;
PORTD=0xfd ;
PORTB=0x00; */
}
}

void smg_dis(uchar a,uchar b) //共阳数码管,1-8位分别:e d dp c g b f a
{
uchar table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};

PORTB=0xff;
PORTD=0x7f;
PORTB=table[a/10];
delayus(6);

PORTB=0xff;
PORTD=0xbf;
PORTB=table[a%10];
delayus(6);

PORTB=0xff;
PORTD=0xdf;
PORTB=table[b/10];
delayus(6);

PORTB=0xff;
PORTD=0xef;
PORTB=table[b%10];
delayus(6);
}

#pragma interrupt_handler timer_1:15
void timer_1(void)
{
TIMSK&=~BIT(2);
TCNT1H=(65536-3125)/256;
TCNT1L=(65536-3125)%256;
smg_dis(23,89);
di++;
if(di==99)
{
di=0;
gao++;
if(gao==99)
gao=0;
}
TIMSK|=BIT(2);
}
展开
 我来答
好嘞啊啊啊啊
2014-12-02 · TA获得超过2612个赞
知道大有可为答主
回答量:1860
采纳率:66%
帮助的人:1191万
展开全部
你还没有理解数码管的动态的显示
为什么4位数码管能够同时显示不同的数
是因为 你在对它不断的刷新
比如说
给数字8的段码
第一位数码管显示5MS 也就是延时
然后给数字4的段码
第二位数码管显示5MS
给数字6的段码
第三位数码管棚兄亩显示5MS
然后给数字5的段码
第四位数码管显示5MS
人肉眼能够识别的速度是20ms左右 一旦刷新速度过快 人就链森无法识别 速度过慢就不是动态显示了

光这么执行一遍 还不够尘扰 你必须得无限循环
这样四位数码管就显示8465四个数

你把数码管显示的程序放在中断中 中断的间隔时间太长 势必无法持续刷新 就造成显示成一位了
更多追问追答
追问
定时器定时的是50ms,50ms刷新一次,不能显示吗?如果硬是要定时器刷新,可以控制出来吗?
追答
void main()
{
  timer1_init();
  
  DDRB=0XFF;
  DDRD=0Xff;
  
  PORTB=0Xff;
  PORTD=0XFF;
  //PORTD&=~BIT(1);
 
     while(1)
     { 
          smg_dis(gao,di);//高低是全局变量吧
      }
}
 
void smg_dis(uchar a,uchar b)  //共阳数码管,1-8位分别:e d dp c g b f a
   {  
      uchar  table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
    
   PORTB=0xff; 
   PORTD=0x7f;   
   PORTB=table[a/10];
  delayus(6);
 
      PORTB=0xff;
         PORTD=0xbf;  
   PORTB=table[a%10];
   delayus(6);
   
     PORTB=0xff;
   PORTD=0xdf;  
   PORTB=table[b/10];
  delayus(6);
   
     PORTB=0xff;
     PORTD=0xef;    
     PORTB=table[b%10];
     delayus(6);
  } 
 
#pragma interrupt_handler timer_1:15
void timer_1(void)
{   
   TIMSK&=~BIT(2);
   TCNT1H=(65536-3125)/256;
   TCNT1L=(65536-3125)%256;
   di++;
   if(di==99)
   {
     di=0;
  gao++;
  if(gao==99)
  gao=0;
   }
   TIMSK|=BIT(2);
}


gao,di需是全局变量   这样行不

当然可以用定时器
匿名用户
2014-12-02
展开全部
不延时还没看清,,,就没了
追问
?不加延时也没用,只能显示最后一位出来,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式