打印

当按键与LED灯这种接法,按键扫描函数如何处理?

[复制链接]
2339|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rankey|  楼主 | 2018-8-10 14:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
liufabing| | 2018-8-11 13:22 | 只看该作者
SEG1,SEG2是否有下拉电阻?
当有下拉电阻用
分时复用
扫描按键时COM输出高,SEG1,SEG2下拉输入,读到高认为按键按下.
扫描灯时,SEG1或SEG2对应的LED要点亮时输出高,否则为输入状态,COM输出低.

使用特权

评论回复
板凳
jackyhuang1988| | 2018-8-13 11:43 | 只看该作者
复用嘛,这个简单。记住一点,检测按检状态只是瞬间,几微秒而已,不会影响灯的显示。
平时,把COM配置成输出,低电平,SEG配置成输出,这样通过SEG可以控制灯的亮灭。
检测按键时(我通常的做法是10毫秒检测一次),检测前,将COM输出高电平,将SEG配置成输入,下拉,读取SEG状态。此过程只是几微秒。做好后,就回到亮灯状态。
按键检测前最好保存亮灯状态,检测后重新输出亮灯状态。

注意,按键检测只是10毫秒检测一次,检测一次的时间是几微秒。按检测还要利用多次检测的结果做消抖。

使用特权

评论回复
地板
rankey|  楼主 | 2018-8-30 10:16 | 只看该作者
  K1按键扫描                        
                      com=1;
                       P3IO = 0xFD;            // 设置为输入模式 direction
                       LED2=0;          // 下拉

              if((K1&0x01)==0x01)    //检测到有按下,被拉高   
                {
                            com=0;
                            P3IO = 0xFF;            // direction
                            P3PU = 0x00;            // pullup
                            LED2|=LED2_flag;  
                         if(K1_count<0xff)    //防止溢出
                         {
                                  K1_count++;       
          if(K1_count>=3)   //判定K1有效短按,执行取消功能
。。。
。。。
K2的按键扫描
          com=1;  
            P3IO = 0xFE;                 // direction 设为输入模式
           LED1=0;               //设置为下拉,即平时为低电平。
            nop;
            nop;
            nop;
           if((K2&0x01)==0x01)   
            {
                                 P3IO = 0xFF;              // direction 设为输出模式
                                 P3PU = 0x00;             // 无上拉模式,pullup
                                 com=0x00;
         LED1=1;
                               
         K2_T1_startflag=1;          //定时标志变量,开启定时                       
                                                                  
                        }
                         else if((K2&0x01)==0x00)
                        {
                               
                           P3IO = 0xFF;            // direction
                                 P3PU = 0x00;            // pullup
                                 com=0x00;
         LED1=1;
         LED2|=LED2_flag;       
                                 K2_T1_startflag=0;
                                 K2_count=0;
                               
                       
                        }

  以上代码,调通了,谢谢楼上各位的赐教~~~

使用特权

评论回复
5
cjseng| | 2018-9-2 22:47 | 只看该作者
按住按键不放,会不会影响LED?

使用特权

评论回复
6
rankey|  楼主 | 2018-9-3 15:30 | 只看该作者
cjseng 发表于 2018-9-2 22:47
按住按键不放,会不会影响LED?

程序里做了处理,短按某个键,某个键的锁定值置1,某个按键激活,然后执行对应的功能,在执行功能时,原先的按键扫描函数不执行
   实际板子上测试OK的。不会影响LED

使用特权

评论回复
7
cjseng| | 2018-9-3 17:24 | 只看该作者
rankey 发表于 2018-9-3 15:30
程序里做了处理,短按某个键,某个键的锁定值置1,某个按键激活,然后执行对应的功能,在执行功能时,原 ...

按键长时间按住不放,相当于给LED回路并联了一个负载,不会影响LED亮度?

使用特权

评论回复
8
rankey|  楼主 | 2018-9-4 13:31 | 只看该作者
cjseng 发表于 2018-9-3 17:24
按键长时间按住不放,相当于给LED回路并联了一个负载,不会影响LED亮度? ...

呵呵,其实按键和指示灯,在时序上是分开的。什么意思呢?就是按下某个键,对应并联的那一路指示灯,是要熄灭的。
  这样就不会出现你所担心的:按键长时间按住不放,LED亮度受影响。

使用特权

评论回复
9
cjseng| | 2018-9-4 16:30 | 只看该作者
rankey 发表于 2018-9-4 13:31
呵呵,其实按键和指示灯,在时序上是分开的。什么意思呢?就是按下某个键,对应并联的那一路指示灯,是要 ...

时序上分开我理解的,是不是功能上也分开的?如果功能上就是这样设计的:按下按键,并联的那个灯就熄灭,按键保持多长时间,灯就灭多长时间。这样就没问题了。

使用特权

评论回复
评论
rankey 2018-9-4 19:07 回复TA
你的理解,没错没错 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

181

帖子

4

粉丝