两种方式实现
/*用定时器以间隔500MS在6位数码管上
依次显示0、1、2、3….C、D、E、F,重复。*//*轮流在每一位数码管上显示*/
-----------------------------------------------------①---------------------------------------------------------------------
/*利用一个定时器实现数码管从左到右每位依次显示数字,且数字由0变到F再变到0,循环。*/
#include<reg52.h>
#define ui unsigned int
#define uc unsigned char
void init();
sbit we=P2^7;
sbit du=P2^6;
/*数码管段码表*/
uc code tabledu[]= //段码表
{
/*0 1 2 3*/
0x3f,0x06,0x5b,0x4f,
/*4 5 6 7*/
0x66,0x6d,0x7d,0x07,
/*8 9 A B*/
0x7f,0x6f,0x77,0x7c,
/*C D E F 不显示*/
0x39,0x5e,0x79,0x71,0
};
/*数码管位码表*/
uc code tablewe[]= //位码表(从高位到低位)
{
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};
ui i;
uc numdu=0;
uc numwe=0;
uc flag=0;
void main()
{
init(); //初始化定时器0
i=0;
we=1;
P0=tablewe[0]; //显示第一位数码管;
we=0;
du=1;
P0=tabledu[0];
du=0;
while(1)
{
if(i==20)
{
i=0;
numdu++;
numwe++;
if(numdu==16)
numdu=0;
if(numwe==8)
numwe=0;
we=1;
P0=tablewe[numwe];
we=0;
du=1;
P0=tabledu[numdu];
du=0;
TR0=1;
}
}
}
void init()
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65535-50000)/256; // "/"是求模运算 即能被几个整除
TL0=(65535-50000)%256; // "%"是求余运算 即整除后剩余
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void time0()interrupt 1
{
TH0=(65535-50000)/256; // 再赋初值
TL0=(65535-50000)%256; //
i++;
if(i==20)
TR0=0;
}
-----------------------------------------------------②---------------------------------------------------------------------
/*用定时器以间隔500MS在6位数码管上
依次显示0、1、2、3….C、D、E、F,重复。*/
/*轮流在每一位数码管上显示*/
#include<reg52.h>
#define ui unsigned int
#define uc unsigned char
sbit du=P2^6;
sbit we=P2^7;
uc numwe,numdu;
uc flag=0;
ui tt;
uc code tabledu[]= //段码表
{
/*0 1 2 3*/
0x3f,0x06,0x5b,0x4f,
/*4 5 6 7*/
0x66,0x6d,0x7d,0x07,
/*8 9 A B*/
0x7f,0x6f,0x77,0x7c,
/*C D E F 不显示*/
0x39,0x5e,0x79,0x71,0
};
uc code tablewe[]= //位码表(从高位到低位)
{
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};
void delay(ui z)
{
ui x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void init_timer0()
{
TMOD=0x01;
TH0=(65536-46083)/256; //50ms
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
du=1;
P0=tabledu[0];
du=0;
while(1)
{
we=1;
if(numwe==8)
numwe=0;
P0=tablewe[numwe];
we=0;
if(flag)
{
du=1;
if(numdu==16)
numdu=0;
P0=tabledu[numdu];
du=0;
flag=0;
}
}
}
void main()
{
init_timer0();
display();
}
void timer0() interrupt 1
{
TH0=(65536-46083)/256; //50ms
TL0=(65536-46083)%256;
tt++;
if(tt==10)
{
numwe++;
numdu++;
flag=1;
tt=0;
}
}