请帮忙,这是运用51单片机实现4位8段LED数码管的动态数字显示的c语音程序,帮我详细注解一些关键性的句子

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count;
uint disnum;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar,uchar,uchar);
void delay(uchar);
void main()
{
EA=1;
ET1=1;
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(1)
{
if(count==20)
{
count=0;
if(disnum==1000)
disnum=0;
disnum++;
}
display(disnum/100,disnum%100/10,disnum%100%10);
}
}

void tim1() interrupt 3 using 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
}

void display(uchar bai,uchar shi,uchar ge)
{P0=tabledu[bai];
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(1);

P0=tabledu[shi];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(1);

P0=tabledu[ge];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(1);
}
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=255;b>0;b--);
}

#include<reg52.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
uchar count;
uint disnum;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code tabledu[]={//段码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar,uchar,uchar);
void delay(uchar);
void main()
{
EA=1;//开总中断
ET1=1;//开定时器T1中断
TMOD=0x10;//设置定时器T1为工作方式1
TH1=(65536-50000)/256;//定时50ms
TL1=(65536-50000)%256;
TR1=1;//启动定时器T1
while(1)
{
if(count==20)//定时1s
{
count=0;
if(disnum==1000)
disnum=0;
disnum++;//disnum值自加1
}
display(disnum/100,disnum%100/10,disnum%100%10);//显示disnum的值,从0显示到1000,时间间隔为1s
}
}

void tim1() interrupt 3 using 3
{
TH1=(65536-50000)/256;//重置定时参数
TL1=(65536-50000)%256;
count++;
}

void display(uchar bai,uchar shi,uchar ge)//显示子程序
{P0=tabledu[bai];//显示百位
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(1);

P0=tabledu[shi];//显示十位
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(1);

P0=tabledu[ge];//显示个位
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(1);
}
void delay(uchar x)//延时子程序
{
uchar a,b;
for(a=x;a>0;a--)
for(b=255;b>0;b--);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-22
#include <reg51.h>

void delay(unsigned int i); //函数声名
char DelayCNT;//定义变量

//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制

//此表为8个数码管位选控制, 共阴数码管 1-8个 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制

/************主函数**********************/
main()
{
unsigned int i,LedNumVal=1 ; //变量定义
unsigned int LedOut[10]; //变量定义

DelayCNT=0;

while(1)
{
if(++DelayCNT>=20) //控制数字变化速度
{
DelayCNT=0; //20个扫描周期清零一次
++LedNumVal; //每隔20个扫描周期加一次
}

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];

LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[7]=Disp_Tab[LedNumVal%10]; //个位

for( i=0; i<9; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法进行位选

/* switch(i) //使用switch 语句控制位选
{
case 0:P1 = 0x7F; break;
case 1:P1 = 0xbF; break;
case 2:P1 = 0xdF; break;
case 3:P1 = 0xeF; break;
case 4:P1 = 0xf7; break;
case 5:P1 = 0xfb; break;
case 6:P1 = 0xfd; break;
case 7:P1 = 0xfe; break;

} */

delay(150);//扫描间隔时间 太长会数码管会有闪烁感
}

}
}

/*******************延时函数**********************************************/
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
相似回答