OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12924|回复: 9

求助!!关于键盘扫描

[复制链接]

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
发表于 2011-5-5 18:23:32 | 显示全部楼层 |阅读模式

在做实验2按键输入时,用自己写的程序发现两个LED灯都不亮,代码如下,没有写出的部分与光盘给的代码相同:
(USER文件夹中的test.c)
#include <stmffice:smarttags" />32f10x_lib.h>fficeffice" />

#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;                 

}


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

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-5 19:21:57 | 显示全部楼层
因为你的代码只检测了按下的状况,并没有检测按键松开的状况.所以你按下的时候,由于单片机跑的很快,你按一次按键,可能导致LED反转了很多次,当LED翻转偶数次的时候,你的灯表现就是无反应.只有奇数次有效果.所以你有二分之一的几率让灯听你的话.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-5 19:32:37 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
谢谢原子哥这么快就答复我了,可是这个灯从来都不亮啊,二分之一的几率都没,我怎么按都不亮的。按键松开的状况我写在主函数里了
if(KEY0==0||KEY1==0||KEY2==1)
 i=0;
这样可以只要有键按下,while(i)里面的程序不会执行,在外面大while中循环,不断执行temp=KEY_Scan();,只有松开按键,i的值才会变成1,才能进入第二个while语句输出。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-5 19:36:29 | 显示全部楼层
那也就是说你的i从来都没有为真过.
那你看看PA0和1820 的那个跳线帽是否接上了?如果接上了,io口的默认状态就不对了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-5 19:41:01 | 显示全部楼层
回复【4楼】正点原子:
-------------------------------
i为什么从来都没有为真过呢?              
if(KEY0==1&&KEY1==1&&KEY2==0)// 无按键按下
i=1;
当程序刚下载好以后,是什么键都没有按过的状态,i为赋值为真了呀。。。
PA0和1820 的那个跳线帽没有接上,我用原子哥给的程序运行很正常。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-5 20:07:54 | 显示全部楼层
回复【5楼】casstiel:
-------------------------------
你说你的灯从来都没亮过.所以我判断是没有进入while(i)循环.
不过看你的代码,其他地方好像也没有错误.
看看是不是初始化那些地方,你改动了?按键和LED的初始化.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-5 20:09:01 | 显示全部楼层
 if(KEY0==0||KEY1==0||KEY2==1)

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

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-5 21:48:27 | 显示全部楼层
回复【7楼】正点原子:
-------------------------------
改过了,还是老样子,按键怎么按都没反应,灯一个都不亮,其他底层的驱动我都是抄你写的,应该不会有错的吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-5-5 22:50:46 | 显示全部楼层
如果照抄我的,应该是不会有错的.
有个办法,你可以软件仿真测试一下.
用鼠标设置IO的状态,来看执行结果.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-5-5
在线时间
0 小时
 楼主| 发表于 2011-5-6 19:50:06 | 显示全部楼层
回复【9楼】正点原子:
-------------------------------
谢谢原子大哥,我搞出来了,我把KEY_scan子函数删掉了,把主函数改了写成这个样子了,貌似这个不关也不要紧嘛JTAG_Set(JTAG_SWD_DISABLE);

#include <stmffice:smarttags" />32f10x_lib.h>fficeffice" />

#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);

       }     

}

 

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表