注:本文所涉及的图片均来自于B站小蜜蜂老师的视频。
一、题目要求

二、题目分析
1.独立按键:
将J5处的跳帽接到2~3引脚,使按键S4~S7四个按键的另一端接地从而成为4个独立键盘,此时按下独立按键后,按键与地相连,为低电平,即按下按键为低电平,松开按键为高电平。
2.LED:
LED正极接高电平,因此当Q端为低电平时LED亮起,若想要LED亮,则D端需输入低电平
三、重点代码详解
1.定义变量
unsigned char stat_k=0;
定义一个变量,用于记录状态信息
stat_k=1:按下S7(奇数次)
stat_k=2:按下S6(奇数次)
stat_k=0:按下S7(偶数次);按下S6(偶数次)
2.按键S7
if(S7==0)
{
DelayK(100);
if(S7==0)
{
if(stat_k==0)
{
L1=0;
stat_k=1;
}
else if(stat_k==1)
{
L1=1;
stat_k=0;
}
while(S7==0);
}
}
当检测到按键 S7 按下(S7 == 0)时,首先会调用DelayK(100)函数进行一个短暂的延时。
再次确认S7 == 0后,如果stat_k的值为 0,就会将L1设置为0,并将stat_k的值更新为 1;
如果stat_k的值为 1,就会将L1设置为 1,并将stat_k重置为 0。
然后通过while(S7 == 0);语句等待按键 S7 松开。
这里stat_k起到了一个标记按键 S7 按下次数奇偶性的作用,每次按下并处理后改变其值,以便下次按下时执行不同的操作(比如控制L1的亮灭状态交替变化)。
3.按键S6
if(S6==0)
{
DelayK(100);
if(S6==0)
{
if(stat_k==0)
{
L2=0;
stat_k=2;
}
else if(stat_k==2)
{
L2=1;
stat_k=0;
}
while(S6==0);
}
}
对于按键 S6 的处理逻辑与 S7 类似。
当检测到 S6 按下并经过延时确认后,如果stat_k为 0,就将L2设置为 0 并将stat_k更新为 2;
如果stat_k为 2,就将L2设置为 1 并将stat_k重置为 0。
同样通过while(S6 == 0);等待按键松开。
这里stat_k同样是用于根据其当前值来决定对L2的操作以及自身状态的更新,以实现某种特定的按键控制逻辑(比如与 S7 不同的另一种亮灭交替控制逻辑,且与不同的stat_k值对应)。
4.按键S5
if(S5==0)
{
DelayK(100);
if(S5==0)
{
if(stat_k==1)
{
L3=0;
while(S5==0);
L3=1;
}
else if(stat_k==2)
{
L5=0;
while(S5==0);
L5=1;
}
}
}
当检测到按键 S5 按下并经过延时确认后,如果stat_k的值为 1,就会将L3设置为 0,然后等待按键 S5 松开(while(S5 == 0);),松开后再将L3设置为 1;
如果stat_k的值为 2,就会将L5设置为 0,同样等待按键松开后再将L5设置为 1。
这里stat_k的值用于区分不同的情况,决定是对L3还是L5进行操作,以实现根据按键 S5 按下时stat_k的不同状态来控制不同的输出(L3或L5的亮灭等情况)。
5.按键S4
if(S4==0)
{
DelayK(100);
if(S4==0)
{
if(stat_k==1)
{
L4=0;
while(S5==0);
L4=1;
}
else if(stat_k==2)
{
L6=0;
while(S5==0);
L6=1;
}
}
}
与按键 S5 类似,当检测到按键 S4 按下并经过延时确认后,如果stat_k的值为 1,就会将L4设置为 0,等待按键松开后再将L4设置为 1;
如果stat_k的值为 2,就会将L6设置为 0,等待按键松开后再将L6设置为 1。
这里stat_k也是用于根据其当前值来决定是对L4还是L6进行操作,以实现不同状态下按键 S4 按下时对不同输出(L4或L6的亮灭等情况)的控制。
四、总体代码
#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 SelectHC573(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 DelayK(unsigned char t)
{
while(t--);
}
unsigned char stat_k=0;
void ScanKeys_Alone()
{
if(S7==0)
{
DelayK(100);
if(S7==0)
{
if(stat_k==0)
{
L1=0;
stat_k=1;
}
else if(stat_k==1)
{
L1=1;
stat_k=0;
}
while(S7==0);
}
}
if(S6==0)
{
DelayK(100);
if(S6==0)
{
if(stat_k==0)
{
L2=0;
stat_k=2;
}
else if(stat_k==2)
{
L2=1;
stat_k=0;
}
while(S6==0);
}
}
if(S5==0)
{
DelayK(100);
if(S5==0)
{
if(stat_k==1)
{
L3=0;
while(S5==0);
L3=1;
}
else if(stat_k==2)
{
L5=0;
while(S5==0);
L5=1;
}
}
}
if(S4==0)
{
DelayK(100);
if(S4==0)
{
if(stat_k==1)
{
L4=0;
while(S5==0);
L4=1;
}
else if(stat_k==2)
{
L6=0;
while(S5==0);
L6=1;
}
}
}
}
void main()
{
SelectHC573(4);
while(1)
{
ScanKeys_Alone();
}
}
966






