C51单片机发光二极管实例程序集
扫描二维码
随时随地手机看文章
1、
程序实现功能:让8个排列的LED来回流动着亮1—》...——》8 1《——...《——8 箭头代表LED流动方向,先从1-8然后从8到1依次循环。程序已经测试过,运行正常//大家如果用此代码测试的话注意你的LED接在单片机的那个端口,本代码用的是P2口
#include
#define uint unsigned int
#define uchar unsigned char
uchar a,b;
uchar code led_array[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
}; //led显示编码数组,从0xfe——0x7f为从第一个led管到第8个led管一次亮一个格式为0fff fffff0ff ffffff0f ffff...ffff fff0 led从1开始亮,到第8个LED时开始反向以次流动着亮ffff fff0ffff ff0fffff f0ff...0fff ffff(注:0代表亮;1代表不亮)不知道大家看懂我写的意思了没....
void delay(uint x)
{
uint z,y;
for(z=x;z>0;z--)
for(y=110;y>0;y--);
}//延时函数
void sumup_ini()
{
P2=0xfe;//
}//总初始化函数,本人喜欢模块化写程序,不过这个模块一太小了..咳咳咳!!!
void main()
{
sumup_ini();//调用总初始化函数
while(1)这个不用说了吧!
{
for(a=0;a<8;a++)
{
P2=led_array[a];
if(P2!=led_array[7]) //这里用if判断LED是否亮到了最后一个,如果已经是最后一个,则不执行延时函数,否则LED每移动一位都要执行以下延时
/*(这里解释以下为什么判断LED是否亮到最后一个,因为如果LED已经是最后一个亮了还执行延时的话,就会与反向流动函数的初始值相同led_array[7]是LED反向流动亮的第一位是LED反向流动的最后一位,所以如果不用if判断的话就相当于在led_array[7]是延时了2倍的其它LED亮的时间...为了让每个LED亮的时间长短相等所以我就用if判断了以下)*/
delay(500);
} //LED正向流动亮
for(b=7;b>0;b--)
{
P2=led_array[b];
delay(500);
} //LED方向流动亮
}
}