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);
} 展开
{
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);
} 展开
2个回答
展开全部
你还没有理解数码管的动态的显示
为什么4位数码管能够同时显示不同的数
是因为 你在对它不断的刷新
比如说
给数字8的段码
第一位数码管显示5MS 也就是延时
然后给数字4的段码
第二位数码管显示5MS
给数字6的段码
第三位数码管棚兄亩显示5MS
然后给数字5的段码
第四位数码管显示5MS
人肉眼能够识别的速度是20ms左右 一旦刷新速度过快 人就链森无法识别 速度过慢就不是动态显示了
光这么执行一遍 还不够尘扰 你必须得无限循环
这样四位数码管就显示8465四个数
你把数码管显示的程序放在中断中 中断的间隔时间太长 势必无法持续刷新 就造成显示成一位了
为什么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
展开全部
不延时还没看清,,,就没了
追问
?不加延时也没用,只能显示最后一位出来,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询