我需要你扮演一位高级程序设计师来一款基于at89c51单片机设计5个按键实现对8个LED的控制在按下一个开关时能够中断上一个行为并利用数码管显示按下的按键号5个按键对应的功能为:1号键:此键按下对应所有的灯都熄灭;2号键:此键按下LED1----LED8流动点亮;3号键:此键按下LED1----LED8依次点亮;4号键:此键按下LED1、LED3、LED5、LED7和LED2、LED4、LED6、
好的,以下是基于at89c51单片机的代码,实现了5个按键对8个LED的控制,并能够中断上一个行为,利用数码管显示按下的按键号:
#include <reg51.h>
#define LED P0
#define KEY P1
#define DIG P2
unsigned char key_index; // 按键编号
unsigned char led_index; // LED编号
unsigned char dig_index; // 数码管编号
void delay(unsigned int n) // 延时函数
{
unsigned int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 120; j++);
}
void key_scan() // 按键扫描函数
{
unsigned char key_value = KEY & 0x1F; // 获取按键值
if (key_value != 0x1F) // 判断是否有按键按下
{
switch (key_value) // 判断按下的是哪个按键
{
case 0x1E: // 1号键
key_index = 1;
break;
case 0x1D: // 2号键
key_index = 2;
break;
case 0x1B: // 3号键
key_index = 3;
break;
case 0x17: // 4号键
key_index = 4;
break;
case 0x0F: // 5号键
key_index = 5;
break;
}
}
}
void dig_display(unsigned char dig_value) // 数码管显示函数
{
DIG = ~(1 << dig_value); // 显示对应的数码管
}
void led_light(unsigned char led_value) // LED点亮函数
{
LED = led_value; // 点亮对应的LED
}
void all_led_off() // 所有LED熄灭函数
{
LED = 0xFF; // 熄灭所有LED
}
void led_flow() // LED流动函数
{
for (led_index = 0; led_index < 8; led_index++)
{
led_light(1 << led_index); // 依次点亮LED
delay(100); // 延时一段时间
}
}
void led_order() // LED依次点亮函数
{
for (led_index = 0; led_index < 8; led_index++)
{
led_light(1 << led_index); // 依次点亮LED
delay(100); // 延时一段时间
led_light(0); // 熄灭所有LED
}
}
void led_alternate() // LED轮流点亮函数
{
for (led_index = 0; led_index < 4; led_index++)
{
led_light((1 << led_index) | (1 << (led_index + 4))); // 轮流点亮LED
delay(100); // 延时一段时间
}
}
void led_flash() // LED闪烁函数
{
led_light(0xFF); // 全部点亮
delay(100); // 延时一段时间
led_light(0); // 全部熄灭
delay(100); // 延时一段时间
}
void main()
{
all_led_off(); // 所有LED熄灭
while (1)
{
key_scan(); // 按键扫描
if (key_index != 0) // 判断是否有按键按下
{
dig_display(key_index - 1); // 显示按键编号
switch (key_index) // 判断按下的是哪个按键
{
case 1: // 1号键
all_led_off(); // 熄灭所有LED
break;
case 2: // 2号键
while (key_index == 2) // 判断是否有新的按键按下
led_flow(); // LED流动
break;
case 3: // 3号键
while (key_index == 3) // 判断是否有新的按键按下
led_order(); // LED依次点亮
break;
case 4: // 4号键
while (key_index == 4) // 判断是否有新的按键按下
led_alternate(); // LED轮流点亮
break;
case 5: // 5号键
while (key_index == 5) // 判断是否有新的按键按下
led_flash(); // LED闪烁
break;
}
key_index = 0; // 清空按键编号
dig_display(0xFF); // 关闭数码管显示
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/hwl5 著作权归作者所有。请勿转载和采集!