#include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar flag = 1; // 流水灯 uchar a_flag = 0;//是否有人抢答 uchar num=0; sbit buzz=P3^0;//蜂鸣器 sbit k1=P0^0; sbit k2=P0^1; sbit k3=P0^2; sbit k4=P0^3; sbit k5=P0^4; sbit k6=P0^5;//6人抢答 sbit k8=P0^7;//复位键 uchar duan_code[6]={ 0x06,0x5b,0x4f,0x66,0x6d,0x7d};//设置段选 uchar wei_code[6]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};//设置位选 void delay(uint ten_us)//延时函数 { while(ten_us--); } void led_flow() //流水灯函数 { if(flag) // 开启流水灯 { uint i,j; for(j=0;j<6;j++) { for(i=0;i<6;i++) { P1 =duan_code[j]; P2=wei_code[i]; delay(45000); } } } } } 如何根据中断以及以上代码补充一个6人抢答器谁先抢答,数码管停止跑马,6个数码管同时亮谁的编号,其后再有人按键,系统不予响应
时间: 2024-03-13 14:43:56 浏览: 70
首先,需要在代码中设置中断函数,并在其中添加抢答逻辑。可以使用外部中断INT0来实现抢答功能。当有人按下抢答键k6时,触发外部中断INT0,中断函数中记录第一个抢答的人,并关闭流水灯和跑马灯。同时,点亮该人的编号并发出蜂鸣声。接下来,需要设置一个标志位a_flag来判断是否有人抢答成功,以免其他人再次抢答。代码如下:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag = 1; // 流水灯
uchar a_flag = 0;//是否有人抢答
uchar num=0;
sbit buzz=P3^0;//蜂鸣器
sbit k1=P0^0;
sbit k2=P0^1;
sbit k3=P0^2;
sbit k4=P0^3;
sbit k5=P0^4;
sbit k6=P0^5;//6人抢答
sbit k8=P0^7;//复位键
uchar duan_code[6]={ 0x06,0x5b,0x4f,0x66,0x6d,0x7d};//设置段选
uchar wei_code[6]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb};//设置位选
void delay(uint ten_us)//延时函数
{
while(ten_us--);
}
void led_flow() //流水灯函数
{
if(flag) // 开启流水灯
{
uint i,j;
for(j=0;j<6;j++)
{
for(i=0;i<6;i++)
{
P1 =duan_code[j];
P2=wei_code[i];
delay(45000);
}
}
}
}
void int0() interrupt 0 //中断函数
{
if(!a_flag) //如果还没有抢答成功的人
{
a_flag = 1; //将抢答标志位置为1
num = 6; //记录抢答成功的编号
flag = 0; //关闭流水灯
buzz = 0; //发出蜂鸣声
P2 = 0x00; //关闭跑马灯
P1 = duan_code[num - 1]; //点亮抢答成功的编号
}
}
void main()
{
k6 = 1; //设置抢答键k6为输入模式
IT0 = 1; //设置INT0为下降沿触发
EX0 = 1; //使能INT0中断
EA = 1; //开启总中断
while(1)
{
if(!k8) //复位键按下
{
flag = 1; //重新开启流水灯
a_flag = 0; //将抢答标志位置为0
num = 0; //将抢答成功的编号清零
buzz = 1; //关闭蜂鸣器
}
led_flow(); //执行流水灯函数
}
}
```
阅读全文