一、原理图分析
最开始,用跳线帽将J5的2-3引脚连接起来,使得按键S4~S7的一端与地相连,形成4个独立按键。当按下S4~S7时,P30~P33为低电平0。在扫描独立按键的状态时,先做去抖动处理,确认为按键按下触发的信号才可以进行功能处理。
二、程序编写
1、实现功能:按下按键S7,L1灯亮,S6点亮L2灯,S5点亮L3灯,S4点亮L4灯, 松开后熄灭,按键均做去抖动处理。
#include<reg51.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 delay(unsigned char t)//延时函数,为抖动做处理
{
while(t--);
}
void dlaj()
{
if(S7==0)
{
delay(100);//抖动处理
if(S7==0)//一段时间后S7仍为低电平,则确认为按键操作
{
L1=0;//令L1灯亮
while(S7==0);
L1=1; //熄灭L1灯
}
}
if(S6==0)
{
delay(100);
if(S6==0)
{
L2=0;
while(S6==0);
L2=1;
}
}
if(S5==0)
{
delay(100);
if(S5==0)
{
L3=0;
while(S5==0);
L3=1;
}
}
if(S4==0)
{
delay(100);
if(S4==0)
{
L4=0;
while(S4==0);
L4=1;
}
}
}
void main()
{
P2=0x80;//选通Y4C,对LED进行操作
while(1)
{
dlaj();
}
}
2、实现功能:
选择键S6、S7未按下时,控制键S3~S6不能操作,示意图如下:
参考代码:
#include<reg51.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 delay(unsigned char t)//延时函数,为抖动做处理
{
while(t--);
}
unsigned char flag=0;//设定状态标志位,flag=0时,按键S6,S7均没有按下,为最初的状态
void dlaj()
{
if(S7==0)
{
delay(100);//抖动处理
if(S7==0)//一段时间后S7仍为低电平,则确认为按键操作
{
if(flag==0)
{
L1=0;//令L1灯亮
flag=1;//按下S7后使L1灯亮,后令flag=1
}
else if(flag==1)
{
L1=1; //熄灭L1灯
flag=0;
}
while(S7==0);
}
}
if(S6==0)
{
delay(100);//抖动处理
if(S6==0)//一段时间后S6仍为低电平,则确认为按键操作
{
if(flag==0)
{
L2=0;//令L1灯亮
flag=2;
}
else if(flag==2)
{
L2=1; //熄灭L1灯
flag=0;
}
while(S6==0);
}
}
if(S5==0)
{
delay(100);
if(S5==0)
{
if(flag==1)
{
L3=0;
while(S5==0);
L3=1;
}
else if(flag==2)
{
L5=0;
while(S5==0);
L5=1;
}
}
}
if(S4==0)
{
delay(100);
if(S4==0)
{
if(flag==1)
{
L4=0;
while(S4==0);
L4=1;
}
else if(flag==2)
{
L6=0;
while(S4==0);
L6=1;
}
}
}
}
void main()
{
P2=0x80;//选通Y4C,对LED进行操作
while(1)
{
dlaj();
}
}