51单片机 stc-B板学习——关于数码管和流水灯显示实现原理

先来看看数码管和发光二极管硬件原理图

这个项目要实现两个功能:使LED亮且不和数码管同时亮。

从这个原理图出发,要想实现这两个功能,我们可以得出以下分析:

  • 要让LED灯亮,首先需要将P0的8个引脚以及P2.3设置成推挽输出(工作模式)
  • 数码管和LED灯不同时亮。通过E3实现:E3 既是反相器输出信号也是数码管的使能信号,当E3=0时,LED灯(共阴极)亮,数码管位选信号的使能信号为0,数码管不亮;反之,数码管亮而LED不亮。

控制它们亮了还不够,我们还需要控制合适的频率,这个时候就需要用到我们的定时器了。

这个定时器经历了两次分频的过程:

第一次:每1ms flag++,加至8(扫描速度够快),控制位选,视觉错觉感觉每一位都亮,也即是实现数码管每一位都显示数字的效果,而具体的显示的数字是多少,在第二次分频中实现

第二次:count++,加至100,数字更新一次,让每一位分开显示(视觉),如果速度很快,眼睛看到的效果是很多个数字重叠显示在一位(无法分辨)

另外还需要用到的一个部分就是按键消抖的过程。

首先,按键消抖分为硬件消抖和软件消抖

 

 

下面是硬件消抖的电路图部分。

当按键未按下时,输出为 1;当键按下时,输出为 0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开 B),只要按键不返回原始状态 A,双稳态电路的状态不改变,输出保持为 0,不会产生抖动的波形。

下面我们主要来说一下软件消抖。

软件消抖有两种方式实现。

一种是使用延时的方式。也就是比如在某一时刻监测到按键按下,延时一段时间,如果发现这个按键仍然处于按下状态,则说明按键是真的按下了,可以继续进行按下这个按键后的继续操作。

另外一种是采用检测多次的方式。假设检测到按下的总次数是 100 次,每检测到一次减一。Key1_count 初始值
0x80+NMAX_KEY/3*2,经 Key1_count--后,小于 0x80 说明次数大于 2/3,按键按下。

猜你喜欢

转载自blog.csdn.net/qq_42372980/article/details/82319047