OpenEdv-开源电子网

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

STM32F103ZE矩阵按键求助(不能判断按键是否松开)

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2018-5-6
在线时间
0 小时
发表于 2018-5-6 17:10:00 | 显示全部楼层 |阅读模式
10金钱
代码如下,Read_KeyValue()函数里面那个等待按键松开的while完全不理我。。就是不管我按键按没按,读取到的值都是最初使设置的值,求助各位大佬们帮我看看呗

#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"


//}
//u8 KEY_Scan(u8 mode)
//{         
//        static u8 key_up=1;//按键按松开标志
//        if(mode)key_up=1;  //支持连按                  
//        if(key_up&&(KEY0==0 || KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0 || KEY5==0 || KEY6==0))
//        {
//                delay_ms(10);//去抖动
//                key_up=0;
//                if(KEY0==KEY3)return 0;
//                else if(KEY1==0)return 1;
//                else if(KEY2==0)return 2;
//                else if(KEY3==0)return 3;
//                else if(KEY4==0)return 4;
//                else if(KEY5==0)return 5;
//                else if(KEY6==0)return 6;
//        }else if(KEY0==1&&KEY1==1&&KEY2==0&&KEY3==0&&KEY4==0&&KEY5==0&&KEY6==0)key_up=1;             
//         return 0;// 无按键按下
//}

//#include <stm32f10x.h>

void KEY_Init(void)
{
                GPIO_InitTypeDef GPIO_InitStruct;
                RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);
                GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//4行
                GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//行推挽输出
                GPIO_Init(GPIOD,&GPIO_InitStruct);
                GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//4列
                GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;//列下拉输入
                GPIO_Init(GPIOD,&GPIO_InitStruct);
                GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//将行置为高电平
                GPIO_ResetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);//将列置为低电平
}
u8 KeyDown(void)
{
        if((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f)
        {
        return 1;
        }
        else return 0;
}


u8 Read_KeyValue(void)   
{
        u8  KeyValue=0;
        u8 temp;


        GPIO_SetBits(GPIOD,GPIO_Pin_0);//将第一行推挽输出为高电平
        GPIO_ResetBits(GPIOD,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//其他行为低电平
        switch(GPIO_ReadInputData(GPIOD)&0xff)
        {
                case 0x11:KeyValue='1';break;
                case 0x21:KeyValue='2';break;
                case 0x41:KeyValue='3';break;
                case 0x81:KeyValue='4';break;
                default: break;
        }
        GPIO_SetBits(GPIOD,GPIO_Pin_1);
        GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
        switch(GPIO_ReadInputData(GPIOD)&0xff)
        {
                case 0x12:KeyValue='5';break;
                case 0x22:KeyValue='6';break;
                case 0x42:KeyValue='7';break;
                case 0x82:KeyValue='8';break;
                default: break;
        }
        GPIO_SetBits(GPIOD,GPIO_Pin_2);
        GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);
        switch(GPIO_ReadInputData(GPIOD)&0xff)
        {
                case 0x14:KeyValue='9';break;
                case 0x24:KeyValue='A';break;
                case 0x44:KeyValue='B';break;
                case 0x84:KeyValue='C';break;
                default: break;
        }
        GPIO_SetBits(GPIOD,GPIO_Pin_3);
        GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
        switch(GPIO_ReadInputData(GPIOD)&0xff)
        {
                case 0x18:KeyValue='D';break;
                case 0x28:KeyValue='E';break;
                case 0x48:KeyValue='F';break;
                case 0x88:KeyValue='G';break;
                default: break;
        }
        GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
        GPIO_ResetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
//        while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);
        while(KeyValue!=0)
        {
                printf("%c",KeyValue);
                //while( KEY4==0 || KEY5==0 || KEY6==0)
        }
        return KeyValue;
}



int ScanKeyBoard(void)
{
        if(KeyDown())
        {
                delay_ms(10);
                if(KeyDown())
                {
                        printf("the key is down!\n");
                        return Read_KeyValue();
                }
                else
                {
                        printf("nothing");
                }
        }
        return 0;
}


按键输入.zip

2.88 MB, 下载次数: 209

这是按键函数的工程

最佳答案

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

不要折腾了, 用我的吧http://www.openedv.com/forum.php?mod=viewthread&tid=277263
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-6 17:10:01 | 显示全部楼层
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2018-5-6
在线时间
0 小时
 楼主| 发表于 2018-5-6 17:10:48 | 显示全部楼层
求助原子哥及各位大佬
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-4-19
在线时间
23 小时
发表于 2018-12-29 22:09:19 | 显示全部楼层
不是把去抖动延时改长点就行了吗,我改成120ms左右就比较按键输出好看了,个人感觉
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-12-30 10:21:58 来自手机 | 显示全部楼层
这种代码就别用了,实际都不能用的
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4942
金钱
4942
注册时间
2017-7-6
在线时间
722 小时
发表于 2019-1-3 09:43:16 | 显示全部楼层
666,又是delay消抖
我是小白,很白很白的小白!!!
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2019-1-3 16:27:06 | 显示全部楼层
我现在都是用定时器或者程序周期写延时函数。delay这种只会让程序死机
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-8-9
在线时间
5 小时
发表于 2019-8-18 21:27:08 | 显示全部楼层
你最后怎么解决de,我的也是无论按键,有没有按下,它都检测不到
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 04:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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