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

2019-07-21 06:11发布

代码如下,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! ");
                        return Read_KeyValue();
                }
                else
                {
                        printf("nothing");
                }
        }
        return 0;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
warship
1楼-- · 2019-07-21 06:18
SKY112233
2楼-- · 2019-07-21 06:25
求助原子哥及各位大佬
xie123
3楼-- · 2019-07-21 07:38
不是把去抖动延时改长点就行了吗,我改成120ms左右就比较按键输出好看了,个人感觉
yklstudent
4楼-- · 2019-07-21 11:52
这种代码就别用了,实际都不能用的
程功之道
5楼-- · 2019-07-21 16:40
 精彩回答 2  元偷偷看……
323232
6楼-- · 2019-07-21 17:01
我现在都是用定时器或者程序周期写延时函数。delay这种只会让程序死机

一周热门 更多>