51单片机按键控制LED灯流动效果代码示例
51单片机按键控制LED灯流动效果代码示例
本示例演示如何使用51单片机读取4个按键的状态,并根据按键控制8个LED灯实现不同的流动效果,包括流水灯、闪烁等。
**代码:**c#include<reg51.h>#include<intrins.h>
sbit S1 = P1^0;sbit S2 = P1^1;sbit S3 = P1^2;sbit S4 = P1^3;unsigned char keyval;
void key_scan();void forward();void backward();void Alter();void blink();void led_delay();void delay10ms();
void main(void) { keyval = 0; while(1) { key_scan(); switch(keyval) { case 1: forward(); break; case 2: backward(); break; case 3: Alter(); break; case 4: blink(); break; } }}
// 按键扫描函数void key_scan() { P1 = 0xff; if((P1 & 0x0f) != 0x0f) { delay10ms(); // 延时消抖 if(S1 == 0) keyval = 1; else if(S2 == 0) keyval = 2; else if(S3 == 0) keyval = 3; else if(S4 == 0) keyval = 4; }}
// LED前进流动效果void forward() { P3 = 0xfe; led_delay(); P3 = 0xfd; led_delay(); P3 = 0xfb; led_delay(); P3 = 0xf7; led_delay(); P3 = 0xef; led_delay(); P3 = 0xdf; led_delay(); P3 = 0xbf; led_delay(); P3 = 0x7f; led_delay();}
// LED后退流动效果void backward() { P3 = 0x7f; led_delay(); P3 = 0xbf; led_delay(); P3 = 0xdf; led_delay(); P3 = 0xef; led_delay(); P3 = 0xf7; led_delay(); P3 = 0xfb; led_delay(); P3 = 0xfd; led_delay(); P3 = 0xfe; led_delay();}
// LED交替闪烁效果void Alter() { P3 = 0x0f; led_delay(); P3 = 0xf0; led_delay();}
// LED闪烁效果void blink() { P3 = 0xff; led_delay(); P3 = 0x00; led_delay();}
// LED延时函数void led_delay() { unsigned char i, j; for(i = 0; i < 220; i++) for(j = 0; j < 220; j++);}
// 10ms延时函数void delay10ms() { unsigned char i, j; for(i = 0; i < 100; i++) for(j = 0; j < 100; j++);}
说明:
- 程序使用了reg51.h和intrins.h头文件,分别用于定义51单片机寄存器和内部函数。* 定义了四个按键S1、S2、S3、S4,分别连接到P1口的四个引脚。* 定义了一个变量keyval用于存储按键值。* 在主函数中,首先初始化keyval为0,然后进入无限循环。* 在循环中,首先调用key_scan()函数扫描按键状态,然后根据keyval的值调用不同的函数实现不同的LED流动效果。* forward()函数实现LED前进流动效果,backward()函数实现LED后退流动效果,Alter()函数实现LED交替闪烁效果,blink()函数实现LED闪烁效果。* led_delay()函数和delay10ms()函数分别为LED延时函数和10ms延时函数。
注意:
- 程序中使用的延时函数仅供参考,实际延时时间可能会有所不同,需要根据实际情况进行调整。* 程序中使用的IO口定义可能需要根据实际硬件电路进行修改。
希望这篇博客能够帮助您理解如何使用51单片机实现按键控制LED灯流动效果。如果您有任何问题,请随时在下方留言。
原文地址: https://www.cveoy.top/t/topic/XOf 著作权归作者所有。请勿转载和采集!