单片机作业独立按键控制4个灯的亮灭,两种方式一个扫描方式,一个中断方式
时间: 2023-06-25 07:07:55 浏览: 158
以下是基于51单片机的代码,分别实现了按键控制4个LED的亮灭的扫描方式和中断方式。
## 扫描方式
```c
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
void delay(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<125;j++);
}
}
void main()
{
unsigned char key_state = 0; // 按键状态,0表示未按下,1表示按下
unsigned char led_state = 0; // LED状态,0表示灭,1表示亮
while(1)
{
// 扫描按键状态
if(KEY1 == 0) // 判断KEY1是否按下
{
delay(10); // 延时去抖动
if(KEY1 == 0) // 再次判断KEY1是否按下
{
key_state = 1; // 设置按键状态为按下
}
}
else if(KEY2 == 0) // 判断KEY2是否按下
{
delay(10); // 延时去抖动
if(KEY2 == 0) // 再次判断KEY2是否按下
{
key_state = 0; // 设置按键状态为未按下
}
}
// 控制LED状态
if(key_state == 1) // 如果按键已经按下
{
if(led_state == 0) // 如果LED灯是灭的
{
LED1 = 1; // 点亮LED1
LED2 = 1; // 点亮LED2
LED3 = 1; // 点亮LED3
LED4 = 1; // 点亮LED4
led_state = 1; // 设置LED状态为亮
}
else // 如果LED灯是亮的
{
LED1 = 0; // 熄灭LED1
LED2 = 0; // 熄灭LED2
LED3 = 0; // 熄灭LED3
LED4 = 0; // 熄灭LED4
led_state = 0; // 设置LED状态为灭
}
while(KEY1 == 0 || KEY2 == 0); // 等待按键释放
}
}
}
```
## 中断方式
```c
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
void delay(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<125;j++);
}
}
void key_interrupt() interrupt 0 // 定义中断函数
{
static unsigned char key_state = 0; // 按键状态,0表示未按下,1表示按下
static unsigned char led_state = 0; // LED状态,0表示灭,1表示亮
if(KEY1 == 0) // 判断KEY1是否按下
{
delay(10); // 延时去抖动
if(KEY1 == 0) // 再次判断KEY1是否按下
{
key_state = 1; // 设置按键状态为按下
}
}
else if(KEY2 == 0) // 判断KEY2是否按下
{
delay(10); // 延时去抖动
if(KEY2 == 0) // 再次判断KEY2是否按下
{
key_state = 0; // 设置按键状态为未按下
}
}
// 控制LED状态
if(key_state == 1) // 如果按键已经按下
{
if(led_state == 0) // 如果LED灯是灭的
{
LED1 = 1; // 点亮LED1
LED2 = 1; // 点亮LED2
LED3 = 1; // 点亮LED3
LED4 = 1; // 点亮LED4
led_state = 1; // 设置LED状态为亮
}
else // 如果LED灯是亮的
{
LED1 = 0; // 熄灭LED1
LED2 = 0; // 熄灭LED2
LED3 = 0; // 熄灭LED3
LED4 = 0; // 熄灭LED4
led_state = 0; // 设置LED状态为灭
}
}
}
void main()
{
EA = 1; // 允许中断
EX0 = 1; // 允许外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
while(1)
{
// 主函数中不需要执行任何代码
}
}
```