题目:
按键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;
//选择锁存器
void Select_HC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
}
}
//独立按键延时函数
void Delay_Key(unsigned char t)
{
while(t--);
}
unsigned char stat_k=0; //状态变量,s6 s7都未按下
void ScanKeys_Alone()
{
if(s7==0)
{
Delay_Key(100); //按键消抖
if(s7==0) //s7按下
{
if(stat_k==0) //s6未按下
{
L1=0; //灯亮
stat_k=1;
}
else if(stat_k==1) //s7处于按下状态
{
L1=1; //灯灭
stat_k=0;
}
while(s7==0); //让按键松开后再读
}
}
if(s6==0)
{
Delay_Key(100); //按键消抖
if(s6==0) //s6按下
{
if(stat_k==0) //s7未按下
{
L2=0; //灯亮
stat_k=2;
}
else if(stat_k==2) //s6处于按下状态
{
L2=1; //灯灭
stat_k=0;
}
while(s6==0); //让按键松开后再读
}
}
if(s5==0)
{
Delay_Key(100); //按键消抖
if(s5==0) //s5按下
{
if(stat_k==1)
{
L3=0;
while(s5==0); //s5为低电平,L3一直亮;为高电平,L3灭
L3=1; //灯灭
}
else if(stat_k==2)
{
L5=0;
while(s5==0); //s5为低电平,L5一直亮;为高电平,L5灭
L5=1;
}
}
}
if(s4==0)
{
Delay_Key(100); //按键消抖
if(s4==0) //s4按下
{
if(stat_k==1)
{
L4=0;
while(s4==0); //s4为低电平,L4一直亮;为高电平,L4灭
L4=1;
}
else if(stat_k==2)
{
L6=0;
while(s4==0); //s4为低电平,L6一直亮;为高电平,L6灭
L6=1;
}
}
}
}
void main()
{
Select_HC573(4);
while(1)
{
ScanKeys_Alone();
}
}