单片机数码管动态显示的问题

(case后面的语句是控制三八译码器的过程)下面是代码,不明白的地方是switch语句用break跳出来之后不应该是从刚开始的计时器定时开始重新循环吗,怎么能实现动态显示呢?
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 number[] = {0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e};

sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit LED = P0^0;

main()
{
uint8 counter,i,j=0;

ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xB8;
TL0 = 0x00;
TR0 = 1;
while(1)
{
if(1 == TF0)
{
TF0 = 0;
TH0 = 0xB8;
TL0 = 0x00;
counter++;
}
if(50 == counter)
{
P0 = number[i++];
counter = 0;
}
if(i == 16)
{
i = 0;
}
switch(j)
{
case 0:ADDR0 = 0; ADDR1 = 0; ADDR2 = 0;j++;break;
case 1:ADDR0 = 1; ADDR1 = 0; ADDR2 = 0;j++;break;
case 2:ADDR0 = 0; ADDR1 = 1; ADDR2 = 0;j++;break;
case 3:ADDR0 = 1; ADDR1 = 1; ADDR2 = 0;j++;break;
case 4:ADDR0 = 0; ADDR1 = 0; ADDR2 = 1;j++;break;
case 5:ADDR0 = 1; ADDR1 = 0; ADDR2 = 1;j=0;break;

}
}
}

第1个回答  2014-01-04
/*数码管动态显示12345678
*******************************************************************************************/

#include <reg52.h>
#define uchar unsigned char

unsigned char code dutable[]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90,// 4, 5, 6, 7, 8, 9,
0x88,0x83,0xc6,0xa1,0x86,0x8e};//a,b,c,d,e,f,
unsigned char code wetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar num1,num2;

void delay_1ms()//毫秒级延时约等于4*256*1 us = 1024 us≈1 ms
{
unsigned char j=0,i=4;
do
{
while(--j) ;
}
while(--i);
}

void delay_ms(unsigned char i) //i*1毫秒延时
{
while(i--)
delay_1ms();
}

void main (void)
{ num1=0;
num2=0;
while(1)
{
if(num1==8)//==测试等于 看看是否为真
num1=0;
if(num2==8)
num2=0;

P2=wetable[num1];
P0=dutable[num2];
delay_ms(1);
num1++;
num2++;
}
}
第2个回答  2014-01-04
这个程序错的。把定时器中断放到循环里面了。应该把第一个if里面的中断标志位清零、重装和counter计数放到中断函数里面,counter定义为volatile型。追问

程序我已经用板子试了,是好用的

本回答被提问者采纳
第3个回答  2014-01-04
电路图有吗?追问

电路图没什么用,我问的就是这个循环过程

追答

这是八位数码管的程序吗?

追问

对的,6个8位数码管通过三八译码器实现动态显示

追答

板子上是不是每个数码管都显示一个数字1s后显示另一个数字啊?

相似回答