单片机C语言程序请高手指点!

来源:百度知道 编辑:UC知道 时间:2024/06/27 18:17:43
用的是AT89C52蕊片,八段共阳极数码管:a,b,c,d,e,f,g,h分别接在P0口上的P0.1……P0.7上。数码管的COM端上接的是3906三极管分别接在P2.6与P2.7上。程式如下:
#include<at89x52.h>
sbit smg_one=P2^6; //定义数码管个位,P2.6上的共阳极
sbit smg_ten=P2^7; //定义数码管十位,P2.7上的共阳极
unsigned char a,b,c;
unsigned int d,e;
unsigned char code smg1[]={ 0xc0,0xf9,0xa4, //数码管个位
0xb0,0x99,0x92,
0x82,0xf8,0x80,
0x90,
0xff
};

unsigned char code smg10[]={ 0xc0,0xf9,0xa4, //数码管十位
0xb0,0x99,0x92,
0x82,0xf8,0x80,
0x90,
0xff
};

unsigned char code led_donzuo[]={ 0xfe,0xfd,0xfb,0xf7, //流水灯的动作
0xef,0xdf,0xbf,0x7f,
0x3f,0x1f

void led() //定义流水灯运行函数
{
P1=led_donzuo[a];
a++;
for(d=1;d<10;d++) //每个灯之间闪亮的延时
{ smg_one=0; //把LED扫描输出一次作为流水灯的延时基准
smg_ten=1;
P0=smg1[b];
for(e=1;e<400;e++); //动态显示时两管子这间互换显示时的延时
smg_one=1;
smg_ten=0;
P0=smg10[c];
for(e=1;e<400;e++); //动态显示时两管子这间互换显示时的延时
}
}

void smg() //定义数码管运行函数
{ c++; //当个位上的数码管显示完一周后,十位进一.
b=0; //个位从头再来
if(smg10[c]==0xff) //当十位数码管显示完一周后,从头再来.
c=0;
}
void main(void)
{ for(;;)
{ led();
smg();
if(led_donzuo[a]==0x55)
{ a=0;
b++;
}
}
}
//只需将流水灯的延时等待,改成数码管的扫描刷新就可以了。

延时程序上改动一下,最好在送了每一位数字后面都加上一个5ms的延时,如果延时过短就会造成显示太暗,另外想让数码管和流水灯分开作业也很简单,用中断,当数码管计数到预定值得时候开启P0口流水灯

对啊,输送字符进led前给阳极来个0 000 000极或阴极来个1 111 111,扫描太