打印
[开发工具]

关于键盘扫描

[复制链接]
620|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是MT|  楼主 | 2015-4-21 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在做实验2按键输入时,用自己写的程序发现两个LED灯都不亮,代码如下,没有写出的部分与光盘给的代码相同:
(USER文件夹中的test.c)
#include <stm32f10x_lib.h>
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "key.h"
int main(void)
{
       u8 temp;
       u8 i;
       Stm32_Clock_Init(9);
       delay_init(72);
       LED_Init();                //初始化与LED连接的硬件接口
       KEY_Init();
      
       while(1)
       {
              temp=KEY_Scan();//得到键值
              if(KEY0==1&&KEY1==1&&KEY2==0)// 无按键按下
              i=1;
            while(i)
              {
                     if(temp)
                     {                                          
                            switch(temp)
                            {                          
                                   case 1:
                                          LED0=!LED0;
                                          break;
                                   case 2:
                                          LED1=!LED1;
                                          break;
                                   case 3:                       
                                          LED0=!LED0;
                                          LED1=!LED1;
                                          break;
                            }
                     }
                     else
                     {
                            delay_ms(10);
                     }
                     temp=0;
                     if(KEY0==0||KEY1==0||KEY2==1)
                            i=0;
            
              }
       }     
}

(HAREWARE文件夹中的key.c)
u8 KEY_Scan(void)
{     
       JTAG_Set(JTAG_SWD_DISABLE);
       if(KEY0==0||KEY1==0||KEY2==1)
       {
               delay_ms(10);//去抖动
               
               if(KEY0==0)
                     {
                                   JTAG_Set(SWD_ENABLE);
                                   return 1;
                     }
            
               if(KEY1==0)
                     {
                                   JTAG_Set(SWD_ENABLE);
                                   return 2;
                     }
                                         
               if(KEY2==1)
                     {
                                   JTAG_Set(SWD_ENABLE);
                                   return 3;
                     }
       }
      
       else
               JTAG_Set(SWD_ENABLE);                     
               return 0;                 
}

求原子大哥正解,小弟不胜感谢!!!

沙发
我思故我在12345| | 2015-4-21 22:43 | 只看该作者
因为你的代码只检测了按下的状况,并没有检测按键松开的状况.所以你按下的时候,由于单片机跑的很快,你按一次按键,可能导致LED反转了很多次,当LED翻转偶数次的时候,你的灯表现就是无反应.只有奇数次有效果.所以你有二分之一的几率让灯听你的话.

使用特权

评论回复
板凳
我是MT|  楼主 | 2015-4-21 22:43 | 只看该作者
我思故我在12345 发表于 2015-4-21 22:43
因为你的代码只检测了按下的状况,并没有检测按键松开的状况.所以你按下的时候,由于单片机跑的很快,你按一次 ...

谢谢这么快就答复我了,可是这个灯从来都不亮啊,二分之一的几率都没,我怎么按都不亮的。按键松开的状况我写在主函数里了
if(KEY0==0||KEY1==0||KEY2==1)
i=0;
这样可以只要有键按下,while(i)里面的程序不会执行,在外面大while中循环,不断执行temp=KEY_Scan();,只有松开按键,i的值才会变成1,才能进入第二个while语句输出。

使用特权

评论回复
地板
我思故我在12345| | 2015-4-21 22:54 | 只看该作者
我是MT 发表于 2015-4-21 22:43
谢谢这么快就答复我了,可是这个灯从来都不亮啊,二分之一的几率都没,我怎么按都不亮的。按键松开的状况 ...

那也就是说你的i从来都没有为真过.
那你看看PA0和1820 的那个跳线帽是否接上了?如果接上了,io口的默认状态就不对了.

使用特权

评论回复
5
我是MT|  楼主 | 2015-4-21 22:55 | 只看该作者
i为什么从来都没有为真过呢?               
if(KEY0==1&&KEY1==1&&KEY2==0)// 无按键按下
i=1;
当程序刚下载好以后,是什么键都没有按过的状态,i为赋值为真了呀。。。
PA0和1820 的那个跳线帽没有接上,我用原子哥给的程序运行很正常

使用特权

评论回复
6
我思故我在12345| | 2015-4-21 22:55 | 只看该作者
我是MT 发表于 2015-4-21 22:55
i为什么从来都没有为真过呢?               
if(KEY0==1&&KEY1==1&&KEY2==0)// 无按键按下
i=1;

你说你的灯从来都没亮过.所以我判断是没有进入while(i)循环.
不过看你的代码,其他地方好像也没有错误.
看看是不是初始化那些地方,你改动了?按键和LED的初始化.

使用特权

评论回复
7
我思故我在12345| | 2015-4-21 22:55 | 只看该作者
我是MT 发表于 2015-4-21 22:55
i为什么从来都没有为真过呢?               
if(KEY0==1&&KEY1==1&&KEY2==0)// 无按键按下
i=1;

f(KEY0==0||KEY1==0||KEY2==1)

                            i=0;
改为:
i=0;
去掉对 if(KEY0==0||KEY1==0||KEY2==1)的判断.

使用特权

评论回复
8
我是MT|  楼主 | 2015-4-21 22:56 | 只看该作者
我思故我在12345 发表于 2015-4-21 22:55
f(KEY0==0||KEY1==0||KEY2==1)

                            i=0;

改过了,还是老样子,按键怎么按都没反应,灯一个都不亮,其他底层的驱动我都是抄你写的,应该不会有错的吧

使用特权

评论回复
9
我思故我在12345| | 2015-4-21 22:56 | 只看该作者
我是MT 发表于 2015-4-21 22:56
改过了,还是老样子,按键怎么按都没反应,灯一个都不亮,其他底层的驱动我都是抄你写的,应该不会有错的 ...

如果照抄我的,应该是不会有错的.
有个办法,你可以软件仿真测试一下.
用鼠标设置IO的状态,来看执行结果.

使用特权

评论回复
10
我是MT|  楼主 | 2015-4-21 22:57 | 只看该作者
我搞出来了,我把KEY_scan子函数删掉了,把主函数改了写成这个样子了,貌似这个不关也不要紧嘛JTAG_Set(JTAG_SWD_DISABLE);
#include <stm32f10x_lib.h>
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "key.h"


int main(void)
{
       u8 i;
       Stm32_Clock_Init(9); //系统时钟设置
       delay_init(72);         //延时初始化
       LED_Init();                //初始化与LED连接的硬件接口
       KEY_Init();          //初始化与按键连接的硬件接口
       while(1)
       {
              i=1;
              if(KEY0==0||KEY1==0||KEY2==1)
              {
                    delay_ms(10);
                    if(KEY0==0||KEY1==0||KEY2==1)
                     {
                             if(KEY0==0)
                                   LED0=!LED0;
      
                             if(KEY1==0)
                                   LED1=!LED1;
                    
                             if(KEY2==1)
                                          {
                                                 LED0=!LED0;
                                                 LED1=!LED1;
                                          }
                             while(i)
                                   {
                                          if(KEY0==1&&KEY1==1&&KEY2==0)
                                          i=0;
                                   }
                     }
              }
              else
              delay_ms(10);
       }     
}

使用特权

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

本版积分规则

28

主题

278

帖子

1

粉丝