第17期74H595级联驱动2~8位数码管, while(1) { SEG_Disp(2,1); //数码管左边第1位显示数字2 delayms(1); //延时1毫秒 SEG_Disp(0,2); //数码管左边第2位显示数字0 delayms(1); //延时1毫秒 SEG_Disp(2,3); //数码管左边第3位显示数字2 delayms(1); //延时1毫秒
SEG_Disp(3,4); //数码管左边第4位显示数字3 delayms(1); //延时1毫秒
SEG_Disp(0,5); //数码管左边第5位显示数字0 delayms(1);
第18期 独立按键使用 :需要进行程序消抖
if(KEY1 == 0) //判断按键KEY1是否按下 { delayms(10); //延时消抖 if(KEY1 == 0) //再次判断KEY1是否按下 { LED1 = 0; //共阳极LED电路,低电平点亮,点亮LED1 }
第19期 多功能按键,单击、双击、长按 按键使用 一、按键识别的基本原理按键识别主要依赖以下几个核心概念: - 消抖:机械按键在按下和释放时会产生抖动(通常持续5~20ms),需要通过软件延时或定时器采样来消除。
- 状态检测:检测按键的按下(高→低)和释放(低→高)边沿。
- 计时:通过定时器记录按键按下的持续时间,区分短按(单击/双击)和长按。
- 状态机:用有限状态机管理按键的不同阶段,逻辑清晰且易于扩展。
二、状态机设计我们设计一个包含以下状态的按键状态机: 状态 含义 说明
KEY_IDLE 空闲状态 等待按键按下
KEY_PRESS 按下消抖中 检测到按下,开始消抖计时
KEY_SHORT_WAIT 短按等待 按键已释放,等待是否出现第二次按下(双击)
KEY_LONG 长按确认 按键持续按下超过长按阈值
KEY_DOUBLE_WAIT 双击消抖中 检测到第二次按下,消抖确认 四、关键设计要点说明4.1 时间参数的选择参数 推荐值 说明
消抖时间 10~20ms 机械按键抖动通常在此范围内
长按阈值 500~1000ms 根据用户体验调整,太短易误触,太长不灵敏
双击间隔 200~400ms 两次按键之间的最大间隔时间 IDLE │ ├── 检测到按下 ──→ PRESS_DEBOUNCE(消抖10ms) │ │ │ ├── 消抖完成 ──→ PRESS_CONFIRM │ │ │ │ │ ├── 持续按下≥1s ──→ LONG_PRESS(触发长按事件) │ │ │ │ │ │ │ └── 释放 ──→ IDLE │ │ │ │ │ └── 释放 ──→ SHORT_WAIT(等待300ms) │ │ │ │ │ ├── 再次按下 ──→ DOUBLE_CLICK(触发双击事件)→ IDLE │ │ │ │ │ └── 超时 ──→ SINGLE_CLICK(触发单击事件)→ IDLE │ │ │ └── 消抖中释放 ──→ IDLE(视为干扰) │ └── 未检测到按下 ──→ 保持IDLE 注意事项定时器时基:建议使用硬件定时器产生1ms或5ms的固定时基,不要在主循环中用 delay() 软件延时,否则会影响其他任务的实时性。 消抖策略:上述代码使用了延时消抖(连续采样10ms都稳定才确认),这是最可靠的方式。也可以使用连续多次采样一致的方法(如连续采样3次都相同)。 事件处理:按键事件通过全局变量传递,处理完必须清除,防止重复触发。建议在中断中只设置标志,在主循环中处理具体逻辑。 长按重复触发:上述代码中长按只触发一次。如果需要长按连续触发(如音量连续调节),可以在 KEY_STATE_LONG_PRESS 状态中增加周期性的重复事件触发。 抗干扰:对于强干扰环境,建议增加硬件滤波(RC低通滤波)和软件多次采样
第20期 多功能按键 此视频主要通过行列扫描的方法进行应,对键盘的按键进行识别用了switch语句case语句switch case 是一种多分支选择结构,它根据一个整型表达式的值,从多个代码块中选择一个执行。相比于使用多个 if...else if 语句,switch case 在代码可读性和执行效率上通常更优,尤其是在判断条件较多且基于同一个变量时。 1. 基本语法结构switch (表达式) { case 常量表达式1: // 当 表达式 == 常量表达式1 时执行的代码 break; // 跳出 switch 结构,可选但通常需要 case 常量表达式2: // 当 表达式 == 常量表达式2 时执行的代码 break; // 跳出 switch 结构 // ... 可以有任意多个 case ... default: // 当 表达式 的值与所有 case 都不匹配时执行的代码 // 可选,但建议加上以处理意外情况 break;}📋关键点: - 表达式:必须是一个整型(int、char、short、long、enum 枚举类型等)或能隐式转换为整型的表达式。不能是浮点数或字符串。
- 常量表达式:case 后面的值必须是编译时可确定的常量,不能是变量。例如 case 1:、case 'A':、case (2+3): 都是合法的。
- break 语句:用于跳出 switch 结构,防止“穿透”(fall-through)。如果省略 break,程序会继续执行下一个 case 的代码,直到遇到 break 或 switch 结束。
- default 子句:处理所有未匹配的情况,是可选的。通常放在最后,但也可以放在任何位置。
2. 在STC单片机中的典型应用场景在STC单片机开发中,switch case 常用于: - 解析串口命令:根据接收到的命令字节,执行不同操作。
- 状态机实现:根据当前状态,执行对应的处理逻辑并跳转到下一个状态。
- 按键扫描与处理:根据按键值,执行不同功能。
- 菜单选择:根据用户输入的选项,进入不同子菜单。
|