51单片机 八路抢答器+Proteus仿真

51单片机 八路抢答器+Proteus仿真


  • Proteus仿真
    在这里插入图片描述

实例代码1

直观,任意看懂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <reg52.h>
unsigned char code led[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管断码
//unsigned char code TRY[8]={0xfe,0xfd,0Xfb,0xf7,0xef,0xdf,0xbf,0x7f};
bit flag;
sbit K1=P3^2;
void delay(unsigned int j)
{
unsigned int x;
for(x=0;x<j;x++);
}
void key\_scan()
{
if(flag ==0) return ;
if(P1!=0xff)
{
delay(100);
if(P1!=0xff)
{
flag=0;
switch(P1)
{
case 0xfe: P0=led[1];
break;
case 0xfd: P0=led[2];
break;
case 0Xfb: P0=led[3];
break;
case 0xf7: P0=led[4];
break;
case 0xef: P0=led[5];
break;
case 0xdf: P0=led[6];
break;
case 0xbf: P0=led[7];
break;
case 0x7f: P0=led[8];
break;

}
}
}
}
void main()
{
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
P0=led[0];
flag=1;
while(1)
{
key\_scan();
}
}

void Int0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(K1==0)
{
flag=1;
P0=led[0];
}
}

实例代码2

按位取反操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <reg52.h>
unsigned char code led[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管断码
bit flag;
sbit K1=P3^2;
void delay(unsigned int j)
{
unsigned int x;
for(x=0;x<j;x++);
}
void key\_scan()
{
if(flag ==0) return ;
if(P1!=0xff)
{
delay(100);
if(P1!=0xff)
{
flag=0;
switch(P1)
{//判断按位取反操作
case ~0x01: P0=led[1];
break;
case ~0x02: P0=led[2];
break;
case ~0x04: P0=led[3];
break;
case ~0x08: P0=led[4];
break;
case ~0x10: P0=led[5];
break;
case ~0x20: P0=led[6];
break;
case ~0x40: P0=led[7];
break;
case ~0x80: P0=led[8];
break;

}
}
}
}
void main()
{
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
P0=led[0];
flag=1;
while(1)
{
key\_scan();
}
}

void Int0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(K1==0)
{
flag=1;
P0=led[0];
}
}

程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1t5GIFu6itDl75Oi-6D4zkA 
提取码:d8z2