提示:
按键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的 I/O 端口
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 L7=P0^6;
sbit L8=P0^7;
//通过译码器来实现相应功能的通道的选择
void SelectHC138(unsigned char n)
{
switch(n)
{
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(unsigned int t)
{
while(t--);
}
//功能的实现
unsigned char stat = 0; //扩展功能的选择,初始状态
void Scanf_KeyAlone()
{
if(S7==0)
{
Delay(100);
if(S7==0)
{
if(stat==0)
{
L1=0;
stat=1; //点亮后变成另一种状态
}
else if(stat==1)
{
L1=1;
stat=0;
}
while(S7==0);
}
}
if(S6==0)
{
Delay(100);
if(S6==0)
{
if(stat==0)
{
L2=0;
stat=2; //再次变成另外一种状态
}
else if(stat==2)
{
L2=1;
stat=0;
}
while(S6==0);
}
}
if(S5==0)
{
Delay(100);
if(S5==0)
{
if(stat==1) //选择
{
L3=0;
while(S5==0);
L3=1;
}
else if(stat==2)
{
L5=0;
while(S5==0);
L5=1;
}
}
}
if(S4==0)
{
Delay(100);
if(S4==0)
{
if(stat==1)
{
L4=0;
while(S4==0);
L4=1;
}
else if(stat==2)
{
L6=0;
while(S4==0);
L6=1;
}
}
}
}
//固定函数
void main()
{
SelectHC138(4);
while(1)
{
Scanf_KeyAlone();
}
}
stat
的作用分析
1. stat
的值及其含义
-
stat == 0
:初始状态或默认状态。 -
stat == 1
:表示某种特定的状态(例如,按下S7
后进入的状态)。 -
stat == 2
:表示另一种特定的状态(例如,按下S6
后进入的状态)。
2. stat
的控制逻辑
-
按下
S7
时:-
如果
stat == 0
,则将L1
置低(L1 = 0
),并将stat
设置为1
。 -
如果
stat == 1
,则将L1
置高(L1 = 1
),并将stat
重置为0
。 -
这里
stat
的作用是切换L1
的状态(开或关)。
-
-
按下
S6
时:-
如果
stat == 0
,则将L2
置低(L2 = 0
),并将stat
设置为2
。 -
如果
stat == 2
,则将L2
置高(L2 = 1
),并将stat
重置为0
。 -
这里
stat
的作用是切换L2
的状态(开或关)。
-
-
按下
S5
时:-
如果
stat == 1
,则将L3
置低(L3 = 0
),等待按键释放后,再将L3
置高(L3 = 1
)。 -
如果
stat == 2
,则将L5
置低(L5 = 0
),等待按键释放后,再将L5
置高(L5 = 1
)。 -
这里
stat
的作用是根据当前状态决定控制哪个 LED(L3
或L5
)。
-
-
按下
S4
时:-
如果
stat == 1
,则将L4
置低(L4 = 0
),等待按键释放后,再将L4
置高(L4 = 1
)。 -
如果
stat == 2
,则将L6
置低(L6 = 0
),等待按键释放后,再将L6
置高(L6 = 1
)。 -
这里
stat
的作用是根据当前状态决定控制哪个 LED(L4
或L6
)。
-
stat
的工作流程
-
初始状态:
-
stat = 0
,表示系统处于默认状态。
-
-
按下
S7
:-
如果
stat == 0
,进入状态1
,并点亮L1
。 -
如果
stat == 1
,退出状态1
,并熄灭L1
。
-
-
按下
S6
:-
如果
stat == 0
,进入状态2
,并点亮L2
。 -
如果
stat == 2
,退出状态2
,并熄灭L2
。
-
-
按下
S5
或S4
:-
根据当前状态(
stat == 1
或stat == 2
),控制不同的 LED(L3
/L5
或L4
/L6
)。
-
stat
的作用总结
-
stat
是一个状态标志,用于记录当前系统的运行状态。 -
它决定了按下不同按键时,程序的行为和 LED 的控制逻辑。
-
通过
stat
,程序可以根据不同的状态执行不同的操作,实现状态机的功能。
总代码: