OpenEdv-开源电子网

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

刚买的战舰v3,自己练习键盘输入编程遇到问题,

[复制链接]

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
发表于 2016-8-8 20:09:23 | 显示全部楼层 |阅读模式
7金钱
本帖最后由 用户名 于 2016-8-9 11:59 编辑

11111.JPG
下面三个按键外部都是接地的,我IO口设置的也是上拉输入,默认应该是输入高电平的,只有键盘按下时,输入才为低电平,可是导入程序发现三个按键一直是低电平,(按或不按,三个IO口都是低电平),于是就一直返回“if”语句的return (1),
今天看了一下午,实在找不到原因?求助各位网友

main.JPG
捕获.JPG

最佳答案

查看完整内容[请看2#楼]

这下完美解决了, 应该把“Key_Yes = 0; ”放在“return 1”前面的。 前面一直都没学用调试工具,用了之后查看变量值,立马就找到了。 之前一直死盯程序找原因,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-8 20:09:24 | 显示全部楼层
这下完美解决了,
应该把“Key_Yes  = 0;  ”放在“return 1”前面的。
前面一直都没学用调试工具,用了之后查看变量值,立马就找到了。
之前一直死盯程序找原因,
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-8 20:20:52 | 显示全部楼层
上面的问题写错了,是“都只返回”if“里的,不返回”else if“里的
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-8 20:36:56 | 显示全部楼层
我把 (Key_Buzzer == 0)return(2);
          (Key_All == 0) return()3;
放到 if语句 下面,然后不管按不按都一直返回2或3.
这三个开关外部都是接地的,我都设置为上拉输入模式。
究竟是哪里错了?
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-9 10:25:46 | 显示全部楼层
有人在吗?
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-9 12:03:01 | 显示全部楼层
这是键盘扫描程序,求解,下面三个按键按或不按一直等于0
void Key_Init(void)
{
        RCC->APB2ENR |= 1<<6;        //设置E组端口使能
        RCC->APB2ENR |= 1<<2;        //设置A组端口使能
       
        GPIOA->CRL &= 0xfffffff0;        //清除A0口模式
        GPIOA->CRL |= 0x00000008;        //设置A0口为上下拉输入模式(默认下拉)
       
        GPIOE->CRL &= 0xfff000ff;        //清除E2.3.4口模式
        GPIOE->CRL |= 0x00088800;        //设置E2.3.4口为上下拉输入模式
        GPIOE->ODR |= 0x00011100;        //设置为上拉;
}

u8 Key_ModeChoices(void)
{
        static u8 mode = 1;                //定义按键模式变量
        static u8 Key_Mode_up = 1;               
        if (Key_Mode && Key_Mode_up)        //检测mode按键按下
        {
                delay_ms(15);                //延时消抖
                if (Key_Mode)                //确认按键真正被按下
                {
                        mode = ~mode;   //切换按键模式
                        Led = 1;                //初始化Led灯为灭
                        Buzzer = 0;                //初始化蜂鸣器不叫
                        Key_Mode_up = 0;                //下次扫面时,不满足if条件,也不满足else if 条件,mode值只变一次,防止长按按键时,连续变化
                }
        }
        else if (Key_Mode ==0)         //当按键真正松开时
        {
                Key_Mode_up = 1;         //当按键真正松开后,才能继续操作mode按键,改变mode值
        }
        return (mode);
}

u8 Key_Return(u8 Key_ModeChoices)
{
        static u8 Key_Up = 1;                                //模拟按键按下变量
        if (Key_ModeChoices) Key_Up = 1;        //如果为模式1,那么每次扫描程序时,都会进入下面的if语句,一直有返回值,当为模式0时,如上段所示
        if (Key_Up && (Key_Led==0 || Key_Buzzer==0 || Key_All==0))        //如果按键按下
        {
                delay_ms(15);                                                //延时消抖
                if (Key_Led==0) return(1);                        //确认是那个按键被按下
                else if (Key_Buzzer==0) return(2);
                else if (Key_All==0) return(3);
                Key_Up = 0;                               
        }
        else if (Key_Led==1 && Key_Buzzer==1 && Key_All==1)                //按键松手检测
        {
                Key_Up = 1;
        }
        return (0);
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-9 23:40:22 | 显示全部楼层
帮顶
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 08:15:16 | 显示全部楼层

原子哥,能帮我看看哪里有问题吗,实在找不出原因了,好像下三个按键按或不按一直是输入的低电平,我设置的是上拉输入
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 15:38:05 | 显示全部楼层

已经解决了,谢谢帮顶
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 18:55:07 | 显示全部楼层
#include "stm32f10x.h"
#include "key.h"
#include "delay.h"

void Key_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;        //定义IO口模式结构体
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //使能PA端口
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);        //使能PE端口
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //设置为下拉输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        //设置位0口
        GPIO_Init(GPIOA,&GPIO_InitStructure);        //将PA0口设置为以上模式
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //设置为上拉模式
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;                //设置位2,3,4口       
        GPIO_Init(GPIOE,&GPIO_InitStructure);        //设置PE2,3,4口为以上模式
}       

