蓝桥杯LED灯点亮技巧:几种常用流水灯代码解析

如果想看LED灯点亮的一些详细讲解,请看:
链接: 基于蓝桥杯的51知识体系梳理与学习笔记一——LED的点亮
工程代码:

#include "STC15F2K60S2.H"

typedef enum 
{
	led_mode1,
	led_mode2,
	led_mode3,
	led_mode4
}led_mode;
led_mode mode=led_mode1;
	/*
	模式1:流水灯从左到右
	模式2:流水灯从右到左
	模式3:流水灯从两边到中间
	模式4:流水灯从中间到两边
	*/

unsigned char ucled;//LED显示变量
unsigned char i=0;//循环变量

void led_proc()
{
	
	switch(mode)
	{
		case led_mode1:
			if(++i>=8)i=0;
			ucled=0x01<<i;
			break;
		case led_mode2:
			if(++i>=8)i=0;
			ucled=0x80>>i;	
		break;
		case led_mode3:
			if(++i>=4)i=0;
			ucled=(0x80>>i)|(0x01<<i);
		break;
		case led_mode4:
			if(++i>=4)i=0;
			ucled=(0x10<<i)|(0x08>>i);
		break;
	}
}

//函数名:定时器1初始化函数
//入口参数:无
//返回值:无
//函数功能:系统频率为 12.000MHz,设置定时时长为 1ms,
					//	选择定时器 1,选择定时器模式为 16 位自动重载( 15 系列),
						//选择定时器时钟为 12T( FOSC/12)
						
void Timer1Init_lhc(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	
	ET1 = 1;		//使能定时器1中断
}


//函数名:LED显示函数
//入口参数:要显示数值的十六进制数据,例如0XAA=1010 1010,L8~L1的顺序
//返回值:无
//函数功能:按照入口参数顺序将LED点亮,1为亮,0为灭

void Led_Disp_lhc(unsigned char ucLed)
{
	
	P0 = ~ucLed;//将输入数据取反,做好数据准备,1为亮,0为灭。
	P2 = P2 & 0x1F | 0x80; // 0x80,选通Y4,也就是LED的锁存器,将数据透传过去
	P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开

}

//函数名:关闭外设的初始化函数
//入口参数:无
//返回值:无
//函数功能:将LED、蜂鸣器和继电器全部关闭

void Cls_Peripheral_lhc(void)
{
//	P0 = 0x00;//将外设全都灭掉的数据准备
//	P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去
//	P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开	
//	
//	P0 = 0xFF;//将LED全都灭掉的数据准备
//	P2 = P2 & 0x1F | 0x80; // 0x80,选通Y4,也就是LED的锁存器,将数据透传过去
//	P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开

	P2 = P2 & 0x1F | 0xA0; // 0x80,选通Y5,也就是外设的锁存器,将数据透传过去	
  P0 = 0x00;//将外设全都灭掉的数据准备
	P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开	
	
	
	P2 = P2 & 0x1F | 0x80; // 0x80,选通Y4,也就是LED的锁存器,将数据透传过去	
	P0 = 0xFF;//将LED全都灭掉的数据准备
	P2 &= 0x1F; //将打开的锁存器关闭,使任何一个锁存器都不打开
	
	
}

//void main
void main()
{
	
	Cls_Peripheral_lhc();//关闭外设的函数,将LED灯和蜂鸣器先关掉,可以按上面说的推一下这个函数关闭蜂鸣器和LED灯的原理

	Timer1Init_lhc();
	
	EA=1;//打开总中断

	while(1);

}
int time_num=0;
void timer1()interrupt 3
{
	if(++time_num>=500)
	{
		led_proc();
		Led_Disp_lhc(ucled);
		time_num=0;
	}
}












物联沃分享整理
物联沃-IOTWORD物联网 » 蓝桥杯LED灯点亮技巧:几种常用流水灯代码解析

发表回复