关于定时器动态扫描数码管
时间:10-02
整理:3721RD
点击:
对单片机的中断不太了解,研究了好久不知道怎么写,觉得应该是自己的程序有问题,但是自己看又看不出,想请教一下这样写对不对,只有显示和中断部分,不显示。
void display(uchar qian,uchar bai,uchar shi,uchar ge,uchar se)
{
qian=cl/10;
bai=cl%10;
shi=mu/10;
ge=mu%10;
switch(tt)
{
case 0:
P0=tableqian01[qian];
dula1=1;
dula1=0;
P2=tableqian21[qian];
dula2=1;
dula2=0;
we1=1;
break;
case 1: we1=0;
P0=tableqian02[qian];
dula1=1;
dula1=0;
P2=tableqian22[qian];
dula2=1;
dula2=0;
we2=1;
break;
case 2: we2=0;
P0=tablebai01[bai];
dula1=1;
dula1=0;
P2=tablebai21[bai];
dula2=1;
dula2=0;
we1=1;
break;
case 3: we1=0;
P0=tablebai02[bai];
dula1=1;
dula1=0;
P2=tablebai22[bai];
dula2=1;
dula2=0;
we2=1;
break;
case 4: we2=0;
P0=tableshi01[shi];
dula1=1;
dula1=0;
P2=tableshi21[shi];
dula2=1;
dula2=0;
we1=1;
break;
case 5: we1=0;
P0=tableshi02[shi];
dula1=1;
dula1=0;
P2=tableshi22[shi];
dula2=1;
dula2=0;
we2=1;
break;
case 6: we2=0;
P0=tablege01[ge];
dula1=1;
dula1=0;
P2=tablege21[ge];
dula2=1;
dula2=0;
we1=1;
break;
case 7: we1=0;
P0=tablege02[ge];
dula1=1;
dula1=0;
P2=tablege22[ge];
dula2=1;
dula2=0;
we2=1;
break;
case 8: we2=0;
P0=0;
dula1=1;
dula1=0;
P2=0;
dula2=1;
dula2=0;
we1=1;
break;
case 9: we1=0;
P0=0;
dula1=1;
dula1=0;
P2=tablese22[se];
dula2=1;
dula2=0;
we2=1;
break;
case 10:we2=0;
break;
}
}
void main()
{
write_ds(0x0A,0x2e);
delay(10);
write_ds(0x0B,0x0f);
TMOD=0x11;
TH0=0x1f;
TL0=0xa3;
TH1=0xff;
TL1=0xa3;
EA=1;
ET0=1;
ET1=1;
TR1=0;
TR0=1;
while(1)
{
cl=read_ds(4);
mu=read_ds(2);
se=read_ds(0);
display(qian,bai,shi,ge,se);
}
}
void timer1() interrupt 3
{
TH1=0xff;
TL1=0xa3;
tt++;
if(tt==10)
tt=0;
}
void display(uchar qian,uchar bai,uchar shi,uchar ge,uchar se)
{
qian=cl/10;
bai=cl%10;
shi=mu/10;
ge=mu%10;
switch(tt)
{
case 0:
P0=tableqian01[qian];
dula1=1;
dula1=0;
P2=tableqian21[qian];
dula2=1;
dula2=0;
we1=1;
break;
case 1: we1=0;
P0=tableqian02[qian];
dula1=1;
dula1=0;
P2=tableqian22[qian];
dula2=1;
dula2=0;
we2=1;
break;
case 2: we2=0;
P0=tablebai01[bai];
dula1=1;
dula1=0;
P2=tablebai21[bai];
dula2=1;
dula2=0;
we1=1;
break;
case 3: we1=0;
P0=tablebai02[bai];
dula1=1;
dula1=0;
P2=tablebai22[bai];
dula2=1;
dula2=0;
we2=1;
break;
case 4: we2=0;
P0=tableshi01[shi];
dula1=1;
dula1=0;
P2=tableshi21[shi];
dula2=1;
dula2=0;
we1=1;
break;
case 5: we1=0;
P0=tableshi02[shi];
dula1=1;
dula1=0;
P2=tableshi22[shi];
dula2=1;
dula2=0;
we2=1;
break;
case 6: we2=0;
P0=tablege01[ge];
dula1=1;
dula1=0;
P2=tablege21[ge];
dula2=1;
dula2=0;
we1=1;
break;
case 7: we1=0;
P0=tablege02[ge];
dula1=1;
dula1=0;
P2=tablege22[ge];
dula2=1;
dula2=0;
we2=1;
break;
case 8: we2=0;
P0=0;
dula1=1;
dula1=0;
P2=0;
dula2=1;
dula2=0;
we1=1;
break;
case 9: we1=0;
P0=0;
dula1=1;
dula1=0;
P2=tablese22[se];
dula2=1;
dula2=0;
we2=1;
break;
case 10:we2=0;
break;
}
}
void main()
{
write_ds(0x0A,0x2e);
delay(10);
write_ds(0x0B,0x0f);
TMOD=0x11;
TH0=0x1f;
TL0=0xa3;
TH1=0xff;
TL1=0xa3;
EA=1;
ET0=1;
ET1=1;
TR1=0;
TR0=1;
while(1)
{
cl=read_ds(4);
mu=read_ds(2);
se=read_ds(0);
display(qian,bai,shi,ge,se);
}
}
void timer1() interrupt 3
{
TH1=0xff;
TL1=0xa3;
tt++;
if(tt==10)
tt=0;
}
动态扫描利用的事眼睛的余晖效应,也就是视觉暂留
不知道你现在程序的效果是怎样的
利用定时器的话就要考虑定时多少的问题哈
动态扫描实现的是数码管的选通,然后数码管的显示一般没有什么问题吧
把void display()内的函数直接放到中断子函数里
段的开关太快了吧
中断没打开,谢谢帮我看了的人。