u8 Key_Mode (void)                        //按键模式选择
{
        static u8 Key_No = 1;                //是否允许键盘长按连续输入变量
        static u8 modeChoose = 1;       //键盘模式1
        if (Key_Up && Key_No)                //键盘按下
        {
                delay_ms(15);                //延时消抖
                if (Key_Up)                //确认键盘确实被按下
                {
                        modeChoose = ~modeChoose;        //变化模式
                        Key_No = 0;                        //长按时,下次下次扫描键盘时将不会进入“if”语句,防止模式连续转变
                }
        }
        else if (Key_Up == 0)              //确认键盘已松手
                Key_No = 1;                   //允许进入“if”语句,改变mode
        return (modeChoose);
}

u8 Key_Scan (u8 mode)                          //按键扫面,由主函数赋值mode
{   
        static u8 Key_Yes = 1;                  //允许长按键盘
        if (mode)        Key_Yes = 1;             //当键盘模式为1时,长按键盘可以一直进入“if”语句中,一直有返回值
        if (Key_Yes && (Key0==0 || Key1==0 || Key2==0))     //按下按键
        {
                delay_ms(10);                                //延时消抖                       
                if (Key0 == 0)  return (1);
                else if (Key1 == 0)  return (2);
                else if (Key2 == 0)  return (3);         //判断哪个按键被按下,并返回对应的值
                Key_Yes  = 0;       
               
        }
        else if (Key0==1 && Key1==1 && Key2==1)                //检测松手
        {
                Key_Yes = 1;                            //允许下次按下键盘
        }
        return(0);
}
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 18:58:34 | 显示全部楼层
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "buzzer.h"
#include "key.h"

int main (void)
{
        u8 mode;
        u8 key = 0;
        delay_init ();
        Led_Init ();
        Buzzer_Init ();
        Key_Init ();

        while (1)
        {
                mode = Key_Mode()&0x01;
                key = Key_Scan(mode);
                Led_Red = mode;
                if(mode)                    //模式1:长按可连续输入模式
                {
                        switch (key)
                        {
                                case 0ed_Green = 1; Buzzer = 0; break;
                                case 1ed_Green = 0;break;
                                case 2ed_Green = 0; Buzzer = 1; break;
                                case 3:Buzzer = 1; break;               
                        }
                }
                else                           //模式2:长按只有效一次
                {
                        switch (key)
                        {
                                case 1ed_Green = !Led_Green; break;
                                case 2ed_Green = !Led_Green; Buzzer = !Buzzer; break;
                                case 3:Buzzer = !Buzzer; break;                       
                        }                       
                }
        }
}
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 19:11:00 | 显示全部楼层
楼上乱码啦,写的是 “Led_Green“
现在重写的程序已经能”正常”“运行了,
但是在模式2下,(按一次键盘,led灯翻转一次)。键盘很不灵敏,有时候要按很多次才能翻转,(并且在一直按者的情况下一直是亮的)。
回复

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 19:14:19 | 显示全部楼层

RE: 刚买的战舰v3,键盘程序,按键不灵敏(程序在9楼和10楼)

现在重写的程序已经能”正常”“运行了,
但是在模式2下,(按一次键盘,led灯翻转一次)。键盘很不灵敏,有时候要按很多次才能翻转,(并且在一直按者的情况下一直是亮的)。何解?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-10 20:27:56 | 显示全部楼层
用户名 发表于 2016-8-10 19:14
现在重写的程序已经能”正常”“运行了,
但是在模式2下,(按一次键盘,led灯翻转一次)。键盘很不灵敏, ...

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

使用道具 举报

4

主题

30

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-8-8
在线时间
15 小时
 楼主| 发表于 2016-8-10 22:30:46 | 显示全部楼层
正点原子 发表于 2016-8-10 20:27
下次就知道找问题了。

用了调试工具,已经完全可以了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 22:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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