写一篇在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只 按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和 K2都夫按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示的程序
时间: 2023-12-18 22:03:00 浏览: 154
以下是基于51单片机的代码实现:
```c
#include <reg51.h>
#define LED_PORT P1
#define KEY1 P3_2
#define KEY2 P3_3
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
unsigned char code LED_ON[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; // 低电平点亮LED
unsigned char code LED_OFF[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 高电平熄灭LED
unsigned char flag = 0; // 标志位
unsigned char cnt = 0; // 计数器
void delay(unsigned int xms) // 延时函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void key1_ISR() interrupt 0 // K1中断处理函数
{
delay(10); // 延时去抖动
if(KEY1 == 0) // 按键按下
{
flag = 1; // 设置标志位
while(!KEY1); // 等待按键释放
}
}
void key2_ISR() interrupt 2 // K2中断处理函数
{
delay(10); // 延时去抖动
if(KEY2 == 0) // 按键按下
{
flag = 2; // 设置标志位
while(!KEY2); // 等待按键释放
}
}
void main()
{
EA = 1; // 允许总中断
EX0 = 1; // 允许外部中断0
IT0 = 1; // 边沿触发
EX1 = 1; // 允许外部中断1
IT1 = 1; // 边沿触发
while(1)
{
switch(flag)
{
case 0: // 流水灯显示
for(int i=0;i<8;i++)
{
LED_PORT = LED_ON[i];
delay(100);
LED_PORT = LED_OFF[i];
}
break;
case 1: // 交替闪烁10次
for(int j=0;j<10;j++)
{
for(int i=0;i<4;i++)
{
LED_PORT = LED_ON[2*i];
delay(100);
LED_PORT = LED_OFF[2*i];
LED_PORT = LED_ON[2*i+1];
delay(100);
LED_PORT = LED_OFF[2*i+1];
}
}
flag = 0; // 恢复标志位
break;
case 2: // 全部闪烁10次
for(int j=0;j<10;j++)
{
LED_PORT = 0x00;
delay(100);
LED_PORT = 0xFF;
delay(100);
}
flag = 0; // 恢复标志位
break;
}
}
}
```
在上述代码中,中断0和中断1的处理函数分别为`key1_ISR()`和`key2_ISR()`,在其中通过设置标志位来判断程序的执行流程。当标志位为0时,执行流水灯显示;当标志位为1时,执行上下各4只LED交替闪烁10次;当标志位为2时,执行全部8只LED闪烁10次。其中,通过`delay()`函数实现延时功能,避免因程序执行过快造成闪烁效果不明显。
阅读全文