一、电路图:
二、代码
2.1、基础版
#include<reg51.h>
sbit P3_0 = P3^0; // 检测p3.0这一位
sbit P0_0 = P0^0; // 检测p0.0这一位
sbit P0_1 = P0^1; // 检测p0.1这一位
unsigned int flag = 1; // 通过flag变量实现抢答效果
void main(){
P0_0 = 0; // 给P0.0口赋值为0 也就是低电平 不亮
while(1){
while(flag){ // 在选择完之后在case语句中赋值为0,下次就进不来
switch(P1){
case 0xfe:P2 = 0x01;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0xfd:P2 = 0x02;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0xfb:P2 = 0x03;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0xf7:P2 = 0x04;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0xef:P2 = 0x05;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0xdf:P2 = 0x06;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0xbf:P2 = 0x07;flag = 0;P0_1 = 0;P0_0 = 1; break;
case 0x7f:P2 = 0x08;flag = 0;P0_1 = 0;P0_0 = 1; break;
}
}
if(P3_0 == 0){ // 判断按键按下,又重新开始抢答
flag = 1;
P0_1 = 1; // 绿灯亮
P0_0 = 0; // 红灯灭
}
}
}
2.2、改进版
不用sbit定义P0_1这些,直接给P0口直接赋值。
#include<reg51.h>
sbit P3_0 = P3^0;
unsigned int flag = 1;
void main(){
P0 = 0x02;
while(1){
while(flag){
switch(P1){
case 0xfe:P2 = 0x01;flag = 0;P0 = 0x01; break;
case 0xfd:P2 = 0x02;flag = 0;P0 = 0x01; break;
case 0xfb:P2 = 0x03;flag = 0;P0 = 0x01; break;
case 0xf7:P2 = 0x04;flag = 0;P0 = 0x01; break;
case 0xef:P2 = 0x05;flag = 0;P0 = 0x01; break;
case 0xdf:P2 = 0x06;flag = 0;P0 = 0x01; break;
case 0xbf:P2 = 0x07;flag = 0;P0 = 0x01; break;
case 0x7f:P2 = 0x08;flag = 0;P0 = 0x01; break;
}
}
if(P3_0 == 0){
flag = 1;
P0 = 0x02;
}
}
}