51单片机控制数码管拉幕显示

昨天晚上看到个题目,用51控制数码管显示123456789,做出拉幕效果,也就是循环显示。今天中午没事,就顺手写出来了。

代码如下:

 

#include<reg51.h>

#define uchar unsigned char

uchar smg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};

uchar a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,tem,temp;

void delay1ms(uchar i) //延时1ms
{
 while(i--)
 {
  uchar j;
  for(j=0;j<115;j++);
 }
}

void InitDisplay();
void InitT0();

void main()
{
 
 InitT0();

 while(1)
 {
  InitDisplay();
  //delay1ms(15); 
 }
 

}

void InitT0()   //定时器T0初始化
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 TMOD=0x01;
 EA=1;
 ET0=1;
 TR0=1;
}

void InitDisplay()  //开始显示12345678
{
  P2=0xfe;   //位选
 P0=smg[a];   //段选
 delay1ms(3);  //延时太长,数码管显示很跳,太短数码管亮度太暗
 P2=0xfd;
 P0=smg[b];
 delay1ms(3);
 P2=0xfb;
 P0=smg[c];
 delay1ms(3);
 P2=0xf7;
 P0=smg[d];
 delay1ms(3);
 P2=0xef;
 P0=smg[e];
 delay1ms(3);
 P2=0xdf;
 P0=smg[f];
 delay1ms(3);
 P2=0xbf;
 P0=smg[g];
 delay1ms(3);
 P2=0x7f;
 P0=smg[h];
 delay1ms(3);
}

void interrupt1() interrupt 1 using 0 //中断间隔1ms
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 temp++;
 if(20==temp)
 {
  temp=0;
    tem=a;
  a=b;
  b=c;
  c=d;
  d=e;
  e=f;
  f=g;
  g=h;
  h=tem;
 }
 
}