51单片机程序,做单灯的左移右移,按P1.0——P1.7再从P1.7——P1.0的循环,在以上基础上设置一个中断按键使得中断时只有一灯亮
时间: 2023-10-28 11:04:29 浏览: 106
好的,根据您的要求,我来为您提供一个基于 51 单片机的程序,可以实现单灯的左移右移,按下 P1.0 - P1.7 按钮可以循环显示,同时可以设置一个中断按键,在中断触发时只有一个灯亮。以下是代码:
```
#include <reg51.h>
// 定义 LED 灯的端口
sbit LED = P2;
// 定义按键的端口
sbit KEY = P3;
// 定义变量保存灯的状态和位置
unsigned char light = 0x01;
unsigned char position = 0;
// 定义中断处理函数
void interrupt_func() interrupt 0
{
// 关闭中断
EA = 0;
// 判断当前灯的位置
if (position == 7)
{
light = 0x80;
position = 0;
}
else
{
light = light << 1;
position++;
}
// 更新 LED 灯的状态
LED = light;
// 清除中断标志位
IE0 = 0;
// 开启中断
EA = 1;
}
void main()
{
// 初始化 LED 灯
LED = light;
// 设置中断按键
KEY = 1;
EX0 = 1;
IT0 = 1;
// 主循环
while (1)
{
// 检测按键是否按下
if (KEY == 0)
{
// 延时一段时间,防止抖动
delay(10);
// 再次检测按键是否按下
if (KEY == 0)
{
// 等待按键释放
while (KEY == 0);
// 切换灯的方向
light = 0x01;
position = 0;
}
}
// 左移或右移灯
if (position == 7)
{
light = 0x01;
position = 0;
}
else
{
light = light << 1;
position++;
}
// 更新 LED 灯的状态
LED = light;
// 延时一段时间,让灯移动的速度变慢
delay(100);
}
}
// 延时函数,用于等待一段时间
void delay(unsigned int time)
{
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 125; j++);
}
```
这段代码实现了单灯的左移右移功能,并且可以通过按下 P1.0 - P1.7 按钮循环显示。在程序中,我们通过设置一个中断按键来实现中断触发时只有一个灯亮。当中断按键被按下时,中断服务程序将会修改灯的状态和位置信息,并且只有一个灯亮。
阅读全文