关于中断,数码管,消抖

针对你的蓝桥杯 51 单片机大模板,我将分三个层次为你深度拆解这些变量的作用、时间的意义以及中断的底层逻辑。


1. 按键三剑客:Key_Val, Key_Down, Key_Old

这三个变量构成了**“状态机按键扫描”**的核心,它们的作用是让单片机能够精准捕捉你“按下”的那一瞬间。

  • Key_Val (当前值)

    • 作用:实时记录按键被扫描到的状态。

    • 比喻:就像照相机的“快门实时画面”,记录这一刻谁按下了。

  • Key_Old (旧值)

    • 作用:存储“上一次”扫描时的按键状态。

    • 比喻:就像相册里的“上一张照片”。

  • Key_Down (下降沿/动作触发)

    • 作用:这是最重要的变量。通过公式 Key_Val & (Key_Val ^ Key_Old) 计算得出。

    • 逻辑拆解

      1. Key_Val ^ Key_Old:找出当前和上次“不一样”的按键(只要状态变了,无论是按下还是松开,这里都会变成 1)。

      2. & Key_Val:进一步筛选,只有“现在是按下状态”且“刚才不是”的情况才成立。

    • 意义:它只在按键**按下的那一秒(那一毫秒)**有效。这防止了你按住按键不动时,程序疯狂执行加号或切换功能。


2. 减速变量:为什么是 10ms、500ms 和 6ms?

在单片机世界里,CPU 跑得极快,而人类的肉眼和手指动作极慢。这些变量是用来**“对齐”**人和机器的速度。

  • Key_Slow_Down == 10 (10ms 扫描一次)

    • 意义消抖(Debounce)

    • 逻辑:机械按键在按下时会有几毫秒的金属弹跳震动。如果 1ms 扫描一次,单片机会以为你按了十几次。每 10ms 扫描一次,刚好跨过了震动期,确保读取的数据是稳定的。

  • Sey_Slow_Down == 500 (500ms 刷新一次逻辑)

    • 意义控制人类观察速度

    • 逻辑:如果你的数码管数值变化(比如时钟秒数)每 1ms 就变一次,你的眼睛根本看不清。500ms(半秒)是常用的逻辑刷新周期,比如让闹钟的小数点半秒闪烁一次,符合人类视觉习惯。

  • Seg_Pos == 6 (每 1ms 换一位,6ms 一个循环)

    • 意义利用视觉暂留(Persistence of Vision)

    • 逻辑:数码管是“动态扫描”的,同一时间其实只有一位在亮。如果你扫描太慢(比如每 100ms 换一位),你会看到数码管在“跳动”;如果你扫描太快(低于 1ms),数码管亮度会不足。每 1ms 换一位,6 位数码管在 6ms 内全部轮流亮一遍,人类肉眼会觉得 6 位数码管是“常亮”的。


3. 中断的底层逻辑:到底发生了什么?

“中断”是单片机最高级、最霸道的机制。依照你的 Timer0Server 模板,我们可以这样理解:

A. 它是“闹钟”而不是“死循环”

main 函数的 while(1) 里,CPU 像个勤劳的工人在跑圈(按键、数码管逻辑、LED)。

但是,while(1) 里面的代码跑一圈的时间是不确定的。如果你在里面写了复杂的计算,时间就会变慢。

B. 强制剥夺权(底层运行步骤):

  1. 计时启动:你设置了 TH0TL0,定时器 0 就像一个自动计数的漏斗。

  2. 溢出触发:当漏斗滴满 1ms 时,硬件会直接向 CPU 发出信号:“时间到了,停下你手里的活!”

  3. 保护现场:CPU 立即保存当前 main 函数运行到哪一行了,把数据存进堆栈。

  4. 执行中断:CPU 跳到 Timer0Server() interrupt 1 这段代码里。

    • 它重新装填漏斗(TH0, TL0)。

    • 它处理最紧急的活:刷新数码管位码(Seg_Disp)。注意:这就是为什么数码管不闪烁的原因,因为无论主程序多卡,刷新数码管永远是每 1ms 准时发生。

    • 它给各个减速计数器加 1(Key_Slow_Down++ 等)。

  5. 恢复现场:执行完中断里的代码,CPU 回到刚才 main 函数被打断的地方继续跑。

C. 为什么你的模板要这么写?

在蓝桥杯比赛中,主程序处理“逻辑”,中断处理“节拍”

  • 中断(心跳):负责最准时、最机械的工作(刷新数码管、计时)。

  • 主程序(大脑):负责思考(按键按下了该怎么办?闹钟时间到了吗?)。

    这种写法保证了:即便你的主程序因为写了复杂的逻辑变得有点卡顿,你的时间显示依然是准的数码管依然是亮的。这就是这个“大模板”能够拿高分的底层精髓。

共阴极晶体管段选的顺序

1. 硬件物理顺序:ABCDEFG-DP

数码管由 8 个 LED 组成,它们在硬件内部的排列是固定的。当你观察一个 8 字数码管时,段的分布如下:

  • a段:最上面那一横。

  • b段:右上角那一竖。

  • c段:右下角那一竖。

  • d段:最下面那一横。

  • e段:左下角那一竖。

  • f段:左上角那一竖。

  • g段:中间那一横。

  • dp段:右下角的小圆点。