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

[复制链接]
2823|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;
                               
                       
                        }

  以上代码,调通了,谢谢楼上各位的赐教~~~
cjseng 发表于 2018-9-2 22:47 | 显示全部楼层
按住按键不放,会不会影响LED?
 楼主| rankey 发表于 2018-9-3 15:30 | 显示全部楼层
cjseng 发表于 2018-9-2 22:47
按住按键不放,会不会影响LED?

程序里做了处理,短按某个键,某个键的锁定值置1,某个按键激活,然后执行对应的功能,在执行功能时,原先的按键扫描函数不执行
   实际板子上测试OK的。不会影响LED
cjseng 发表于 2018-9-3 17:24 | 显示全部楼层
rankey 发表于 2018-9-3 15:30
程序里做了处理,短按某个键,某个键的锁定值置1,某个按键激活,然后执行对应的功能,在执行功能时,原 ...

按键长时间按住不放,相当于给LED回路并联了一个负载,不会影响LED亮度?
 楼主| rankey 发表于 2018-9-4 13:31 | 显示全部楼层
cjseng 发表于 2018-9-3 17:24
按键长时间按住不放,相当于给LED回路并联了一个负载,不会影响LED亮度? ...

呵呵,其实按键和指示灯,在时序上是分开的。什么意思呢?就是按下某个键,对应并联的那一路指示灯,是要熄灭的。
  这样就不会出现你所担心的:按键长时间按住不放,LED亮度受影响。
cjseng 发表于 2018-9-4 16:30 | 显示全部楼层
rankey 发表于 2018-9-4 13:31
呵呵,其实按键和指示灯,在时序上是分开的。什么意思呢?就是按下某个键,对应并联的那一路指示灯,是要 ...

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

评论

你的理解,没错没错  发表于 2018-9-4 19:07
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

181

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部