蓝桥杯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;
}
}