微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 按键显示数字,按下到弹起期间数码管变暗是什么原因

按键显示数字,按下到弹起期间数码管变暗是什么原因

时间:10-02 整理:3721RD 点击:
P0接LED,P1接矩阵键盘
使用线反转法扫描
代码如下:


  1. uchar num = 0x10;    // 0x10 indicate character H
  2. void keyscan()
  3. {
  4.         uchar key = 0xff;    // no key pressed
  5.         uchar i;

  6.         P1 = 0x0f;
  7.         if(P1 != 0x0f)
  8.         {
  9.                 delay(10);
  10.                 if(P1 != 0x0f)
  11.                 {
  12.                         key = P1;
  13.                         P1 = 0xf0;
  14.                         key += P1;
  15.                 }
  16.         }
  17.         for(i=0;i<16;i++)        // if set i<17;then after release the key,LED will only show H
  18.         {
  19.                 if(key_code[i] == key)
  20.                 {
  21.                         num = i;
  22.                 }
  23.         }
  24. }

  25. void display()
  26. {
  27.         P0 = led_code[num];
  28.         delay(10);
  29.         P0 = 0x00;
  30. }

  31. void main()
  32. {
  33.         while(1)
  34.         {
  35.                 keyscan();
  36.                 display();
  37.         }
  38. }

复制代码



按键没有按下时 数码管也是有轻微亮度变化的 人眼视觉暂留大概是50~200毫秒 有的人长点有的人短点 这多少会影响点视觉敏锐度
程序用的是数码管的静态显示 受视觉暂留影响应该小点
按下按键的时候
if(P1 != 0x0f)
  {
          delay(10);<-------------------------这里确实是为按下时消抖了,10ms也差不多(下降沿已经检查 ,按键按下后是否也要检查稳定了一段时间 上升沿是否也要检查 ,如果不检查,会不会造成这样一种情况,感觉上按了一下,实际上以单片机的速度处理了N下,由于时间太快 数码管供电持续时间不够还没到完全亮又切换状态了 导致看上去亮度发生了变化),
          if(P1 != 0x0f)
...
接下来这段,效率不是很高,
for(i=0;i<16;i++)        
        {
                if(key_code == key)
                {
                     num=i;
                     break;<---------------------这里给num付完值后就可以跳出了,或者在这里直接点数码管,但display()和keyscan()分开写使代码清晰的做法是对的

这是拍的GIF,有点不清晰
变暗的时候就是在按键按下以及释放过程中的效果


会不会是延时时间过长而导致视觉上的闪烁

你按按键的时候比不按按键多执行了
if(P1 != 0x0f)
        {
                delay(10);
                if(P1 != 0x0f)
                {
                        key = P1;
                        P1 = 0xf0;
                        key += P1;
                }
        }
这期间造成了数码管的闪烁

感谢大家的热心帮助和详细解答! ? 我会回去再作修改,多作尝试的

延时调调看看,可能是延时和人眼视觉暂留性引起

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top