题目:按键S7和S6为选择键,确定控制键控制哪组LED指示灯。按键S5和S4为控制键,按下该键点亮指定的LED指示灯,送开后熄灭。
按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3,S4控制L4,再次按下S7,L1指示灯熄灭,S6可响应操作。
按下S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制L6,再次按下S6,L2指示灯熄灭,S7可响应操作。
S7和S6未按下时,即L1或L2未点亮时,S5和S4不响应操作,也就是未作LED灯区域选择时,控制键不能操作。
原理图
代码
#include "reg52.h"
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
//定义延时函数来去抖动
unsigned char state=0;//标志S7或S6是否按下
void guan()
{
HC138_A=1;
HC138_B=0;
HC138_C=1;
P0=0x00;
HC138_A=0;
HC138_B=0;
HC138_C=1;
P0=0xff;
}
void delay(unsigned int t)
{
while(t--);
}
//打开控制led的Y4C
void led()
{
HC138_A=0;
HC138_B=0;
HC138_C=1;
}
//先消抖后进行操作
void key_alone()
{
if(S7==0)
{
delay(100);
if(S7==0)//还是低电平说明真的按下去了,让灯亮
{
if(state==0)
{
L1=0;
state=1;//标志S7按下了
}
else if(state==1)
{
L1=1;
state=0;
}
while(S7==0);
}
}
if(S6==0)
{
delay(100);
if(S6==0)//还是低电平说明真的按下去了,让灯亮
{
if(state==0)
{
L2=0;
state=2;//标志S6按下了
}
else if(state==2)
{
L2=1;
state=0;
}
while(S6==0);
}
}
if(S5==0)
{
delay(100);
if(S5==0)//还是低电平说明真的按下去了,让灯亮
{
if(state==1)
{
L3=0;
while(S5==0);
L3=1;
}
else if(state==2)
{
L5=0;
while(S5==0);
L5=1;
}
}
}
if(S4==0)
{
delay(100);
if(S4==0)//还是低电平说明真的按下去了,让灯亮
{
if(state==1)
{
L4=0;
while(S4==0);
L4=1;
}
else if(state==2)
{
L6=0;
while(S4==0);
L6=1;
}
}
}
}
void main()
{
guan();
led();
while(1)
{
key_alone();
}
}