发新帖我要提问
12
返回列表
打印

4键控制LED0~7为何总不行 小白求好人指教

[复制链接]
楼主: STM29
手机看帖
扫描二维码
随时随地手机跟帖
21
dream_yi| | 2013-5-15 00:05 | 只看该作者 回帖奖励 |倒序浏览
  赋值在while()下方,这怎么能跳出来呢?
上方

使用特权

评论回复
22
艺术家58| | 2013-5-15 00:48 | 只看该作者
本帖最后由 艺术家58 于 2013-5-15 00:51 编辑

下面的程序没调试过,应该能行。
u8 KEY_Scan(void)
{         
        static u8 key_up=1;//可以读取按键状态标志
        u8 ide=0,key_toggle;
        key_toggle=KEY0;        //KEY0没有按下,可以扫描KEY1~3按键状态并置返回值的相应位
           
    while(key_toggle)      /*因为初始话 让他们KEY值都为1,然后用KEY0来控制其他三个KEY的输入输出
                              刚开始key_toggle==1 KEY1~3输入  如果按次KEY0(KEY==0)这是输出ide
                           */
{
      if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3 ==0))
          {
                delay_ms(10);//去抖动
                if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3 ==0))
                {
                         if(KEY3==0)
                         {
                            ide=ide | 0x04;         //置返回值的第2位KEY3为第三位,KEY2为第二位,KEY1为第一位
                         }
                         else if(KEY2==0)                        
                         {
                            ide=ide | 0x02;         // 置返回值的第1位     
                         }
                         else if(KEY1==0)                        
                         {
                            ide=ide | 0x01;                // 置返回值的第0位              //这样ide就有KEY1~3的状态值
                         }                                       //这样就能实现八个灯的值
                         else if(KEY0==0)                        //这时看是否按下KEY0退出按键扫描程序
                         {
                            key_toggle=0;key_up=0;         //退出循环,不再读按键状态,其实key_up可以不用
                         }
                }                 
          }
          else
           {  key_up=1; }            
    }
   return ide;                                                           
}

使用特权

评论回复
23
grasswolfs| | 2013-5-15 10:53 | 只看该作者
STM29 发表于 2013-5-14 21:12
刚开始 因为初始化了嘛 然后就认为KEY0是=1 然后 KEY0不动  按下KEY1.2.3 然后后面就跟您说的一样   ...

个人感觉还是要理清思路再写代码,不要直接就上

使用特权

评论回复
24
STM29|  楼主 | 2013-5-15 10:54 | 只看该作者
dream_yi 发表于 2013-5-15 00:04
很……的程序:1.按键消抖
                                     if(key_up&&(KEY0==0||KEY1==0||KEY2==0| ...


1 .key_toggle=KEY0 这个消抖我不懂 我就if后有个delay_ms(10);//去抖动其他消抖还不会应用。
2.因为初始化完之后KEY0=1 然后这是可以输入KEY1~3 让他们跳出while() 按次KEY0 这时=0,然后跳出循环。
3.我现在的水平是觉得上面的没问题  如果按下其中一个 想法是这样的
    KEY 3 2 1
LED7   1 1 1
LED6   1 1 0
LED5   1 0 1
……  然后下载进去没反应 不知道哪里不对。   

使用特权

评论回复
25
STM29|  楼主 | 2013-5-15 11:00 | 只看该作者
grasswolfs 发表于 2013-5-15 10:53
个人感觉还是要理清思路再写代码,不要直接就上

谢谢哥您的建议 思路是有了 刚接触这个芯片 然后这个是按键输入的 不是那种拨码开关 编码思路就顺着拨码的 按键输入之间有矛盾没考虑进去 想不出更好的办法解决。  

使用特权

评论回复
26
STM29|  楼主 | 2013-5-15 11:03 | 只看该作者
dream_yi 发表于 2013-5-15 00:05
赋值在while()下方,这怎么能跳出来呢?
上方

好像是 他往下执行了 然后一直在while里面跑着 即使按下KEY0 让KEY=0 他也是跑不出来 22# 那里帮我加了一句else if 让KEY0=0 这样应该就能跑出去了 我编译看看 谢谢哥

使用特权

评论回复
27
STM29|  楼主 | 2013-5-15 11:12 | 只看该作者
艺术家58 发表于 2013-5-15 00:48
下面的程序没调试过,应该能行。
u8 KEY_Scan(void)
{         

哥 main()里面要不要修改什么?

使用特权

评论回复
28
grasswolfs| | 2013-5-15 14:04 | 只看该作者
STM29 发表于 2013-5-15 11:00
谢谢哥您的建议 思路是有了 刚接触这个芯片 然后这个是按键输入的 不是那种拨码开关 编码思路 ...

如果方便的话,可以先多看一些例程再上手,磨刀不误砍柴工的

使用特权

评论回复
29
STM29|  楼主 | 2013-5-15 23:07 | 只看该作者
grasswolfs 发表于 2013-5-15 14:04
如果方便的话,可以先多看一些例程再上手,磨刀不误砍柴工的

好的 谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则