#include <reg52.h>
//位绑定
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
/*一颗小灯点亮*/
void main()
{
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
LED = 0;//点亮右小灯
while(1);
}
/*一颗小灯闪烁 */
void main()
{
unsigned int i = 0;
ENLED = 0;
ADDR3 = 1;//使用138译码器U3
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
LED = 0;//点亮右小灯
while(1)
{
LED = 0;
for(i = 0;i < 30000;i++);//延时,让小灯闪烁
LED = 1;
for(i = 0;i < 30000;i++);
}
}
/*小灯点亮,并向左一颗一颗的闪烁 */
unsigned int i = 0;//定义循环变量 i 用于延时
unsigned char cnt = 0;//定义计数变量,用于移位控制
void main()
{
ENLED = 0;
ADDR3 = 1;//使用138译码器U3
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while(1)
{
P0 = ~(0x01 << cnt);//P0等于 1 左移cnt位,控制 8 个 LED
for(i = 0;i < 20000;i++);
cnt++;//移位计数变量自加 1
if(cnt >= 8)//移位计数超过 7 位后,再重新从 0 开始
{
cnt = 0;
}
}
}
/*控制LED左移后再右移(呼吸灯) */
//数据源
unsigned char code DataArray[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
unsigned char i;//循环输出数组里面的值
//延时
void delay_ms(unsigned int j)
{
while(j--);
}
void main()
{
//配置条件
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
ENLED = 0; //使能
while(1)
{
for(i=0;i<8;i++)
{
P0=DataArray[0] >> i;//控制LED向右移
delay_ms(30000);
}
for(i=0;i<8;i++)
{
P0=~(DataArray[7] << i);//控制LED向左移
delay_ms(30000);
}
}
}
/*控制LED左移后再右移(闪烁灯) */
//数据源
unsigned char code DataArray[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
//方向标志位
unsigned char flag=0;
unsigned char i;
//延时
void delay_ms(unsigned int i)
{
while(i--);
}
void main()
{
//配置条件
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
ENLED = 0;
if(flag==0)
{
for(i=0;i<8;i++)
{
P0 = DataArray[i];
delay_ms(30000);
}
if(i==8)
{
flag=1;
}
}if(flag==1)
{
for(i=0;i<8;i++)
{
P0 = DataArray[7-i];
delay_ms(30000);
}
if(i==8)
{
flag=0;
}
}
/*两边向中间闪烁 再从中间倒回去 */
//数据源
unsigned char code buff[]={0x7e,0xbd,0xdb,0xe7,
0xe7,0xdb,0xbd,0x7e};
unsigned char i;
unsigned int cnt;
//延时
void delay_ms(unsigned int i)
{
while(i--);
}
void main()
{
//配置条件
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
ENLED = 0;
while(1)
{
cnt=0;
for(i=0;i<8;i++)
{
P0 = buff[i];
delay_ms(30000);
}
}
}
/*实现同时向左或者向右 中间隔三颗 */
//数据源
unsigned char code buff[]={0x7e,0xbd,0xdb,0xe7,
0xe7,0xdb,0xbd,0x7e};
unsigned char i;
unsigned int cnt;
//延时
void delay_ms(unsigned int i)
{
while(i--);
}
void main()
{
//配置条件
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
ENLED = 0;
TMOD = 0x01;
TH0 = 0x4c;
TL0 = 0x00;
TR0 = 1;
while(1)
{
for(i=0;i<8;)
{
if(TF0 == 1)
{
TF0=0;
TH0 = 0x4c;
TL0 = 0x00;
cnt++;
if(cnt==10)
{
cnt=0;
P0 = buff[i];
i++;
}
}
}
}
}
/* 定时器 和中断的结合 实现流水灯效果 */
#include <reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//数据源
unsigned char code DataArray[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
unsigned char i;//循环输出数组里面的值
unsigned short count = 0;//记录中断次数
unsigned long second = 0;//记录所需要的时间
bit flag = 0;
void main()
{
//配置条件
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
ENLED = 0; //使能
//定时1ms的配置
//采用定时器0 模式设置
TMOD = TMOD | 0x01;
//计数初始值
TH0 = 0xfc;
TL0 = 0x66;
//开启定时
TR0 = 1;
//中断配置
//中断总开关
EA = 1;//IE = 0x80;
//定时器0的中断时能
ET0 = 1;
while(1);
}
void InterruptTime0() interrupt 1
{
//初始值重新赋值
TH0 = 0xFC;
TL0 = 0x66;
count++;
//消隐
//P0 = 0xff;
if(count == 1000)
{
count = 0;
if(flag == 0) //标志,0右移,1左移
{
P0 = (0x7F >> i++);
if(i == 8) //到8之后,修改标志位,清0
{
flag = 1;
i = 0;
}
}
if(flag == 1)
{
P0 = ~(0xFF << i++);
if(i == 8)
{
i = 0;
flag = 0;
}
}
}
}
多种花样流水灯
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 1功能概述 流水广告灯主要应用于LED灯光控制。通过程序控制LED的亮和灭,多个LED灯组成一个阵列,依次逐个点亮...