51单片机独立按键的扩展应用

提示:

按键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 的工作流程

  1. 初始状态:

    • stat = 0,表示系统处于默认状态。
  2. 按下 S7:

    • 如果 stat == 0,进入状态 1,并点亮 L1。

    • 如果 stat == 1,退出状态 1,并熄灭 L1。

  3. 按下 S6:

    • 如果 stat == 0,进入状态 2,并点亮 L2。

    • 如果 stat == 2,退出状态 2,并熄灭 L2。

  4. 按下 S5 或 S4:

    • 根据当前状态(stat == 1 或 stat == 2),控制不同的 LED(L3/L5 或 L4/L6)。

stat 的作用总结

  • stat 是一个状态标志,用于记录当前系统的运行状态。

  • 它决定了按下不同按键时,程序的行为和 LED 的控制逻辑。

  • 通过 stat,程序可以根据不同的状态执行不同的操作,实现状态机的功能。

总代码:

相关推荐
szxinmai主板定制专家6 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB20269 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)10 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~11 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计12 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界12 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB202613 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥14 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源
服务器硬件项目经理14 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
一次调频AGCAVC15 小时前
一次调频系统控制柜的组成及一次调频装置主机功能详述
人工智能·嵌入式硬件